Java/패스트캠퍼스

추상 클래스

hs_developer 2022. 6. 5. 21:42

추상 클래스 구현하기

 

-메서드에 구현 코드가 없으면 abstract로 선언

 

-abstract로 선언된 메서드를 가진 클래스는 abstract로 선언

 

-모든 메서드가 구현 된 클래스라도 abstract로 선언되면 추상 클래스로 인스턴스화 할 수 없음

 

-추상 클래스에서 추상 메서드는 하위 클래스가 상속해서 구현

 

-추상 클래스 내의 추상 메서드 : 하위 클래스가 구현해야 하는 메서드

 

-추상 클래스 내의 구현 된 메서드 : 하위 클래스가 공통으로 사용하는 메서드 (필요에 따라 하위 클래스에 재정의 함)

 

 

 

Desktop display
Desktop typing
Desktop turnOff
public class ComputerTest {

	public static void main(String[] args) {
		
		Computer computer = new Desktop(); // Computer가 Desktop의 상위클라스라서 대체가능
		
		computer.display();
		computer.typing();
		computer.turnOff();
		
		Notebook myNote = new MyNotebook();
	}
}
public abstract class Computer { // abstract 메서드 있으면 클래스에도 abstract 붙임

	abstract void display();
	abstract void typing();
		
	public void turnOn()
	{
		System.out.println("전원을 켭니다.");
	}
	
	public void turnOff()
	{
		System.out.println("전원을 끕니다.");
	}
	
	/* 
	 * Computer가 turnOn과 turnOff만 할 줄 알아서
	 * 하위 클래스들한테 display, typing 시킨다.
	 * 
	 * Computer는 전체 클래스에 공통으로 쓸 turnOn, turnOff만 구현한다.
	 */
}
public class Desktop extends Computer {

	@Override
	public void display() {
		System.out.println("Desktop display");
	}

	@Override
	public void typing() {
		System.out.println("Desktop typing");
	}

	public void turnOff() // Computer에서 정의했지만 하위클래스에서 재정의 가능
	{
		System.out.println("Desktop turnOff");
	}
	
	
}
public abstract class Notebook extends Computer {
// Computer에 미구현 메서드 display는 구현하지 않아 abstract 붙인다
	
	@Override
	public void typing() {
		System.out.println("Notebook typing");
	}

	
}
public class MyNotebook extends Notebook {

	@Override
	public void display() {
		System.out.println("MyNotebook display");
	}
}

 

 

 

추상화 템플릿

 

예제

 

자율 주행한다.
자동차가 스스로 방향을 바꾼다.
스스로 멈춘다.
시동 켠다.
시동 끈다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
사람이 운전한다.
사람이 핸들 조작한다.
브레이크를 밟아 정지한다.
시동 켠다.
시동 끈다.
public class CarTest {

	public static void main(String[] args) {
		
		Car aiCar = new AICar();
		
		aiCar.run();
		
		System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
		
		Car manualCar = new ManualCar();
		
		manualCar.run();
	}
}
public abstract class Car {

	public abstract void drive();
	public abstract void stop();
	
	public void startCar() 
	{
		System.out.println("시동 켠다.");
	}
	
	public void turnOff()
	{
		System.out.println("시동 끈다.");
	}
	
	final public void run()
	{
		drive();
		stop();
		startCar();
		turnOff();
	}
}
public class AICar extends Car {

	@Override
	public void drive() 
	{
		System.out.println("자율 주행한다.");
		System.out.println("자동차가 스스로 방향을 바꾼다.");
	}

	@Override
	public void stop() 
	{
		System.out.println("스스로 멈춘다.");
	}

}
public class ManualCar extends Car {

	@Override
	public void drive() 
	{
		System.out.println("사람이 운전한다.");
		System.out.println("사람이 핸들 조작한다.");	
	}

	@Override
	public void stop() 
	{
		System.out.println("브레이크를 밟아 정지한다.");
	}

}

 

 

 

final 예약어

-final 변수 : 값이 변경될 수 없는 상수

-final 메서드 : 하위 클래스에서 재정의 할 수 없는 메서드

-final 클래스 : 상속할 수 없는 클래스