일반화(Generalization)(=상속)

uglyduck.dev·2020년 9월 20일
0

개념 모아 🗂

목록 보기
24/40

정의

일반화는 또 다른 캡슐화

  • 일반화 관계(=객체지향 프로그래밍 관점에서의 상속 관계)
  • 속성이나 기능의 재사용만 강조해서 사용하는 경우가 많음 -> 일반화 관계를 극히 한정되게 바라보는 시각
  • "is a kind of 관계"가 성립되어야 함

실생활에서 볼 수 있는 문제

  • 과일 -> 바나나, 사과, 배, 오렌지의 공통 개념을 일반화(generalization) 함

  • 바나나, 사과, 배, 오렌지 -> 과일의 한 종류이므로 특수화(specialization) 함

일반화했을 경우

  • 각각의 과일 종류에 신경 쓰지 않고 과일 전체를 다룰 수 있는 수단을 얻을 수 있음

    ex) "현재 냉장고에 과일이 몇 개 있지?"

일반화의 개념이 없는 경우

  • 모든 과일 종류마다 번거롭고 힘들게 이와 같은 질문을 매번 해야 함

    ex) "냉장고에 현재 사과가 몇 개 있지?", "냉장고에 현재 배가 몇 개 있지?", "냉장고에 현재 바나나가 몇 개 있지?", "냉장고에 현재 오렌지가 몇 개 있지?"...

가격 총합 = 0
while(장바구니에 과일이 있다){
  switch(과일 종류)
    case 사과:
      가격 총합 = 가격 총합 + 사과 가격
    case:
      가격 총합 = 가격 총합 + 배 가격
    case 바나나:
      가격 총합 = 가격 총합 + 바나나 가격
    case 오렌지:
      가격 총합 = 가격 총합 + 오렌지 가격
}

새로운 과일의 종류가 추가되었을 때

가격 총합 = 0
while(장바구니에 과일이 있다){
  switch(과일 종류)
    case 사과:
      가격 총합 = 가격 총합 + 사과 가격
    case:
      가격 총합 = 가격 총합 + 배 가격
    case 바나나:
      가격 총합 = 가격 총합 + 바나나 가격
    case 오렌지:
      가격 총합 = 가격 총합 + 오렌지 가격
    case 키위: // 추가된 항목
      가격 총합 = 가격 총합 + 키위 가격
}

=> 새로운 과일의 종류가 추가됨에 있어서 코드의 잦은 수정유연하게 대처하지 못하는 문제가 발생

int computeTotalPrice(LinkedList<Fruit> f){
  int total = 0;
  Iterator<Fruit> itr = f.iterator();
  
  while(itr.hasNext()){
    Fruit curFruit = itr.next();
    total = total + curFruit.calculatePrice();
  }
  return total;
}

=> calculatePrice 메서드는 실제 과일 객체의 종류에 따라 다르게 실행되므로, 다형성의 개념을 따른 것이라고 볼 수 있음

예제로 미루어 봤을 때, 일반화 관계는 외부 세계에 자식 클래스를 캡슐화(또는 은닉)하는 개념으로 볼 수 있으며, 이때 캡슐화 개념은 한 클래스 안에 있는 속성 및 연산들의 캡슐화에 한정되지 않고 일반화 관계를 통해 클래스 자체를 캡슐화하는 것으로 확장된다. 이러한 서브 클래스 캡슐화는 외부 클라이언트가 개별적인 클래스들과 무관하게 프로그래밍할 수 있게 함

  • '사람' 클래스 관점에서는 캡슐화(은닉)로 인해 자동차의 종류를 볼 수 없음.
  • 대리 운전의 경우 자동차 종류로 인해서 운전의 영향을 받지 않음

일반화 관계와 위임

어떤 클래스의 일부 기능만 재사용하고 싶은 경우, 위임을 사용하여 자신이 직접 기능을 실행하지 않고 다른 클래스의 객체가 기능을 실행하도록 함.

위임을 사용해 일반화(상속) 대체 과정

  1. 자식 클래스에 부모 클래스의 인스턴스를 참조하는 속성을 만듦. 이 속성 필드를 this로 초기화
  2. 서브 클래스에 정의된 각 메서드에 1번에 서서 만든 위임 속성 필드를 참조하게 변경.
  3. 서브 클래스에서 일반화 관계 선언 제거 및 위임 속성 필드에 슈퍼 클래스 객체 생성해 대입.
  4. 서브 클래스에서 사용된 슈퍼 클래스의 메서드에도 위임 메서드를 추가.
  5. 컴파일하고 잘 동작하는지 확인.

Reference

  • 정인상,채흥석, 『JAVA 객체 지향 디자인 패턴』, 한빛미디어(2019.3.8), 68~73p
profile
시행착오, 문제해결 그 어디 즈음에.

0개의 댓글