- 추상 클래스란
: 추상 메서드를 항상 포함하는 클래스이며 추상 메서드는 함수의 구현 코드가 없고, abstract 예약어를 사용하여 선언만 하는 메서드다.
- 메서드 선언 의미
: 메서드 선언은 봐도 어떤 일을 하는 메서드인지 알 수 있다. 함수의 선언부 즉, 반환 값, 함수 이름, 매변수를 정의한다는 것은 곧 함수의 역할이 무엇인지, 어떻게 구현하는지 정의한다는 뜻이다.
- 추상 클래스 구현하기

-> 완전하게 구현되지 않은 두 추상 메서드에서 오류 발생
.PNG)
-> 오류 해결 : 추상 클래스와 메서드에 abstract 예약어 추가
.PNG)
-> 추상 클래스를 상속 받은 하위 클래스는 구현되지 않은 추상 메서드를 모두 구현해야 구체적인 클래스가 된다. displya(), typing() 추상 메서드의 몸체 코드를 작성했다.
.PNG)
-> display() 하나만 구현했다. 추상 메서드를 하나 가지고 있기 때문에 추상 클래스가 된다.
.PNG)
-> MyNoteBook은 모든 추상 메서드가 구현된 클래스이므로 abstract 예약어를 사용하지 않는다.
- 추상 클래스를 만드는 이유
.PNG)
-> 추상 클래스는 인스턴스로 생성할 수 없다. 추상 클래에서 구현하는 메서드는 하위 클래스에서도 사용할, 즉 하위 클래스에서도 구현 내용을 공유할 메서드를 구현한다.
- 템플릿 메서드
: 틀이 있는 메서드

-> 자동차 시동의 켜고 끄는 방법은 어느 차나 같기 때문에 starCar()와 turnOff()는 미리 코드를 구현해두었고 drive()와 stop()은 차종에 따라 다른 방식으로 움직일 수 있기 때문에 추상 메서드로 선언했다. 이 중15~20행은 자동차가 달리는 방법을 순서대로 구현해 둔 템플릿 메서드이다.


-> 두 클래스 모두 Car 클래스를 상속 받고 추상 메서드인 drive()와 stop()을 구현했다.

- 템플릿 메서드의 역할
: 메서드 실행 순서와 시나리오를 정의. 템플릿 메서드는 실행 순서, 즉 시나리오를 정의한 메서드이므로 바꿀 수 없다. 메서드 앞에 final 을 사용하면 상속받은 하위 클래스가 메서드를 재정의 할 수 없다. 템플렛 메서드는 로직 흐름이 이미 정해져 있는 프레임워크에서 많이 사용하는 기본 구현 방법이다.
- 공통으로 사용하는 메서드를 상위 클래스에 추가하기
%20%EA%B3%B5%ED%86%B5%EC%9C%BC%EB%A1%9C%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EB%A9%94%EC%84%9C%EB%93%9C%EB%A5%BC%20%EC%83%81%EC%9C%84%20%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90%20%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0_Car.PNG)
-> wiper() 추상 메서드 추가
%20%EA%B3%B5%ED%86%B5%EC%9C%BC%EB%A1%9C%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EB%A9%94%EC%84%9C%EB%93%9C%EB%A5%BC%20%EC%83%81%EC%9C%84%20%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90%20%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0_AICar.PNG)
%20%EA%B3%B5%ED%86%B5%EC%9C%BC%EB%A1%9C%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EB%A9%94%EC%84%9C%EB%93%9C%EB%A5%BC%20%EC%83%81%EC%9C%84%20%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90%20%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0_ManualCar.PNG)
-> 두 클래스에서 wiper() 추상 메서드를 구현
%20%EA%B3%B5%ED%86%B5%EC%9C%BC%EB%A1%9C%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EB%A9%94%EC%84%9C%EB%93%9C%EB%A5%BC%20%EC%83%81%EC%9C%84%20%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90%20%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0_CarTest.PNG)
- 템플릿 메서드 응용하기






-> Player 클래스와 PlayerLevel 클래스는 포함(HAS-A) 관계이다. 게임에서 모든 Player는 자신의 레벨이 있기 때문에 Player클래스에서 PlayerLevel을 멤버 변수로 갖는다. 레벨이 올라갈수록 수행하는 기능이 달라지기 때문에 PlayerLevel 클래스를 추상 클래스로 만들어 모든 레벨에서 공통으로 수행하는 기능을 구현하고, 각 레벨마다 달라지는 기능은 추상 메서드로 만들었다. PlayerLevel을 상속받은 BeginnerLevel, AdvancedLevel, SuperLevel에서 추상 메서드로 선언한 부분을 필요에 맞게 구체적으로 구현했다.
- final 예약어
: 마지막으로 정한 것이니 더 이상 수정할 수 없다는 뜻이다.
final 변수 - 상수
final 메서드 - 하위 클래스에서 재정의 할 수 없음
final 클래스 - 상속 할 수 없음

- 여러 자바 파일에서 공유하는 상수 값 정의하기

