관리 메뉴

생각해보기

오브젝트(조영호) 책 정리 -2- 본문

객체지향

오브젝트(조영호) 책 정리 -2-

정한_s 2021. 11. 11. 12:31

진정한 객체지향 패러다임으로의 전환은 클래스가 아닌 객체의 초점을 맞출 때 얻을 수 있다. 프로그래밍 하는 동안 두 가지에 집중해야한다.

  • 어떤 클래스가 필요한지 고민하기 전에 어떤 객체들이 필요한지 고민하라. 어떤 객체들이 어떤 상태와 행동을 가지는지 먼저 결정해야 한다
  • 객체는 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 존재이다. 객체는 다른 객체에게 도움을 주거나 의존하며 협력적으로 살아야 한다. 이는 설계를 유연하고 확장 가능하게 만든다.

 

훌륭한 협력이 훌륭한 객체를 낳고, 훌륭한 객체가 훌륭한 클래스를 낳는다.

클래스의 이름은 대응되는 사용자의 도메인 개념에 이름과 동일하거나 유사하게 지어야한다. 클라스 사이의 관계도 최대한 도메인 개념 사이에 맺어진 관계와 유사하게 만들어서 프로그램의 구조를 이해하고 예상하기 쉽게 만들어야한다.

 

영화 예매 프로그램을 예시로 든다. (도메인 개념 -> 클래스)

  • 영화 -> Movie , 상영 -> Screening 
  • 할인 정책 -> DiscountPolicy , 금액 할인 정책 -> AmountDiscountPolicy, 비율 할인 정책 -> PercentDiscountPolicy
  • 할인 조건 -> DiscountCondition, 순번 조건 -> SequenceCondition, 기간 조건 -> PeriodCondition

 

인스턴스 변수의 가시성은 private 이고 매서드의 가시성은 public 이다. 클래서를 구현하거나 개발된 클래스를 사용할때 가장 중요한 것은 클래스의 경계를 구분 짓는 것이다. 훌륭한 클래스를 설계하기 위한 핵심은 어떤 부분을 외부에 공개하고 어떤 부분을 감출지를 결정하는 것이다.

 

경계를 구분 짓는 것은 객체를 자율적인 존재로 만들기 위해서이다. 스스로 상태를 관리하고, 판단하고, 행동하는 것이 자율적인 객체이다. 외부에 접근하는 부분을 퍼블릭 인터페이스라고 부르며 내부에서 접근하는 부분을 구현이라고 부른다.

 

코드의 의존성과 실행 시점의 의존성이 서로 다를 수 있다.(ex 인터페이스 구현, 추상 클래스 상속). 확장 가능한 객체지향 설계가 가지는 특징은 코드의 의존성과 실행 시점의 의존성이 다르다는 것이다. 하지만 의존성이 다르면 다를 수록 코드를 이해하기 어려워진다. 코드를 이해하기 위해 코드 뿐만 아니라 객체를 생성하고 연결하는 부분을 찾아야 한다. 이는 트레이드 오프이다.

 

설계가 유연해질수록 코드를 이해하고 디버깅하기 어려워진다. 반대로 유연성을 억제하면 코드를 이해하고 디버깅하기 쉬워지지만 재사용성과 확장 가능성은 낮아진다. 우리는 항상 유연성과 가독성 사이에서 고민해야한다.  

 

동일한 메시지를 전송하지만 실제로 어떤 메서드가 실행될 것인지는 메시지를 수신하는 객체에 클래스가 무엇이야에 따라 달라진다. 이를 다형성이라고 부른다. 다형성은 객체지향 프로그램의 컴파일 시간 의존성과 실행 시간 의존성이 다를 수 있다는 것을 가반으로 한다.

 

다형성은 동일한 메시지를 수신했을 때 객체의 타입에 따라 다르게 응답할 수 있는 능력을 의미한다. 따라서 다형적인 협력에 참여하는 객체들은 모두 같은 메시지를 이해할 수 있어야 한다. 즉, 인터페이스가 동일해야 한다. 

 

다형성은 하나는 메시지와 메서드를 컴파일 시전이 아닌 실행 시점에 결정하는 것이다. 이를 지연 바인딩(lazy binding) 또는 동적 바인딩(dynamic binding)이라고 부른다.

 

코드 재사용을 위해서는 상속보다는 합성이 더 좋은 방법이다. 상속의 단점은 캡슐화를 위반하는 것이다. 상속을 이용하기 위해서는 부모 클래스의 내부 구조를 잘 알고 있어야한다. 결과적으로 부모 클래스의 구현이 자식 클래스에게 노출 되기 때문에 강하게 결합된다. 이는 코드 변경이 여려워진다.

 

합성은 인터페이스에 메시지를 통해서만 재사용이 가능하기 때문에 구현을 효과적으로 캡슐화할 수 있다. 또한 의존하는 인스턴스를 교체하는 것이 비교적 쉽기 때문에 설계를 유연하게 만든다. 다만, 우리는 다형성을 위해 상속과 합성을 함께 조합해서 사용해야 한다.  

 

영화 예매 프로그램

 

  • 사용자는 상영하는 영화를 예매 할 수 해야 한다. 전체 금액을 계산해야 한다
  • 상영되는 영화는 영화 정보와 최종 영화 가격을 계산해야 한다
  • 할인 정책은 할인 조건을 통해 할인되는 가격을 계산해야 한다
  • 할인 조건은 사영하는 영화가 조건에 부합되는 지 판단해야 한다

 

해당 코드

https://github.com/tjwjdgks/book_object_codezip/tree/master/src/com/company/chapter2

* 업 캐스팅 : 자식 클래스가 부모 클래스를 대신하는 것

 

Comments