본문 바로가기

Project

정말 다형성(서브타입)이 IF를 줄일수 있을까?


 얼마전 강규영님의 글 "OOP란 조건문(if)을 줄이는 것"을 보고
정말 서브타입 다형성(subtype polymorphism) 이 if,else를 줄일수 있는가 생각해보았다.


예를들면 아래와 같은 클래스가 있다고 생각을 해보자.
식사 {
        밥() {
                if (아침) {
                   return 빵과우유;
                } else if (점심) {
                   return 짜장면;
                } else if (저녁) {
                   return 삼겹살;
                }
        }
}
아침 점심 저녁을 비교하는 세개의 IF문이 존재한다.
이 클래스를 아래와 같이 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 강규영님의 의존성역전과 순환참조는 재미있게 읽었습니다.