'인터페이스'에 해당되는 글 1건

  1. 2007.12.04 자바공부-2.메소드 오버로딩의 한계

메소드 오버로딩의 한계

 

Player 클래스는 바이올린과 플룻을 연주할 수 있습니다.








만약 연주악기가 추가 된다면 어떻게 될까요? 피아노가 추가된다면

 

package instrument;

public class Piano {

             public void sound() {

                           System.out.println("play the piano");

             }

}

예제 4 - 4 Piano.java

 

instrument 패키지에 Piano클래스가 추가되었습니다. Piano클래스가 추가되어서

연주자가 피아노를 연주할 수 있었으면 좋겠는데, 어떻게 하면 좋을까요?

일단 메소드 오버로딩 생각해 볼수 있겠습니다.

 

import instrument.*;

public class Player {

             . . .

             public void play(Piano p) {

                           p.sound();

             }

}

예제 4 - 5 Player.java

 

예제 4 - 3 Player.java 의 내용에 public void play(Piano p)를 추가했습니다.

 

악기가 또 추가 되었습니다.

package instrument;

public class Guitar {

             public void sound() {

                           System.out.println("play the guitar");

             }

}

예제 4 - 6 Guitar.java

 

Player클래스로 하여금 기타도 연주하게 하고 싶습니다. 어떻게 할까요?

물론 메소드 오버로딩을 할 수 있습니다. 하지만 이쯤 되면 느끼셨겠지만 악기가 추가 될때

마다 메소드 오버로딩을 이용해서 계속 메소드를 추가하는 형태로 Player클래스를 설계

한다면 악기가 추가 될때마다 Player 클래스도 변경이 되어야 합니다.

악기가 추가 될때 마다 추가되는 악기에 대한 메소드를 만들어 주지 않으면 연주자는

추가된 악기를 연주할 수 있는 방법이 없으니까요.

더구나 앞으로 악기가 계속해서 추가 되는 상황이라면 메소드 오버로딩을 이용한 설계는

절대로 바람직하지 않습니다. 언제 다시 수정해야 할 상황이 올지 모르니까요.

연주자와 연주악기의 관계에 있어서 연주자가 자신이 연주하는 악기에 대한 구체적인

정보를 알고 있어야 연주를 할 수 있다면, 연주자와 연주악기 사이에는 직접적인 관계가

설정이 됩니다.  자바로 설명을 하자면 Player클래스에서 연주할 Violin이나, Guitar등의

데이터형을 사용하게 되면, Player클래스와 Violin, Guitar 클래스 간에는 직접적인 관계가

생긴다는 뜻입니다.

Player클래스에서 연주악기인 Violin 클래스, Guitar에 대한 정보가 필요하다는 뜻이고,

이런 정보(Violin 클래스파일, Guitar클래스 파일)를 갖고 있어야만 컴파일이 되니까요.

Player 클래스에서 연주악기를 클래스를 import하는 순간부터 연주자 클래스는 연주악기

클래스와 관계가 생겨나게 됩니다. 그림으로 생각한다면 이렇게 될것입니다.


사용자 삽입 이미지

그림 4 - 1 [ overload uml]

 

Player클래스내에서 Piano클래스,Guitar클래스,Flute클래스,Violin클래스로 화살표가

있는 것은 Piano클래스,Guitar클래스,Flute클래스,Violin클래스를 직접 참조한다는 뜻이고

관계가 있다는 뜻입니다. Piano클래스,Guitar클래스,Flute클래스,Violin클래스가 추후

변경이 된다면 Player클래스도 영향을 받을 가능성도 존재하는 셈입니다.

최악의 상황이겠죠.아마.

 

Posted by
,