2009. 9. 18. 14:48 Programming/Design Pattern

흔히 디자인 패턴이란 말은 알지만 현업에선 활용도가 낮은 편이다.
설령 꼭 그렇지는 않아도 그렇게 되는 경우가 빈번하다. 아무래도 미래를 생각하기보단 현실에 안주하기 때문일 것이다. 이는 개발자의 문제일 수도 있지만 외부 환경이 그렇게 만들수도 있다.
일단 일정이 수립되면 죽이되던 밥이되던 일정을 엄수해야 한다. 그렇지 않으면 이래저래 눈치보게 되고 스트레스가 배가된다. 솔직히 서비스를 개발하는데 있어 기술을 중시하기 보단 기획이나 서비스의 성공을 중요시하는 풍토가 있어서 그러한것 같다.

하지만 이런 문제점을 회사도 인식하는 풍토가 형성되고 있다는게 희망적이다. 그 당시의 기준에 맞춰 개발한 부분이
추후 확장된 개념이나 추가 개념이 필요할때 처음부터 다시 만들어야 된다는 것을 알게되면 회사로서로 당황스러운 일이기 때문이다. 이때문에 초기 개발기간이 다소 길어지더라도 확장성을 염두한 개발을 한다면 상황에 유연하게 대처할 수 있다. 얼마나 좋은 일인가?

그럼 이와 관련된 예를 생각해보도록 하겠다.

홍길동은 오리 연못 시물레이션 게임을 만드는 회사에 다니고 있다. 이 게임에는 헤엄도 치고, 소리도 내는 다양한 오리 종류를 보여준다. 이 시스템은 표준적인 객체지향 기법을 사용하여 Duck이라는 슈퍼클래스를 만든 다음, 그 클래스를 확장하여 다른 모든 종류의 오리를 만들었다.

--------------------------
          Duck   
--------------------------
quack() {
//꽥꽥 소리내는 기능 구현
}

swim() {
//헤엠치는 기능 구현
}

display()   //모든 오리들의 모양이 다르기 때문에 추상 메소드화    

//기타 오리 관련 메소드
---------------------------
            |          |  
            |          ---------------------------------------          
            |                                                                    |
-----------------------                                     ---------------------
    MallardDuck                                                    RedheadDuck
-----------------------                                     ---------------------
display() {                                                          display() { 
//적당한 모양을 표시                                            //적당한 모양을 표시
}                                                                        }


                                            <초기 디자인>


오리들을 날아 다닐 수 있도록 해달라는 요청이 들어왔다.
그래서 초기 디자인을 기반으로 Duck클래스에 fly()메소드만 추가 하면 모든 오리들이 상속 받을 수 있다 판단한다.

그런데 심각한 문제가 생겼다. 모든 오리가 날 수 있는게 아니라고 한다. 그리고 소리도 재각기 다르게 해달라고 한다.
고민거리가 생겼다 Duck 수퍼클래스에 fly() 메소드가 추가되면서 일부 서브 클래스에서 적합하지 않은 행동이 전부
추가된 것이다. 코드의 한 부분만을 바꿈으로 해서 프로그램 전체에 부작용이 발생하게 된것이다. 그리고 기존의 소리를 구현한 quack()메소드도 고민의 대상이 되었다.

이와 같은 경우 대처방안은 어떤게 있을까?

이렇게 해보면 어떨까?

서브 클래스에서 quack(), fly() 메소드를 오버라이드 한다.

-----------------------                                     ---------------------
    MallardDuck                                                    RedheadDuck
-----------------------                                     ---------------------
quack() {                                                            quack() {
//적당한 소리                                                       //적당한 소리
}                                                                        }

fly() {                                                                 fly() {
//날수 있던지 아니던지                                         //날수 있던지 아니던지
}                                                                        }

display() {                                                          display() { 
//적당한 모양을 표시                                            //적당한 모양을 표시
}                                                                        }


이와 같은 경우 Duck 행동을 제공하는 데 있어서 상속을 사용할 때 단점이 될 수 있는건 무엇일까?

1. 서블클래스에서 코드가 중복된다.
2. 모든 오리의 행동을 알기 힘들다.
3. 실행시에 특징을 바꾸기 힘들다.
4. Duck 슈퍼클래스 코드를 변경했을 때 다른 오리들한테 원치 않은 영향을 끼칠 수 있다.

그렇다면 이를 해결하기 위한 방법은 어떤 것이 있을까?

- 이 종 화 (ingenuity.egloos.com) -
posted by 부풍