2019.03.22 TIL

(TIL은 스스로 이해한 것을 바탕으로 정리한 것으로 오류가 있을 수 있습니다)

# 질문에 답하기

  1. is-a / has -a에 관해 이야기 해보시오

궁극적으로 코딩이란 클래스 간의 계층 구조를 만들고 설계하는 것

좋은 설계와 나쁜 설계

  • 다 크게 만들어 놨는데 클라이언트가 특정 기능을 추가해달라고 했는데 미친듯이 클래스가 변경해야되면 나쁜 설계이다.
  • 좋은 설계는 (궁극적인 목표) 기능이 추가되는 그 클래스 한개만 변경이 되고 나머지는 완벽히 닫혀져 있는 상태(Open-closed)
  • 이것을 위해 design pattern이 필요하고 이게 GOF(gang of Four) - 20개 이렇게 하면 open-closed에 근접해 갈 수 있다.
  • 이것을 가기 위해 가장 밑바닥의 지식이 상속이다.

클래스와 클래스 사이의 관계 설정 방법

  • 클래스와 클래스 사이의 관계에는 Is -A 와 Has - A 가 있다.
  1. 클래스와 클래스 사이의 관계 설정 방법
    1. is-a ( is - a는 상속이용)
      1. 첫번째 조건 모든 멤버와 메서드가 중복이 되어야 한다.
        1. 부모가 가진 멤버와 메서드 중 단 한개라도 가지지 않으면 사용할 수 없다.
      2. 상속 받은 모든 멤버와 메서드를 가지게 되어 재사용성이 가능해진다.
        1. is-a가 아닌데 재사용만하고 싶으면 composition을 통해 구현해야 한다.
      3. 언제 상속을 쓰나?(1번 조건을 전제하에)
        1. 멤버가 추가될 때
        2. 메서드가 추가 될 때
    2. has - a (논리적으로 조금 차이가 있다)
      1. 객체의 멤버로서 다른 객체를 포함해서 사용한다.(composition, aggregation 둘다 대전제)
      2. 상속이 아니다. 서로 has-a관계 일 때 composition 혹은 aggregation을 활용
      3. composition(합성)
        1. 코드 재사용을 위해서 관계를 구축하는 거라면 상속보다 컴포지션을 이용한다.
        2. same life cycle
          1. 객체들의 생성 시점과 소멸 시점이 같다.
        3. strong coupled
          1. 객체들의 생성 시점이 같다.
          2. 객체들의 소멸 시점이 같다.
          3. cpu, ram, computer는 강하게 커플링 되어 있다.
      4. aggregation(통합)
        1. Not same life cycle
        2. weak coupling
        3. 내가 필요할 때만 받아서 쓰고 필요없으면 반납한다.

정리

IS-A

  1. A laptop IS - A computer
  2. ~클래스은 ~클래스의 한 종류이다.
  3. inheritance(상속)으로 구현

HAS-A(합성).

  1. A policeman has a gun.
  2. ~이 ~을 가지고 있다. or 포함하고 있다.
  3. composition(합성) or aggregation(통합)

+ Recent posts