/// 17. 추상 클래스란?
| 추상 클래스
추상 메서드를 포함한 클래스
추상 메서드
- 구현 코드가 없이 선언부만 있는 메서드
abstract 예약어 사용
추상 클래스는 new (인스턴스화) 할 수 없음
cf) concrete class : 추상 메서드가 아닌 지금까지 코딩했던 클래스들
- 선언부의 요소 : 반환값, 메서드 이름, 매개변수
| 설명
상위 클래스에서 선언을 하고 구현의 책임을 하위 클래스에서 위임
> 상속 받은 클래스가 구현을 해야한다
하나의 추상 메서드라도 포함하면
( 1개 이상의 추상 메서드가 있는데 일부분만 구현 시 )
추상 클래스
| 추상 클래스 구현
메서드와 클래스에 abstract 키워드 사용
추상 메서드가 포함된 클래스는 추상 클래스로 선언
모든 메서드가 구현되었다고 해도 클래스에 abstract 키워드를 사용하면 추상 클래스
/// Computer.java ///
package abstractex;
public abstract class Computer{
public abstract void display();
public abstract void typing();
// + 바디가 비어있는 것과 추상 메서드는 다름
public void turnon(){
System.out.println(“전원을 켭니다”);
}
public void turnoff(){
System.out.println(“전원을 끕니다”);
}
}
/// Desktop.java ///
package abstractex;
public class DeskTop extends Computer(){
@override
public abstract void display(){
System.out.println(“DeskTop display”);
}
@override
public abstract void typing(){
System.out.println(“DeskTop typing”)
}
}
/// NoteBook.java ///
package abstractex;
public abstract class NoteBook extends Computer(){
@override
public void typing(){
System.out.println(“NoteBook typing”);
}
/// 하위 클래스에서 상위 클래스 메서드를 오버라이드 하는 경우
@override
public void turnoff(){
System.out.println(“Turn off the NoteBook”);
}
}
/// MyNoteBook.java ///
package abstractex;
public class MyNoteBook extends NoteBook(){
public void display(){
System.out.println(“NoteBook display”);
}
}
/// ComputerTest.java ///
package abstractex;
public static void main(String[] args){
Computer computer = new DeskTop();
computer.display();
computer.turnoff();
Note MyNote = new MyNoteBook();
}
| 추상 클래스 사용하기 ( 정리 )
추상 클래스는 주로 상속의 상위 클래스로 사용됨
추상 메서드 : 하위 클래스가 구현해야 하는 메서드
Form) public abstract void display();
구현된 메서드 :
하위 클래스가 공통으로 사용하는 기능의 메서드
하위 클래스에 따라 재정의 할 수 있음 ( = 오버라이딩 )
—------------—------------—------------—------------—------------—------------—------------—---------------—------------—------------—------------—------------—------------—------------—------------—---------------
/// 18. 추상 클래스 응용 - 템플릿 메서드
| 템플릿 메서드
템플릿 : 틀이나 견본을 의미
템플릿 메서드 :
추상 메서드나 구현된 메서드를 활용하여
전체의 흐름(시나리오)를 정의 해 놓은 메서드
final로 선언하여 재정의 할 수 없게 함
템플릿 메서드 패턴:
디자인 패턴의 일종
프레임 워크에서 많이 사용되는 설계 패턴
추상 클래스로 선언된 상위 클래스에서 추상 메서드를 이용하여
전체 구현의 흐름을 정의하고 구체적인
각 메서드 구현은 하위 클래스에 위임함
하위 클래스가 다른 구현을 했다고 해도
템플릿 메서드에 정의된 시나리오 대로 수행됨
| 템플릿 메서드 구현하기 예제
<논리>
Car | |
startCar() drive() stop() turnOff() run() |
|
AICar | ManualCar |
+ Bold체는 이미 구현된 클래스
/// Car.java ///
package template;
public abstract class Car()
{
public abstract void drive();
public abstract void stop();
public void startCar()
{
System.out.println(“시동을 켭니다");
}
public void turnoff()
{
System.out.println(“시동을 끕니다");
}
// 훅 메서드
public void washCar()
{
}
/// 템플릿 메서드 ( final 이용 )
final public void run()
{
startCar();
drive();
stop();
turnoff();
washCar();
}
}
/// AICar.java ///
package template;
public class AICar extends Car()
{
public void drive()
{
System.out.println(“자율 주행합니다”);
System.out.println(“자동차가 스스로 방향을 바꿉니다”);
}
public void stop()
{
System.out.println(“스스로 멈춥니다”);
}
public void washCar()
{
System.out.println(“자동 세차합니다”);
}
}
/// ManualCar.java ///
package template;
public class ManualCar extends Car()
{
public void drive()
{
System.out.println(“사람이 운전합니다”);
System.out.println(“사람이 핸들을 조작합니다”);
}
public void stop()
{
System.out.println(“브레이크를 밟아서 정지합니다”);
}
}
/// CarTest.java ///
package template;
public static void main(String[] args)
{
Car aiCar = new AICar();
aiCar.run();
Car manualCar = new ManualCar();
manualCar.run();
}
| final 예약어
final 변수는 값이 변경될 수 없는 상수임
public static final double PI = 3.14;
오직 한 번만 값을 할당할 수 있음
final 메서드는 하위 클래스에서 재정의 (overriding) 할 수 없음
final 클래스는 더 이상 상속되지 않음
Ex) java의 String 클래스
| public static final 상수 값 정의하여 사용하기
프로젝트 구현 시 여러 파일에서 공유해야 하는 상수 값은
하나의 파일에 선언하여 사용하면 편리함
/// Define.java ///
package literal;
public class Define
{
public static final int MIN = 1;
public static final int MAX = 99;
public static final String GOOD_MORNING = “Good Morning”;
}
/// UsingDefine.java ///
package literal;
public class UsingDefine
{
System.out.println(Define.MIN);
System.out.println(Define.MAX);
System.out.println(Define.GOOD_MORNING);
}
—------------—------------—------------—------------—------------—------------—------------—---------------—------------—------------—------------—------------—------------—------------—------------—---------------
// 19. 템플릿 메서드 활용하기
| 템플릿 메서드 활용 예제
Player가 존재하고, 게임을 합니다
게임에서 Player가 가지는 레벨아 따라
run(), jump(), turn() 세 가지 기능을 할 수 있습니다.
각 레벨에 따라 기능가능 여부가 다음과 같습니다.
초보자 레벨 : 천천히 달립니다 ( run() 가능 )
중급자 레벨 : 빠르게 달리고 ( run() 가능 ) 점프 ( jump() 가능 ) 할 수 있습니다.
고급자 레벨 : 매우 빠르게 달리고 ( run() 가능 ) 점프 ( jump() 가능 ) 하고
한 바퀴 돌 수 있습니다.( turn() 가능 )
플레이어는 go() 명령어를 받으면 이 세 가지 기능을 수행합니다.
이중 할 수 없는 것은 할 수 없다는 메세지를 보냅니다.
| 템플릿 메서드 활용 예제
getLevel() upgradeLevel(PlayerLevel) play() |
▼ |
PlayerLevel | ||
run() jump() turn() showLevelMessage() go(int) |
||
▲ | ▲ | ▲ |
BeginnerLevel | AdvancedLevel | SuperLevel |
run() jump() turn() showLevelMessage() |
run() jump() turn() showLevelMessage() |
run() jump() turn() showLevelMessage() |
—------------—------------—------------—------------—------------—------------—------------—---------------—------------—------------—------------—------------—------------—------------—------------—---------------
/// 20. 코딩해보세요
| 자동차 주행 과정 구현하기
Car 추상 클래스를 상속 받는 Sonata, Avante, Grandeur, Genesis 클래스가 있다.
각 차는 주행하기 위해 다음 메서드의 순서로 움직인다.
run() { start(); drive(); stop(); turnoff(); } |
| CarTest 클래스와 실행 결과
package chapter9;
import java.util.ArrayList;
public class CarTest
{
public static void main(String[] args)
{
ArrayList<Car> carList = new ArrayList<Car>;
carList.add(new Sonata());
carList.add(new Grandeur());
carList.add(new Avante());
carList.add(new Genesis());
for(Car car : carList)
{
car.run();
System.out.println(“=============”);
}
}
}
—-----------—-----------—-----------—-----------—-----------—-----------—-----------—-----------
—-----------—-----------—-----------—-----------—-----------—-----------—-----------—-----------
이 정리 내용은 패스트 캠퍼스, K-Digital Credit Java 강의를 참고했습니다