[소프트웨어] 클래스 다이어그램에 대한 고찰
2022. 1. 6. 14:02클래스 다어어그램을 그리거나 보고있다보면 가끔 개념이 헷갈릴 때가 있다.
이유를 곱씹어보자면, 그 이유는, 클래스 다이어그램은 객체의 실행과정 (행동)이 나타나있지 않기 때문이다. 더나아가, 생성과정 또한 나타나있지 않아서, 전체적이 흐름이 이해가 안될 때가 있다.
이런 헷갈리는 개념을, 정리해보겠다.
아래와 같은 그림이 있다고 하자.
우선, 알 수 있는 사실은 아래와 같다.
사실 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())))
위의 부분을 주의해서, 다시 클래스 다이어그램을 보라.
그러면, 생성시점과 객체의 실행흐름이 보일 것이다.
도움이 되었으면 좋아요 부탁드립니다.
'소프트웨어(Software)' 카테고리의 다른 글
[소프트웨어] 소프트웨어 개발 프로세스 생각해보기 (0) | 2022.01.10 |
---|---|
(비공개) [소프트웨어] Adapter 패턴 (어댑터 패턴) (0) | 2022.01.06 |
(비공개) [디자인패턴] Proxy 패턴 (프록시패턴) (0) | 2022.01.06 |
[디자인패턴] Composite패턴(컴포지트패턴)이란? (0) | 2022.01.06 |
[소프트웨어] dip (비공개) (0) | 2022.01.06 |