모든 저작권은 <생활코딩>의 생산자인 <egoing>님에게 있습니다.
문제시, 비공개로 전환하겠습니다.
<객체지향>
객체지향 프로그래밍은 크고 견고한 프로그램을 만들기 위한 노력의 산물이다.
객체지향이라는 큰 흐름은 현대적 프로그래밍 언어들을 지배하고 있는 가장 중요한 맥락이라고 할 수 있다.
하지만 자바스크립트의 객체지향은 다른 언어들의 객체지향과 사뭇 다르다.
특히 Java나 C++과 같은 주류 객체지향 언어에 익숙한 독자라면 극심한 혼란을 경험할 수도 있다.
바로 이러한 특성 때문에 웃으면서 들어갔다가 울면서 나오게 된다.
하지만 최소한 주류가 된 언어라면 그 언어가 추구한 나름대로의 지향점이 있을 것이다.
그 지향점에 대해서 이해하고 언어를 대한다면 훨씬 더 즐겁게 언어를 음미할 수 있을 것이다.
특히 모든 처리의 중심에 함수를 두는 자바스크립트를 공부하다 보면 객체지향을 이렇게도 추구 할수도 있는 거구나 하는 놀라움을 느낄 수 있다.
객체지향 프로그래밍(Object-Oriented Programming)은 좀 더 나은 프로그램을 만들기 위한 프로그래밍 패러다임으로
위의 그림은 런던의 지도다. 여러분이 지하철을 이용한다면 어떤 지도를 선호할까? 오른쪽 하단의 지도를 선호할 것이다. 왼쪽 상단의 지도는 현실의 복잡함을 나타낸다. 오른쪽 하단의 지도는 지하철 탑승자의 관심사만을 반영하고 있다. 역 간의 거리나 실제 위치와 같은 요소들은 모두 배제하고 있다. 복잡함 속에서 필요한 관점만을 추출하는 행위를 추상화라고 한다. 지하철 노선도가 디자인의 추상화라고 한다면 프로그램을 만든다는 것은 소프트웨어의 추상화라고 할 수 있다. 객체 지향 프로그래밍은 좀 더 현실을 잘 반영하기 위한 노력의 산물이다. 이것은 단순히 객체 지향의 문법을 이용해서 객체를 만든다고 달성되는 것이 아니다. 고도의 추상화 능력이 필요하다. 객체지향의 설계 원칙이나 객체 지향의 철학적인 의미는 대단히 중요하다. 하지만 이러한 것들을 지금 언급한다면 여러분은 미궁 속에 빠지게 될 것이다. 그래서 필자가 제안하는 것은 일단은 지식부터 익히자는 것이다. 언어가 지원하는 객체지향 문법을 배우고, 이것들이 어떻게 동작하는지를 충분히 이해한 다음에 비로소 설계 원칙도 이야기할 수 있고, 객체와 사물의 비유도 시도해 볼 수 있을 것이다. 여기서는 몇 가지 객체지향이 추구하는 지향점을 가볍게 이야기하고 다음 토픽부터 구체적인 문법을 알아볼 것이다. 본체와 모니터와 키보드가 하나로 단일화되어 있다. 이것의 문제점은 분명하다. 모니터가 고장 나면 컴퓨터를 바꿔야 한다. 키보드가 고장 나도 컴퓨터를 교체해야 한다. 그래서 위와 같이 모니터와 본체와 컴퓨터를 분리했다. 다시 말해서 부품화 시킨 것이다. 기능들을 부품화 시킨 덕분에 소비자들은 더 좋은 키보드나 저렴한 모니터를 선택할 수 있게 되었다. 또 문제가 생겼을 때 그 문제가 어디에서 발생한 것인지 파악하고 해결하기가 훨씬 쉬워진다. 위의 그림에서 모니터와 키보드 그리고 본체를 분리하는 기준은 무엇일까? 그 기준을 세우는 것이 추상화일 것이다. 위 제품의 기획자는 컴퓨터를 입력과 출력 그리고 연산 & 저장으로 분류하고 있다. 이 분류에 따라서 부품들을 모으고 분리해서 모니터, 키보드, 본체와 마우스라는 개별적인 완제품을 만들고 있다. 이 완제품들을 부품으로 조합하면 컴퓨터라는 하나의 완제품이 만들어진다. 하지만 어떤것이 더좋은 것인지는 모른다. 부품화가 중요한 것임에는 분명하지만 그 보다 중요한 것은 적절함이다. 그래서 설계가 어려운 것이다. 객체 지향은 부품화의 정점이라고 할 수 있다. 하지만 우리는 아직 객체 지향을 배우지 않았다. 그래서 우리가 배운 것 중에서 부품화의 특성을 보여줄 수 있는 기능을 생각해보면 좋을 것 같다. 메소드는 부품화의 예라고 할 수 있다. 메소드를 사용하는 기본 취지는 연관되어 있는 로직들을 결합해서 메소드라는 완제품을 만드는 것이다. 그리고 이 메소드들을 부품으로 해서 하나의 완제품인 독립된 프로그램을 만드는 것이다. 메소드를 사용하면 코드의 양을 극적으로 줄일 수 있고, 메소드 별로 기능이 분류되어 있기 때문에 필요한 코드를 찾기도 쉽고 문제의 진단도 빨라진다. 컴퓨터와 모니터를 만드는 업체들은 위와 같은 케이블의 규격을 공유한다. 모니터 입장에서는 컴퓨터가, 컴퓨터 입장에서는 모니터가 어떤 식으로 만들어졌는지는 신경쓰지 않는다. 각각의 부품은 미리 정해진 약속에 따라서 신호를 입, 출력하고, 연결점의 모양을 표준에 맞게 만들면 된다. 이러한 연결점을 인터페이스(interface)라고 한다. 위의 그림을 보면 HDMI 케이블의 연결점은 특유의 생김새가 있다. 만약 HDMI 케이블을 랜선을 연결하는 구멍에 연결하려고 한다면 어떻게 될까? 동작하지 않을 뿐 아니라 연결 자체가 되지 않는다. 인터페이스란 이질적인 것들이 결합하는 것을 막아주는 역할도 하는 것이다. 즉 인터페이스는 부품들 간의 약속이다. 이러한 약속을 프로그래밍적으로는 어떻게 구현하는가도 살펴본다. |
2. 생성자와 new
JavaScript는 Prototype based programming에 속해있다.
전통적인 함수언어의 특징을 가지고 있는 것이 아니고 객체지향 프로그램 + 함수 언어의 특징이 Mix되었다.
C++/Java는 규제를 통해 프로그래밍의 정확성을 확보한 반면
JavaScript는 보다 자유로운 정의가 가능하다. (나름의 목표와 Vision이 있다.)
객체지향 프로그래밍은 연관되어있는 변수와 메소드를 하나의 객체에 grouping, categorization 하는 것이다.
객체지향은 좋은 로직을 만드는 것이다.
객체 var person = {} // -> 비어있는 객체 (object)를 만드는 것. person.name = 'egoing'; // 객체를 담고있는 변수에 . 을 찍고 이 그릇안에 name이라는 변수를 담는 것. 객체에 담겨있는 변수 = 속성(프로퍼티) person.introduce = function(){ // 객체에 담긴 또다른 프로퍼티 introduce. 프로퍼티에 함수가 담겨있다. 그때, 프로퍼티에 담겨있는 함수=메소드 return 'My name is '+this.name; //여기서 this는 바로 function()이 속해있는 객체 person의 {}의 name을 가리킨다. } document.write(person.introduce()); // 객체를 만드는 과정에 분산되어 있다. 객체를 정의 할 때 값을 셋팅하도록 코드를 바꿔보자. var person = { 'name' : 'egoing', 'introduce' : function(){ return 'My name is '+this.name; } } document.write(person.introduce()); 만약 다른 사람의 이름을 담을 객체가 필요하다면 객체의 정의를 반복해야 할 것이다. var person 1 = { 'name' : 'egoing', } var person 2 = { } } 생성자 new 함수()의 리턴값은 객체 {} 가된다. function Person(){} var p = new Person(); p.name = 'egoing'; p.introduce = function(){ return 'My name is '+this.name; } document.write(p.introduce()); --- function Person(){} var p1 = new Person(); p1.name = 'egoing'; p1.introduce = function(){ return 'My name is '+this.name; } document.write(p1.introduce()+"<br />"); var p2 = new Person(); p2.name = 'leezche'; p2.introduce = function(){ return 'My name is '+this.name; } document.write(p2.introduce()); 별로 개선된 것이 없다. function Person(name){ this.name = name; this.introduce = function(){ return 'My name is '+this.name; } } var p1 = new Person('egoing'); document.write(p1.introduce()+"<br />"); var p2 = new Person('leezche'); document.write(p2.introduce());
|
전역객체란? function func(){ alert('Hello?'); } func(); window.func(); // window가 객체이며 점 뒤의 func()은 속성이다. 근데 이 속성에 함수가 왔으므로 메소드이다. func()함수는 사실 func();와 window.func();는 모두 실행이 된다. alert('Hello?'); }} o.func(); window.o.func(); 자바스크립트에서 모든 객체는 기본적으로 전역객체의 프로퍼티이다. 전역객체API |
this는 함수 내에서 함수 호출 맥락(context)를 의미한다.
function func(){ if(window === this){ document.write("window === this"); } } func(); 결과는 window === this var o = { func : function(){ //변수 o의 프로퍼티가 function() 함수이기 때문에 메소드이다. if(o === this){ document.write("o === this"); } } } o.func(); |
댓글