얼마전 강규영님의 글 "OOP란 조건문(if)을 줄이는 것"을 보고
정말 서브타입 다형성(subtype polymorphism) 이 if,else를 줄일수 있는가 생각해보았다.
예를들면 아래와 같은 클래스가 있다고 생각을 해보자.
식사 {아침 점심 저녁을 비교하는 세개의 IF문이 존재한다.
밥() {
if (아침) {
return 빵과우유;
} else if (점심) {
return 짜장면;
} else if (저녁) {
return 삼겹살;
}
}
}
이 클래스를 아래와 같이 Interface를 이용해 분리를 해보겠다.
// 인터페이스
interface Food {
eat();
}
// 오전을 나타내는 클래스
class Morning implements Food {
eat() {
return 빵과우유;
}
}
// 오후을 나타내는 클래스
class Afternoon implements Food {
eat() {
return 짜장면;
}
}
// 저녁을 나타내는 클래스
class Evening implements Food {
eat() {
return 삼겹살;
}
}
class Meal {
Food s;.
// 식사지정 메소드
setFood(Food s) {
this.s = s ;
}
// 밥먹기
eat() {
return s.eat();
}
}
public MealMain {
public static void main(String[] args) {
Food morning = new Morning();
Food afternoon = new Afternoon();
Food evening = new Evening();
Meal ml = new Meal();
// 아침
ml.setFood(morning);
print(ml.eat());
// 점심
ml.setFood(afternoon);
print(ml.eat());
// 저녁
ml.setFood(evening);
print(ml.eat());
}
}
간단한 소스코드라서 별로 어렵지 않을것이다 (내가 복잡한걸 못 짠다.-_-)
결과적으로 IF문이 없어져 버렸다.
그런데 정말 다형성으로인해 IF문이 줄었던것일까?
public MealMain {이 코드또한 다형성을 이용하지 않고도 방금전 코드와 같은 동작을 한다.
public static void main(String[] args) {
Morning morning = new Morning();
Afternoon afternoon = new Afternoon();
Evening evening = new Evening();
// 아침
print(morning.eat());
// 점심
print(afternoon.eat());
// 저녁
print(evening.eat());
}
}
다시한번 반문해보자. 정말 다형성이 IF문을 줄였는가?
소스코드의 의도적인 리팩토링으로 인해 나타난 결과는 아닐까?
다형성은 객체간의 결합도 및 의존성을 줄이고 의존성 역전은 그 결과 부수적으로
가능하게된것은 아닐까?
OOP는 IF문을 줄일수가 있다.
(사실 이건 언어적 관점에서 IF문을 줄일수 있는것이다. 결과적으로 비교하는 로직은 없앨 수가 없다.)
하지만 다형성으로 IF문을 줄일수 있다는것은 주객이 전도된 이야기가 아닐까생각한다.
즉 IF문을 줄이기위해(결합도를 낮추기위해) 생겨난 , 필요한 특성이 아닐까?
p.s 강규영님의 의존성역전과 순환참조는 재미있게 읽었습니다.