brunch

You can make anything
by writing

C.S.Lewis

by 김선우 Jul 27. 2016

객체지향 프로그래밍(OOP)의 기본원리

Object Oriented Programming

객체지향 언어이면서 자바 기반의 언어인 ,

'스몰토크'의 다섯 가지 기본 특성에 대해서 앨런 케이가 요약한 내용이다.


1. 모든 것이 객체다.

: 객체를 변수라고 생각하자. 우리는 객체에게 요청(request)을 하여 객체가 갖는 오퍼레이션을 수행하도록 요구할 수 있다. 


2. 프로그램은 여러 객체로 구성되고, 각 객체들은 상호간에 메시지를 보내어 일을 수행한다. 

: 메시지란 객체가 갖는 메소드를 호출하는 것이라고 생각할 수 있다.


3. 각 개체는 다른 객체로 이루어진 자신의 메모리를 갖는다.

: 기존 객체들을 포함시켜 새로운 종류의 객체를 만든다 -> 포함된 객체들의 단순화로 복잡함을 감추게된다.


4. 모든 객체는 자신의 타입이 있다.

: 객체는 클래스(class)의 인스턴스(instance)이다. 클래스가 타입과 같은 의미이다. 클래스를 특징짓는 가장 중요한 것은 '그 클래스에게 무슨 메시지를 보낼 수 있는가?' 즉, 무슨 일을 할 수 있는가이다.


5. 특정 타입에 속하는 모든 객체는 동일한 메시지를 받을 수 있다.

: 의미하는 바가 많은 문장이다. '원(circle)' 타입의 객체는 또한 '도형(shape)' 타입의 객체이므로, 특정 원 객체는 도형의 메시지를 받을 수 있다. 도형 객체들에게 메시지를 보내면 자동적으로 도형 부류에 적합한 어떤 일을 처리하는 코드를 작성할 수 있다는 의미다. 이것을 대체성이라고하며 OOP의 가장 강력한 개념 중 하나이다.


그래디 부치는 더 간결하게 요약했다.

객체는 상태(state)와 행동(behavior) 및 정체성(identity)을 갖는다.

즉, 객체는 내부 데이터(상태)와 메소드(행동)를 가질 수 있으며, 각 객체는 모든 다른 객체와 고유(정체성 == 메모리 번지)하게 식별될 수 있다. 




인터페이스

: 동일한 속성(데이터 요소)와 행동(기능)을 갖는 객체들을 나타낸 것이 클래이므로. 실제로 클래스는 하나의 데이터 타입이다. 우리가 객체에게 할 수 있는 요청을 그 객체의 인터페이스(interface)라고 하며, 그것을 결정하는 것이 타입이다.

인터페이스는 특정 객체에게 할 수 있는 요청을 나타낸다. 이 요청을 충족하는 코드는 어딘가에 존재하여야하는데, 이 코드를 구현(implement)이라고 한다.


컴포지션

: 클래스는 내부에 다른 객체를 포함시킬 수 있으며, 클래스에서 요구되는 기능성을 이루는 데 어떤 조합으로도 가능하다. 기존 클래스들을 조립(compose)하여 새로운 클래스를 만드는 것이므로, 이러한 개념을 컴포지션(composition)이라 한다. 컴포지션은 'has-a' 관계라 한다. 예) '자동차는 엔진을 갖는다'


상속

: 기존 클래스(base or super)와 새로 만드는 클래스(sub, child)의 관계를 설정하여 코드를 재사용할 수 있다. 베이스 클래스로부터 상속받아서 서브 클래스를 생성하면, 생성된 서브 클래스에서는 베이스 클래스의 모든 멤버를 갖게 되고 베이스 클래스와 동일한 인터페이스를 갖는다. 모든 서브 클래스는 베이스 클래스와 같은 타입이 된다. 결과적으로 베이스 객체를 서브 클래스 객체로 대체할 수 있다. 상속은 'is-a' 관계라 한다. 

예) (원, 세모, 네모) is (도형)


다형성

: 객체지향 프로그래밍에서는 컴파일이 아닌 실행하는 시점에서 호출될 함수의 메모리 번지가 결정된다. 베이스 타입의 객체에게 메시지를 보낼 때는 어떠한 형태의 처리가 필요하게 되는데 이를 해결하기 위하여 late 바인딩(==동적 바인딩) 개념을 사용한다.  즉, 어떤 서브 타입의 특정 메소드를 호출할 것인지를 실행할 때 결정하는 것이다. 

예) 


void doSomething(도형 shape){

    shape.erase();

    // something

    shape.draw();

}


원 circle = new 원();

삼각형 triangle = new 삼각형();

doSomething(circle);

doSomething(triangle);


doSomething(도형 shape) 에서 처럼 서브 타입의 객체를 베이스 타입으로 참조하는 것을 업 캐스팅(up casting) 이라고 한다. 





모든 내용은 Thinking in java 책을 참조하였습니다.

http://www.mindviewinc.com/Books/TIJ4/

작가의 이전글 클래스와 타입의 차이
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari