반응형

 클래스 다어어그램을 그리거나 보고있다보면 가끔 개념이 헷갈릴 때가 있다.

이유를 곱씹어보자면, 그 이유는, 클래스 다이어그램은 객체의 실행과정 (행동)이 나타나있지 않기 때문이다. 더나아가, 생성과정 또한 나타나있지 않아서, 전체적이 흐름이 이해가 안될 때가 있다.

 이런 헷갈리는 개념을, 정리해보겠다.

 

 아래와 같은 그림이 있다고 하자.

우선, 알 수 있는 사실은 아래와 같다.

사실 1. SubGame은 Animal을 사용한다. (매개변수던, 멤버변수로써든)

사실 2. 그리고 Cat은 Animal을 상속받는다.

 

그렇다면, 위를 바탕으로,

우리는 과연, 이 클래스 다이어그램을 어떻게 이해해야할까?

바로 아래와 같이 이해해야한다.

1. SubGame이 생성되는 시점(혹은 메서드 호출 시점)에 구체적인 동물(e.g. Cat)이 정해지는 구나.

라는 것이다. 더 나아가, 반드시, 구현된 객체를 받아야한다. (예를들어, Cat이 되어야한다.)

(인터페이스는 인스턴스화 할 수 없다는 사실을 명심해라.)

 

왜냐하면, 우리는 인터페이스를 인스턴스화 할 수 없는 당연한 개념때문이다.

 

아래의 코드를 보라,

SubGame을 실행하는 클라이언트는 1)과 2)만 을 활용할 수 있고, 3)은 애초에 실행자체가 안된다.

(이유는, 구현된 객체를 인자로 넘겨주지 않았기 때문이다.)

 

1) 실행됨, 올바른 코드

main() {
	..
	Animal an = new Cat();
	SubGame.process(an);    혹은 SubGame sg = new SubGame(an);
	..
}

 

2) 실행됨, 올바른 코드

main() {
	..
	Cat c = new Cat();
	SubGame.process(c);    혹은 SubGame sg = new SubGame(c);
	..
}

 

3) 이건 실행조차 안됨, 잘못된 코드

main() {
	..
	Animal an = new Animal(); // 여기서 에러.
	SubGame.process(an);    혹은 SubGame sg = new SubGame(an);
    ..
}

 

결론만 말하면, 위와 같은 구조는,

결론 1. SubGame은 Animal을 매개변수로써 사용하는데, (더 나아가, 멤버변수로도 사용할 수 있음)

반드시, 인터페이스가 아닌, 구현된 객체로 매개변수로 받는 다는 사실.

(이것이 다형성이다.)

 

결론 2. 다형성을 구현하면, 런타임 시에 구현된 객체를 기준으로, 처리할 수 있다.

 

 

아래의 스토리도 한번 보자.

알 수 있는 사실은 아래와 같다.

사실 1. SubGame은 Game을 상속받는다.

사실 2. Cat은 Animal을 상속 받는다.

 

이해할 수 있는 사실은 아래와 같다.

Client가 생성되는 시점(혹은 메서드 호출 시점)에 게임/동물이 결정된다.라는 것이다. (다형성)

(e.g. Client c = new Client(new SubGame(new Cat())))

 

위의 부분을 주의해서, 다시 클래스 다이어그램을 보라.

그러면, 생성시점과 객체의 실행흐름이 보일 것이다.

 

도움이 되었으면 좋아요 부탁드립니다.

반응형