본문 바로가기

카테고리 없음

1장 객체란.


객체지향 프로그래밍에 대한 기본 원리 (엘렌 케이)
 1. 모든 것이 객체다 : 객체를 변수로 생각하자.
 2. 프로그램은 여러가지 객체들로 구성되고, 각 객체들은 상호간에 메시지를 보내어 일을 수행한다 : 
    객체에게 일을 요청하려면 메시지를 보낸다.
 3. 각 객체는 다른 객체들로 이루어진 자신의 메모리를 갖는다 :
    기존 객체들을 포함시켜 새로운 종류의 객체를 만든다.
  4 .모든 캑체는 자신의 타입이 있다. : 객체는 클래스의 인스턴스이다. 클래스는 타입이다.
  5. 특정 타입에 속하는 모든 객체는 동일한 메시지를 받을수 있다. :
      - 원 타입의 객체는 또한 도형객체의 타입의 객체이므로 특정 원 객체는 도형의 메시지를 받을수 있다.
        이것을 대체성(substituability)이라 한다.

우리가 객체에게 할 수 있는 요청을 그 객체의 인터페이스 라고 하며 그것을 결정하는것이 타입니다.

자동차는 엔진을 갖는다
 - 이말은 has- a 관계 즉 composition(컴포지션) 이라 한다.

원은 도형이다.
 -
상속 관계 즉 is-a 관계 substitution principle(대체 원리)라 한다.

베이스 클래스의 객체는 파생클래스의 객체로 완벽히 100프로 대체 할 수 있는것을 pure substitution (순수 대체) 라고 한다.하지만 파생 타입이 베이스 타입과 100% 똑같지 않다면 이것는 is-like-a 라고 한다.

void doSomething(도형 shape) {
     shape.erase();
     shape.draw();
}

원 circle = new 원();
삼각형 triangle = new 삼각형();
Line line = new Line();
doSomething(circle);
doSomething(triangle);
doSomething(line);

두 예제를 잘 보자 아주 중요한 이야기 같다. 여기서 doSomething()은 인자로 전달된 객체의 실제 타입과는 무관하게 잘 실행 된다. 이유가 뭘까? doSomething()의 인자가 베이스 타입으로 정의되어 있으므로, 타입이 맞지 않아 컴파일 할때 에러로 처리되어야 하지 않을까?

하지만 원객체는 자동으로 도형 베이스 타입으로 참조된다 (원은 도형이기 때문이다.) 따라서 doSomething() 메소드 내에서 베이스 타입의 draw()와  earase() 메소드를 호출한다. 그러나 이 메소드들은 파생 타입인 원에서 오버라이딩하고 있고 객체가 원이므로 동적 바인딩에 의해서 자신의 타입인 원에 있는 메소드를 실행하게 되는것이다.

이처럼 파생 타입의 객체를 베이스 타입으로 참조하는 것을 업 캐스팅이라 한다.