개발자가 정복해야 할 객체지향-2

메시지

  • 오퍼레이션의 실행을 요청하는 것을 ‘메시지를 보낸다’라고 표현한다.

객체의 책임과 크기

  • 객체는 객체가 제공하는 기능으로 정의된다. 이 말은 객체마다 자신만의 책임이 있다는 의미이다.
  • 한 객체가 갖는 책임을 정의한 것이 바로 타입/인터페이스라고 생각하면된다.
  • 객체가 갖는 책임을 어떻게 결정할지가 바로 객체 지향 설계의 출발점이다.
  • 객체지향적으로 프로그래밍을 할 때, 가장 어려우면서 가장 중요한 것이 바로 객체마다 기능을 할당하는 과정이다.
  • 객체가 갖는 책임의 크기는 작을수록 좋다. 이 말은 객체가 제공하는 기능의 개수가 적다는 걸 의미한다.
  • 객체는 단 한개의 책임만을 가져야한다는 원칙 : 단일 책임 원칙

의존

  • 한 객체가 다른 객체를 이용한다는 것은, 실제 구현에서는 한 객체의 코드에서 다른 객체를 생성하거나 다른 객체의 메서드를 호출한다는 것을 의미한다.
  • 한 객체가 다른 객체를 생성하거나 다른 객체의 메서드를 호출할 때, 이를 그 객체에 의존한다고 표현한다.
  • 다른 타입에 의존을 한다는 것은 의존하는 타입에 변경이 발생할 때 나는 함께 변경될 가능성이 높다는 것을 뜻한다.
  • 내가 변경되면 나에게 의존하고 있는 코드에 영향을 준다.
  • 나의 요구가 변경되면 내가 의존하고 있는 타입에 영향을 준다.

캡슐화

  • 객체가 내부적으로 기능을 어떻게 구현하는지를 감추는 것이다.
  • 내부 구현 변경의 유연함을 주는 기법이다.
* Tell, Don't Ask
- 데이터를 물어보지 않고, 기능을 실행해 달라고 말하라는 규칙.
- 기능 실행을 요청하는 방식으로 코드를 작성하다 보면, 자연스럽게 해당 기능을 어떻게 구현했는지 여부가 감춰진다.

* 데미테르의 법칙
- 메서드에서 생성한 객체의 메서드만 호출
- 파라미터로 받은 객체의 메서드만 호출
- 필드로 참조하는 객체의 메서드만 호출

객체 지향 설계 과정

    1. 제공해야 할 기능을 찾고 또는 세분화하고, 그 기능을 알맞은 객체에 할당하한다.
    • 기능을 구현하는데 필요한 데이터를 개체에 추가한다. 객체에 데이터를 먼저 추가하고 그 데이터를 이용하는 기능을 넣을 수도 있다.
    • 기능은 최대한 캡슐화해서 구현한다.
    2. 객체 간에 어떻게 메시지를 주고받을 지 결정한다.
  • 객체 설계는 한 번에 완성되지 않고 구현을 진행해 나가면서 점진적으로 완성된다.

다형성과 추상타입

  • 상속은 한 타입을 그대로 사용하면서 구현을 추가할 수 있도록 해주는 방법을 제공한다.
  • 하위 클래스는 필요에 따라 상위 클래스에 정의된 메서드를 새롭게 구현할 수도 있는데, 이를 재정의라고 한다.
  • 메서드를 재정의하면, 해당 메서드를 실행할 때 상위타입의 메서드가 아닌 하위 타입에서 재정의한 메서드가 실행된다.
  • 다형성은 한 객체가 여러가지 모습을 갖는다는 것을 의미한다. 즉, 한 객체가 여러 타입을 가질 수 있다는 것을 뜻한다.

      배운점 : 현재 업무를 개발할 때, 너무 데이터를 의존하여 개발한것 같다는 생각이 든다. 
      객체지향으로 설계할 수 있도록 다시 한번 코드를 보고, 설계를 해봐야겠다.