일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 파이팅
- 개발자
- exception
- 졸리다
- ArrayList
- 배열
- FileInputStream
- 자바
- 코린이
- 상속
- 초보개발자
- 보조 스트림
- Java
- 문자 단위 스트림
- 메서드
- MPA
- 인터페이스
- 자료형
- node.js
- 변수
- 예외 처리
- 백엔드
- 새벽공부
- 코딩
- SSR
- try-catch
- throws
- 인스턴스
- 다형성
- 바이트 단위 스트림
- Today
- Total
SHUSTORY
09-3 템플릿 메서드 응용하기 본문
예제를 통해 템플릿 메서드 구현하기
Player가 있고, 레벨은 초보자 / 중급자 / 고급자로 세 가지가 있다.
초보자는 run / 중급자는 run, jump / 고급자는 run, jump, turn이 가능하다.
모든 레벨에서 Player가 go를 하면 한 번 run하고, 매개변수로 전달받은 count만큼 jump하고, 한 번 turn한다.
해당 레벨에서 불가능한 기능을 요청하면 할 수 없다는 메세지를 출력한다.
클래스 기능과 관계
예제 시나리오를 코드로 구현하기 전에 무조건 클래스를 만들어 코딩하는 것보다 주어진 문제를 어떻게 해결할 것인지
생각해보고, 손으로 클래스 다이어그램을 간단히 그려보는 것이 객체 지향 방식으로 문제를 해결하는 좋은 습관이다.
큰 프로젝트를 진행할 때는 이 과정을 분석 / 설계 과정이라고 한다.
만약 위 예제를 if문을 통해 해결하려 한다면, 코드가 길어지고 중복되어 복잡해질 것이다.
클래스 설계하기
각 플레이어가 가질 수 있는 레벨을 클래스로 분리하자.
각 레벨마다 공통 기능과 개별 기능이 있으므로 레벨 클래스를 상속 관계로 표현해보자.
이 모든 클래스는 동일한 패키지에 만들어야 프로그램이 제대로 실행된다.
* 다이아몬드 표시는 포함 관계를 나타낸다.
게임에서 모든 Player는 자신의 레벨이 있기 때문에, Player 클래스에서 PlayerLevel을 멤버 변수로 갖는 것이다.
레벨이 오를수록 수행 가능한 기능이 달라지므로 PlayerLevel 클래스를 추상 클래스로 만들어
모든 레벨에서 공통으로 수행하는 기능을 구현하고, 각 레벨마다 달라지는 기능은 추상 메서드로 만들어 둔다.
Player가 가질 수 있는 여러 레벨을 별도의 자료형으로 선언하지 않고 PlayerLevel로 선언한다.
레벨을 변경하는 upgradeLevle( ) 메서드의 매개변수 자료형도 PlayerLevel로 작성한다.
이에 따라 레벨 클래스가 여러 개 존재하더라도 모든 클래스는 PlayerLevel 클래스로 대입될 수 있다.
추상 클래스에 선언된 메서드를 호출하면 가상 메서드에 의해 각 클래스에 구현된 기능이 호출된다.
즉 하나의 코드가 다양한 자료형을 대상으로 동작하는 다형성을 활용할 수 있다.
모든 추상 클래스에 템플릿 메서드가 사용되는 것은 아니지만 추상 클래스를 활용할 수 있는 좋은 패턴이다.
'프로그래밍 > JAVA' 카테고리의 다른 글
10-1 인터페이스 (0) | 2023.03.05 |
---|---|
09-4 final 예약어 (0) | 2023.03.04 |
09-2 템플릿 메서드 (0) | 2023.03.02 |
09-1 추상 클래스 (0) | 2023.03.02 |
08-6 다운 캐스팅과 instanceof (0) | 2023.03.02 |