본문 바로가기

OBJECT

오브젝트 챕터2<객체지향 프로그래밍>

챕터2는 영화 예매 프로그램을 예시로 설명합니다.

진정한 객체지향으로의 전환을 위한 두 가지 중점사항.

첫째, 어떤 객체들이 어떤 상태와 행동을 가지는지 먼저 결정해야 한다.
둘째, 객체를 독립적인 존재가 아닌 기능을 구현하기 위해 협력하는 공동체의 일원으로 봐야한다.

 

 


 

 

챕터2를 읽고 복기하며 오버라이딩(Overriding)과 오버로딩(Overloading) 사이에서 헷갈리는 느낌을 받았습니다.

각각의 개념을 정리하며 정립하겠습니다.

 

오버라이딩

부모 클래스에서 정의된 같은 이름, 같은 파라미터 목록을 가진 메서드를 자식 메서드에서 재정의하는 경우.

따라서 외부에서는 부모 클래스의 메서드가 보이지 않는다.

 

오버로딩

이름은 같지만 제공되는 파라미터 목록이 다르다.

따라서 부모 메서드를 가리지 않으며, 메서드들은 공존한다.

 

 



뛰어난 확장성이 객체지향 프로그래밍의 최고 장점 중 하나라고 생각합니다. 그러나 오직 확장성만을 고려해, 유연한 설계만을 지향한다면(코드 의존성과 실행 시점의 의존성을 분리한다면), 코드를 이해하고 디버깅하기는 점점 더 어려워집니다. 그러나 반대로 유연성을 억제한다면 이해하고 디버깅하기는 쉬워지지만 재사용성과 확장 가능성은 낮아집니다.

 

 

코드의 의존성과 실행 시점의 의존성이 서로 상이하며, 트레이드오프 관계에 있다.

 

 

 

위 문장이 저자가 이 장에서 말하고자 하는 핵심이라고 생각합니다. 저자는 무조건 유연한 설계도, 무조건 읽기 쉬운 코드도 정답이 아니라고 합니다. 챕터1의 적절한 책임 분산에 이어서 "적절함"의 딜레마에 빠지게 되는 것 같습니다. 두 가치 사이에서 항상 고민해야겠습니다.

 

 


 

 

프로그램 실행을 위해 MovieMain클래스 구현

package movie;

import java.time.Duration;
import java.time.LocalDateTime;

public class MovieMain {
    public static void main(String[] args) {
        Movie TheSubstance = new Movie(
                "The Substance",
                Duration.ofMinutes(120),
                Money.wons(10000),
                new AmountDiscountPolicy(
                        Money.wons(800),
                        new SequenceCondition(10)
                )
        );

        Screening screening = new Screening(
                TheSubstance,
                10,
                LocalDateTime.of(2024, 12, 11, 19, 40)
        );

        Customer customer = new Customer("박여명");

        Reservation reservation = screening.reservation(customer, 2);

        System.out.println("영화 제목: " + TheSubstance.getTitle());
        System.out.println("고객명: " + customer.getName() + "님\n");
        System.out.println("** 예약 정보 **" + reservation);
    }
}

Main 실행 결과

 

 


다형성을 구현하는 합성(Composition)이라는 개념에 대해 새롭게 알게 되었습니다.

 

상속은 클래스를 통해 부모, 자식간의 관계를 강하게 결합하는 반면, 합성은 메시지를 통해 결합을 느슨하게 만들고, 구현을 효과적으로 캡슐화할 수 있다고 학습했습니다.

 

우리는 앞서 코드, 실행 시점의 의존성이 서로 상이하다는것을 알았습니다.

상속과 합성을 적절하게 조합해 의존성의 양면성이라는 트레이드오프의 균형 사이에서 최적의 결과물을 위해 고민해야 하겠습니다.