Skip to main content

객체 지향

들어가기#

설계를 잘못하는 경우, 발생하는 일

  • 최초에는 빠르게 요구 사항을 반영해주었으나 시간이 갈수록 간단한 요구 사항조차도 개발이 안됨
  • 겉보기에는 간단한데 변경해야할 곳이 너무 많습니다.

소프트웨어의 가치

  • 사용자가 요구하는 기능을 올바르게 제공하는데 의미가 있습니다.
  • 소프트웨어는 변화할 수 있어야합니다.

객체 지향#

절차 지향

  • 프로그램을 구성하는 기법을 절차 지향 프로그래밍이라고 합니다.
  • 데이터를 중심으로 개발함

객체 지향#

  • 데이터 및 데이터와 관련된 프로시저를 객체라고 합니다.
  • 다른 객체에 속한 데이터에는 접근할 수 없습니다.

인터페이스와 클래스#

아래 세가지를 합쳐서 시그니처(signature)

  • 기능 식별 이름
  • 파라미터 및 파라미터 타입
  • 기능 실행 결과 값

책임#

객체는 자신만의 책임을 가집니다. 다만 이 책임을 작게 유지하는 것이 좋습니다.

의존#

한 객체가 다른 객체를 생성하고, 다른 객체의 메서드를 호출할 때 이를 의존한다고 합니다.

객체 지향의 장점은 한 곳의 구현 변경이 다른 곳에 변경을 가하지 않도록 해주는 것에 의의가 있습니다. 이를 객체 지향에서는 캡슐화를 통해서 가능합니다.

캡슐화#

캡슐화의 두가지 규칙은 다음과 같습니다.

  • Tell, Don't Ask : 데이터를 물어보지 않고, 기능을 실행해라
  • 데미테르의 법칙(Law of Demeter) : 아래의 규칙으로 이뤄짐
    • 메서드에서 생성한 객체의 메서드만 호출
    • 파라미터로 받은 객체의 메서드만 호출
    • 필드로 참조하는 객체의 메서드만 호출

설계 과정#

객체 지향 설계는 아래의 작업을 반복하는 과정으로 볼 수 있습니다.

  • 제공해야 할 기능을 찾거나 세분화하고, 그 기능을 알맞은 객체에 할당합니다.
    • 기능을 구현하는데 필요한 데이터를 객체에 추가합니다. 그리고 객체에 데이터를 먼저 추가하고 그 데이터를 이용하는 기능을 넣어야합니다.
    • 기능은 최대한 캡슐화해서 구현해야합니다.
  • 객체 간에 어떻게 메시지를 주고받을 지 결정해야합니다.
  • 윗 두 단계를 지속벅으로 반복합니다.

객체 설계는 구현을 진행해 나가면서 점진적으로 완성해야합니다. 즉, 최초의 설계는 완벽하지 않고 개발이 진행함에 있어 설계도 함께 변경된다는 것을 의미하기에 유연한 구조를 갖도록 노력해야합니다.

다형성과 추상화#

객체 지향이 주는 장점은 구현 변경의 유연함입니다.

상속(Inheritance)

  • 한타입을 그대로 사용하면서 구현을 추가할 수 있도록합니다.
  • is-a 의 경우에서만 사용해야합니다.

다형성(Polymorphism)

  • 한 객체가 여러 가지(poly) 모습(morph)을 가지는 것을 의미합니다.
  • 한 객체가 여러 타입을 가질 수 있다를 의미합니다.

타입 상속은 크게 인터페이스 상속과 구현 상속으로 구분할 수 있습니다. 인터페이스 상속은 순전히 타입 정의만을 상속 받는 것입니다.

추상화(abstraction)

  • 데이터나 프로세스 등을 의미가 비슷한 개념이나 표현으로 정의하는 과정입니다.

객체 지향의 유명한 규칙 중 하나가, 인터페이스에 대고 프로그래밍을 하는 것입니다. (program to interface) 인터페이스를 작성할 때는 사용하는 코드 입장에서 작성해야합니다.

TDD

재사용: 상속보다는 조립#

객체 조립을 통해서 상속을 통해 재사용의 단점을 해소하는 방법이 가능합니다.

상속을 통한 재사용은 아래의 단점이 있습니다.

  • 상위 클래스 변경이 어렵습니다.
  • 클래스의 불필요한 증가가 발생합니다.
  • 상속의 오용이 발생합니다.

조립은 대부분이 장점이나 단점 또한 존재합니다.

  • 상대적으로 런타입 구조가 복잡합니다.
  • 구현이 조금 더 어렵습니다.

위임(delegation) 은 내가 할 일을 다른 객체에게 넘긴다는 의미를 가지고 있습니다. 보통은 조립 방식을 이용해서 위임을 구현합니다.

Last updated on