jongfeel / Activity

Activity log of mentoring or study life
MIT License
1 stars 0 forks source link

오브젝트, CHAPTER 02 객체지향 프로그래밍, 2024-07-21 #438

Closed jongfeel closed 1 month ago

jongfeel commented 1 month ago

내용 정리

02 객체지향 프로그래밍을 향해

협력, 객체 클래스

객체지향의 본질에 대해 다시 리마인드. 진정한 객체지향 패러다임으로의 전환은 클래스가 아닌 객체에 초점을 맞출 때에만 얻을 수 있다. 이를 위해서는 프로그래밍하는 동안 다음의 두 가지에 집중해야 한다.

첫째, 어떤 클래스기 필요한지를 고민하기 전에 어떤 객체들이 필요한지 고민하라. 둘째, 객체를 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 공동체의 일원으로 봐야 한다.

클래스 구현하기

클래스의 내부와 외브를 구분해야 하는 이유 경계의 명확성이 객체의 자율성을 보장하기 떄문 프로그래머에게 구현의 자유를 제공하기 때문

자율적인 객체

객체는 상태(state)와 행동(behaviour)을 함께 가지는 복합적인 존재 객체는 스스로 판단하고 행동하는 자율적인 존재 이 두 가지는 서로 깊이 연관되어 있다.

인터페이스와 구현의 분리(separation of interface and implementation) 원칙은 훌륭한 객체지향 프로그램을 만들기 위해 따라야 하는 핵심 원칙이다.

프로그래머의 자유

프로그래머의 역할을 클래스 작성자(class creator)와 클라이언트 프로그래머(client programmer)로 구분하는 것이 유용하다[Eckel06]

클라이언트 프로그래머가 숨겨 놓은 부분에 접근할 수 없도록 방지해서 클라이언트 프로그래머에 대한 영향을 걱정하지 않고 내부 구현을 마음대로 변경할 수 있다. 이걸 구현 은닉(implementation hiding)이라고 부른다.

설계가 필요한 이유는 변경을 관리하기 위함이다. 객체의 변경을 관리할 수 있는 기법 중에 하나가 접근 제어이므로 세부 구현 내용은 private 영역 안에 감춰서 변경으로 인한 혼란을 최소화해야 한다.

협력에 관한 짧은 이야기

객체가 다른 객체와 상호작용하는 방법으로 메시지를 전송(send a message)하는 것이다. 메시지를 수신한 객체는 자율적으로 메시지를 처리할 방법을 결정한다. 이것을 메서드(method)라고 부른다.

메시지와 메서드를 구분하는 것은 중요하다. 이 구분을 하는 것으로 부터 다형성(polymorphism)의 개념이 출발한다.

04 상속과 다형성

다형성

구현 상속과 인터페이스 상속

상속은 구현 상속(implementation inheritatnce)과 인터페이스 상속(interface inheritance)이 있으며 구현 상속은 서브클래싱(subclassing), 인터페이스 상속을 서브타이핑(subtyping)이라고 부른다. 순수하게 코드 재사용의 목적으로 상속을 하면 구현 상속이라고 하고 다형적인 협력을 위해 부모와 자식 클래스가 인터페이스를 공유할 수 있도록 상속을 이용하는 것을 인터페이스 상속이라고 한다.

상속은 구현 상속이 아니라 인터페이스 상속을 위해 사용해야 한다. 코드의 재사용을 위해 상속을 사용하는 건 잘못된 오해이다. 인터페이스를 재사용할 목적이 아니라 구현을 재사용할 목적이라면 변경에 취약한 코드를 가져오게 된다.

05 추상화와 유연성

상속

상속은 두 가지 관점에서 설계에 안 좋은 영향을 미친다.

부모 클래스의 구현이 자식 클래스에게 노출되므로 캡슐화가 약화된다. 자식 클래스가 부모 클래스에 강하게 결합되도록 만들기 때문에 부모 클래스가 변경되면 자식 클래스도 함께 변경될 확률을 높인다. 상속을 과도하게 사용한 코드는 변경이 어려워진다.

상속은 부모 클래스와 자식 클래스 사이의 관계를 컴파일 시점에 결정한다. 실행 시점에 객체의 종류를 변경하는게 불가능하다.

합성

합성은 상속이 가지는 두 가지 문제점을 모두 해결한다. 인터페이스에 정의된 메시지를 통해서면 재사용이 가능하기 때문에 구현을 효과적으로 캡슐화할 수 있다. 또한 의존하는 인스턴스를 교체하는 것이 쉽게 때문에 설계를 유연하게 만든다.