[스터디] 오브젝트 – Chapter2: 객체지향 프로그래밍

객체지향 프로그래밍에서 고려할 점

대부분의 사람들은 클래스를 결정한 후에 클래스에 어떤 데이터와 메서드를 만들지 생각한다. 하지만 객체지향 프로그래밍은 말 그대로 객체를 지향하는 것이다. 클래스가 아니라 객체에 설계 초점을 맞춰야 한다.

객체지향 프로그래밍을 하는 동안 집중해야할 것 두 가지

  1. 어떤 객체가 필요한지 고민하기
    • 클래스의 윤곽을 잡기 위해서는 객체가 어떤 상태와 행동을 가지는지 결정해야 한다.
  2. 객체는 기능을 구현하기 위해 협력하는 공동체의 일원
    • 객체는 다른 객체에게 도움을 주거나 의존하면서 살아가는 협력적인 존재다.

협력이란?

객체가 다른 객체와 상호작용할 수 있는 유일한 방법은 메시지를 전송하는 것이다. 메시지를 수신한 객체는 자율적으로 메시지를 처리할 방법을 결정한다. 수신된 메시지를 처리하기 위한 자신만의 방법을 메서드라고 한다.

상속과 다형성

책의 예제 코드에서 Movie 클래스에는 할인 정책이 금액 할인인지, 비율 할인인지 판단하지 않는다. 그럼 어떻게 할인 정책을 선택할 수 있을까? 이 질문에 대답하려면 상속과 다형성을 알아야 한다.

먼저 의존성의 개념을 살펴보고 상속과 다형성을 알아보자.

코드 의존성과 실행 시간 의존성의 차이

객체들 사이의 의존성은 시점에 따라 조금 달라질 수 있다.

다시 말하면, 클래스 사이의 의존성과 객체 사이의 의존성은 동일하지 않을 수 있다.

책의 예제 코드에서 Movie 클래스는 DiscountPolicy 클래스와 연결되어 있다. 여기서 문제는 영화 요금을 계산 할때 AmountDiscountPolicy와 PercentDiscountPolicy 인스턴스가 필요하다는 것이다. 따라서 Movie 객체는 인스턴스 실행 시점에 AmountDiscountPolicy나 PercentDiscountPolicy 객체에 의존해야 한다. 하지만 코드 수준에서 Movie 클래스는 어느 것에도 의존하지 않는다.

그럼 Movie 객체는 어떻게 AmountDiscountPolicy나 PercentDiscountPolicy 객체와 협력할 수 있을까? 이 의문을 해결하려면 Movie 객체를 생성하는 코드를 봐야한다.

Movie avatar = new Movie(
                "아바타",
                Duration.ofMinutes(120),
                Money.wons(10000),
                new AmountDiscountPolicy()
        );
Movie avatar = new Movie(
                "타이타닉",
                Duration.ofMinutes(120),
                Money.wons(10000),
                new AmountDiscountPolicy()
        );

Movie 객체를 생성할 때 필요한 할인 정책 클래스를 생성해서 넣어주면 된다.

메시지에 의한 상호작용

Movie 객체는 DiscountPolicy와 같은 타입의 객체에게 calculateDiscountAmount 메시지를 전송한다. 이 때 실행되는 메서드는 Movie 객체에 어떤 객체가 연결된 객체가 무엇인지에 따라 다르다.

Movie 객체는 동일한 메시지를 전송하지만 실제로 어떤 메서드가 실행될 것인지는 메시지를 수신하는 객체의 클래스가 무엇인지에 따라 달라진다. 이를 다형성이라고 부른다.

다형성이란 동일한 메시지를 수신했을 때 객체의 타입에 따라 다르게 응답할 수 있는 능력을 의미한다.

Leave a Comment