추상 클래스
위와 같이 에러가 발생한다. 그 이유는 Car2는 추상클래스이기 때문에 인스턴스화 할 수 없다.
템플릿 메소드 패턴(Template Method Pattern)으로 배우는 추상 클래스
라고 선배 개발자가 말했다고 상상해보자.
Controller는 다음과 같은 기능을 가진다.
1. 초기화 - 같은 코드
2. 실행 - 다른 코드
3. 마무리 - 같은 코드
abstract를 이용해 Controller를 추상클래스로 만들었다.
execute()를 실행하게 되면 this(자신의)init 메소드를 실행하고, run(), close() 순서대로 메소드를 실행하게 된다.
위와 같이 내가 가지고 있는 메소드들을 호출하고, 어떠한 순서를 가지고 있을 때, 이러한 메소드를 템플릿 메소드라고 한다.
Controller를 상속받는 클래스를 만들어보자.
오류가 뜨는 이유는 추상클래스를 상속 받았는데 메소드를 구현하지 않았기 때문이다.
오류를 없애보자.
그리고 FirstController와 Controller를 동작 시키기 위해 ControllerMain이라는 메인 클래스를 만들어 보자.
Controller는 추상클래스이지만 그것을 구현하는 자손 클래스(FirstController)를 참조할 수 있다.
c1.execute(); 를 실행시키면 다음과 같은 결과가 나온다.
우리는 Controller는 3단계를 처리했으면 좋겠다.
즉 사용자가 init(), close()를 직접호출하지 않고,
excute 메소드를 이용해 init, run, close가 호출되게 만들었다.
init, close 메소드는 내용이 변경되길 변하지 않으므로, 사용자가 직접 호출할 수 없도록 할 필요성이 있다.
위와 같이 public -> protected 로 바꾸어 주자.
위와 같이 init, close는 사용할 수 없게 변경이 된다.
위와 같은 결과가 나온다. 그 이유는 메소드가 오버라이딩 되면 무조건 자식의 메소드가 실행되기 때문이다.
따라서 init과 close를 오버라이딩 할 수 없게만들어 줘야 한다.
위와 같이 final을 붙이면 해당 메소드는 오버라이딩 할 수 없게 된다.
부모가 될 수 없는 클래스
String은 final 클래스이기 때문에 상속 받을 수 없다.