일반화는 또 다른 캡슐화
실생활에서 볼 수 있는 문제
과일 -> 바나나, 사과, 배, 오렌지의 공통 개념을 일반화(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 메서드는 실제 과일 객체의 종류에 따라 다르게 실행되므로, 다형성의 개념을 따른 것이라고 볼 수 있음
예제로 미루어 봤을 때, 일반화 관계는 외부 세계에 자식 클래스를 캡슐화(또는 은닉)하는 개념으로 볼 수 있으며, 이때 캡슐화 개념은 한 클래스 안에 있는 속성 및 연산들의 캡슐화에 한정되지 않고 일반화 관계를 통해 클래스 자체를 캡슐화하는 것으로 확장된다. 이러한 서브 클래스 캡슐화는 외부 클라이언트가 개별적인 클래스들과 무관하게 프로그래밍할 수 있게 함
어떤 클래스의 일부 기능만 재사용하고 싶은 경우, 위임을 사용하여 자신이 직접 기능을 실행하지 않고 다른 클래스의 객체가 기능을 실행하도록 함.
위임
을 사용해 일반화(상속) 대체 과정
Reference