도니의 iOS 프로그래밍 세상

[오브젝트 2회독] 2장 - 객체지향 프로그래밍 본문

OOP

[오브젝트 2회독] 2장 - 객체지향 프로그래밍

Donee 2024. 9. 8. 22:26

1. 영화 예매 시스템

  • 결국 프로그래밍에서 중요한 건 용어를 알맞게 정의하는 것
  • 책에서 영화 예매 프로그램을 구현하기 전, 영화와 상영의 정의를 나누고 있음
    • 우리가 일반적으로 예매하는 건, 영화가 아닌 상영(특정 시간에 상영되는 영화)
    • 영화는 단순히 실제 영화 정보를 담고 있음
    • 이게 실제 세계와 맞는지 중요하지 않고, 해당 프로그램을 만들 때 이렇게 정의한 게 중요

2. 객체지향 프로그래밍을 향해

객체, 클래스, 협력

  • 객체 지향 프로그래밍의 본질은 객체(not class)
  • 객체 지향에 핵심 두가지
    • 어떤 객체가 필요한가?
      • 이를통해, 해당 객체에 필요한 state(속성)과 행동(behavior)를 정의
    • 객체는 협력하는 공동체의 일원(not 독립적 존재)
      • 객체를 협력의 대상으로 봄으로써, 유연하고 확장 가능하게 만듦

클래스, 도메인

  • 도메인은 문제 해결을 위해 사용자가 프로그램을 사용하는 분야
  • 영화 예매 도메인을 분석하여, 도메인을 구성하는 개념과 관계를 표현하는게 가능해짐(설계도를 그리는 것)
  • 도메인을 실제적으로 구현시, 클래스로 구현하면 됨

클래스

  • 클래스 public/private 으로 나누는 것은 개발자들간 협력시 매우 중요
  • 캡슐화를 통해서, 구현은 감추고 외부에서 사용만 하면 되기 때문

자율적 객체

  • 객체는 상태와 행동을 가지는 존재
    • Data와 기능을 묶여 있고, 이는 캡슐화의 본질(이전 패러다임에선, Data와 기능을 분리해서 생각)
  • 클래스의 캡슐화는 객체 public, private을 나누어 스스로 상태를 관리하도록 만듦 → 자율적 객체가 됨

컴파일 타임, 실행 타임 의존성

  • 코드의 의존성과 실행 시점의 의존성이 다름
  • 따라서, 유연하게 설계가 가능하지만 이로 인해 코드의 이해도가 더 어려울 수 있음
    • 명시적인 특정 클래스가 아닌, 추상화된 객체에 의존하기 때문

다형성

  • 한 객체가 다른 객체에 메세지를 전송(함수 호출), 하지만 수신 객체 클래스에 따라 결과가 달라짐
  • 결국, 특정 객체에 종속되지 않고 다양한 객체가 해당 메세지를 받을 수 있음

모든 코드는 이유가 필요하기 때문에, 다형성 trade-off를 고려한 설계가 필요하다.

코드 재사용

  1. 상속
    • 부모 ↔ 자식간에 강력한 커플링 발생
    • 따라서, 부모의 변경이 모든 자식에게 영향을 미치는 구조
    • 코드 재사용을 위해서 상속을 사용해선 안됨
  2. 합성
    • 재사용이 가능함(다양한 역할을 가진 객체들을 조합해서 사용)

결론

  • OOP의 핵심은 객체들의 상호작용을 통한 기능 구현, not 다형성
  • 하지만, 다형성을 사용하여 보다 유연한 설계가 가능
  • 코드 재사용을 위해선 상속보단 합성을 사용
  • 상속은 객체간의 책임 및 역할이 확정된 뒤, 합성과 함께 사용이 가능함
Comments