인터페이스적용 오리객체설계하기 ) 청둥오리, 물오리를설계하세요. 1 단계 : 필요한객체설계 class 청둥오리 { class 물오리 { 청둥오리 mallardduck = new 청둥오리 (); 물오리 redheadduck = new 물오리 (); mallardduck.swim(); mallardduck.fly(); mallardduck.quack(); redheadduck.swim(); redheadduck.fly(); redheddduck.quack();
2 단계 : 추상화 class 오리 { class 청둥오리 extends 오리 { class 물오리 extends 오리 { 청둥오리 mallardduck = new 청둥오리 (); 물오리 redheadduck = new 물오리 (); mallardduck.swim(); mallardduck.fly(); mallardduck.quack(); redheadduck.swim(); redheadduck.fly(); redheddduck.quack();
새로운요구사항의발생 고무인형오리와모형오리를추가하세요. class 고무인형오리 extends 오리 { class 모형오리 extends 오리 { 청둥오리 mallardduck = new 청둥오리 (); 물오리 redheadduck = new 물오리 (); mallardduck. 헤엄친다 (); mallardduck. 난다 (); mallardduck. 운다 (); redheadduck. 헤엄친다 (); redheadduck. 난다 (); redheddduck. 운다 (); 고무인형오리 rubberduck = new 고무인형오리 (); 모형오리 modelduck = new 모형오리 (); rubberduck. 헤엄친다 (); rubberduck. 난다 ();// 문제발생!!! 고무인형오리는날지못한다. rubberduck. 운다 ();// 문제발생!!! 고무인형오리는꽥꽥울지못한다. 삑삑소리가난다. modelduck. 헤엄친다 (); modelduck. 난다 ();// 문제발생!!! 모형오리는날지못한다. modelduck. 운다 ();// 문제발생!! 모형오리는소리내지못한다.
3 단계 : 안터페이스도입 고무인형오리와모형오리가할수없는행위들을인터페이스로설계한다. interface Flyable { void 난다 (); interface Quackable { void 운다 (); class 오리 { class 청둥오리 extends 오리 implements Flyable, Quackable { class 물오리 extends 오리 implements Flyable, Quackbable {
class 고무인형오리 extends 오리 implements FlyBehavior, Quackable { System.out.println(" 삑삑소리낸다. ); System.out.println(" 하늘을날지못한다. ); class 모형오리 extends 오리 implements FlyBehavior, Quackable { System.out.println(" 소리내지못한다. ); System.out.println(" 하늘을날지못한다. ); 오리 mallardduck = new 청둥오리 (); 오리 redheadduck = new 물오리 (); mallardduck. 헤엄친다 (); mallardduck. 난다 (); mallardduck. 운다 (); redheadduck. 헤엄친다 (); redheadduck. 난다 (); redheddduck. 운다 (); 오리 rubberduck = new 고무인형오리 (); 오리 modelduck = new 모형오리 (); rubberduck. 헤엄친다 (); rubberduck. 난다 (); rubberduck. 운다 (); modelduck. 헤엄친다 (); modelduck. 난다 (); modelduck. 운다 ();
기존의설계를상당히많이변경해야한다. 새로운행위가추가될경우새로운인터페이스를도입하고, 모든하위클래스에이를반영해야한다. 이런식의변경은바람직하지않다. 3 단계 : 기존설계에서변경되는부분을분리한다. 변경된행위를정의한다. 객체지형적인설계방침을적용한다. 객체지향적인설계방침 1 : 객체에서달라지는부분을찾아내고, 달라지지않는부분으로부터분리한다. 객체지향적인설계방침 2 : 클래스로구현보다는인터페이스에맞춰서설계한다. 오리에서달라지는부분은난다 () 와운다 () 임을확인한다. interface FlyBehavior { void 난다 (); class 정말난다 implements FlyBehavior { System.out.println(" 진짜로하늘을난다. ); class 날지못한다 implements FlyBehavior { System.out.println(" 하늘을날지는못한다. ); interface QuackBehavior { void 운다 (); class 꽥꽥운다 implements QuackBehavior { class 삑삑운다 implements QuackBehavior { System.out.println(" 삑삑운다. ); class 울지못한다 implements QuackBehavior { System.out.println(" 울지못한다. );
class 오리 { FlyBehavior flybehavior;// 나는행위를 Duck 클래스에포함시킨다. QuackBehavior quackbehavior;// 우는행위를 Duck 클래스에포함시킨다. quackbehavior. 운다 ();// 더이상 Duck 객체가직접우는행위는하지않는다. // 이행위는변경되는부분이므로, // 구체적으로변경된우는행위를하는객체의행위로대신한다. flybehavior. 난다 ();// 더이상 Duck 객체가직접나는행위를하지않는다. // 이행위는변경되는부분이므로, // 구체적으로변경된나는행위를하는객체의행위로대신한다. class 청둥오리 extends 오리 { 청둥오리 () { quackbehavior = new 꽥꽥운다 ();// 우는행위를설정 flybehavior = new 정말난다 ();// 나는행위를설정 class 물오리 extends 오리 { 물오리 () { quackbehavior = new 꽥꽥운다 ();// 우는행위를설정 flybehavior = new 정말난다 ();// 나는행위를설정 class 고무인형오리 extends 오리 { 고무인형오리 () { quackbehavior = new 삑삑운다 ();// 우는행위를설정 flybehavior = new 날지못한다 ();// 나는행위를설정
class 모형오리 extends 오리 { 모형오리 () { quackbehavior = new 울지못한다 ();// 우는행위를설정 flybehavior = new 날지못한다 ();// 나는행위를설정 오리 mallardduck = new 청둥오리 (); 오리 redheadduck = new 물오리 (); mallardduck. 헤엄친다 (); mallardduck. 난다 (); mallardduck. 운다 (); redheadduck. 헤엄친다 (); redheadduck. 난다 (); redheddduck. 운다 (); 오리 rubberduck = new 고무인형오리 (); 오리 modelduck = new 모형오리 (); rubberduck. 헤엄친다 (); rubberduck. 난다 ();// 오리처럼나는행위는있지만, 사실상날지못하는기능의나는행위임. rubberduck. 운다 ();// 오리처럼우는행위는있지만, 사실상삑삑소리내는기능의우는행위임. modelduck. 헤엄친다 (); modelduck. 난다 ();// 오리처럼나는행위는있지만, 사실상날지못하는기능의나는행위임. modelduck. 운다 ();// 오리처럼우는행위는있지만, 사실상아무소리도못내는기능의우는행위임.
새로운요구사항의발생 로케트추진장난감오리를추가하세요. 새로운나는형태인 로케트추진 은하늘을나는행위의일종이므로 FlyBehavior의하위클래스로구현한다. class 로케트로난다 implements FlyBehavior { System.out.println(" 로케트추진으로난다. ); 로케트추진장난감오리의생성자에서 울지못하는 행위와 로케트추진으로나는 행위를설정한다. class 로케트추진오리 extends 오리 { 로케트추진오리 () { flybehavior = new 로케트로난다 (); quackbehavior = new 울지못한다 (); 오리 mallardduck = new 청둥오리 (); 오리 redheadduck = new 물오리 (); mallardduck. 헤엄친다 (); mallardduck. 난다 (); mallardduck. 운다 (); redheadduck. 헤엄친다 (); redheadduck. 난다 (); redheddduck. 운다 (); 오리 rubberduck = new 고무인형오리 (); 오리 modelduck = new 모형오리 (); rubberduck. 헤엄친다 (); rubberduck. 난다 (); rubberduck. 운다 (); modelduck. 헤엄친다 (); modelduck. 난다 (); modelduck. 운다 (); 오리 rocketpoweredduck = new 로케트추진오리 (); rocketpoweredduck. 헤엄친다 (); rocketpoweredduck. 난다 ();// 오리처럼나는행위는있지만, 사실상로케트로나는행위임 rocketpoweredduck. 운다 ();// 오리처럼우는행위는있지만, 사실상아무소리도못내는행위임.