Java

추상 클래스

alarim 2023. 2. 18. 19:44

 

 

추상클래스

추상적인 개념을 가지고 있는 클래스이다.

구현 코드 없이 메서드의 선언만 있는 추상 메서드(abstract method)를 포함한 클래스이다.

추상 클래스는 기본적으로 new를 사용할 수 없다.

 

package ch12;

public abstract class Animal {
	
	// 추상 클래스란? (abstract class)
	//하나 이상의 주장 메서들을 포함하거나,abstract 키워들 가진 클래스
	public void move() {
		System.out.println("동물이 움직입니다.");
	}
	
	//추상 메서드 이다.
	//추상 메서드가 없어도 선언가능
	public abstract void hunt();
}
package ch12;

//public abstract class Human extends Animal { 1번 해결방안
	public class Human extends Animal {
		//기본적으로 추상 클래스는 new 할수 없다.
		// 부모 클래스에 있는 추상 메서드를 자식 클래스에서
		//일반 메서드로 재정의 하였다.
		@Override
		public void hunt() {
			// TODO Auto-generated method stub
			System.out.println("휴먼이 사냥을 합니다.");
		}

	// 1.추상 메시드를 포함하게 되면 추상 클래스로 만들어 주면 된다.
	
}
package ch12;

public class Person extends Human {
	
	
	//hunt 컨트롤 스페이스 엔터하면 생김
	@Override
	public void hunt() {
		//1000줄 부모 메서드와 똑같아야함
		super.hunt();	// 부모에 있는 메서드를 호출 하라!!
		System.out.println("아는 사람이야 !!");
		//
	}
}
위와 같이 추상클래스는 abstract 키워드를 사용하며 추상메서드는 기능이 없어도 선언이 가능하다.

추상메서드를 가진 클래스는 new를 할수가 없지만 추상클래스로 만들어주고 부모 클래스에 있는 추상메서드를
자식 클래스에 오버라이드로 재정의 해주면 new 할수있다.

 

 

 

 

추상클래스 예제

package ex12;

public abstract class Computer {
	
	
	public abstract void display();
	public abstract void typing();
	
	public void turnOn() {
		System.out.println("전원을 켭니다");
	}
	public void turnOff() {
		System.out.println("전원을 끕니다");
	}
}
package ex12;

import ch12.Computer;

public class DeskTop extends Computer {
	@Override
	public void display() {
		System.out.println("모니터에 출력됩니다.");
	}
	@Override
	public void typing() {
		System.out.println("기계식 키보드로 타자를 칩니다");
	}

}
package ex12;

import ch12.Computer;

public abstract class NoteBook extends Computer {


	@Override
	public void typing() {
			System.out.println("노트북 키보드로 타자를 작성");		
	}

}
package ex12;

public class MyNoteBook extends NoteBook{

	@Override
	public void display() {
		System.out.println("LG 그램 노트북 화면에 출력 됩니다.");
	}

}
출력값

모니터에 출력됩니다.
모니터에 출력됩니다.
LG 그램 노트북 화면에 출력 됩니다.
좋은 노트북을 구매 했네요

 

 

 

 

템플릿 메서드

추상 메서드나 구현 된 메서드를 활용하여 코드의흐름(시나리오)를 정의하는 메서드

final로 선언하여 하위 클래스에서 재정의 할 수 없게 한다.

추상 클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용하여 전체적인 흐름을 정의하고 하위클래스에서

다르게 구현되어야 하는 부분은 추상 메서드로 선언하여 하위 클래스에서 구현 하도록 한다.

 

 

 

추상 클래스 템플릿 메서드 패턴으로 구현하기

package ch13;

//템플릿 메서드 패턴을 구현
//핵심 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("시동을 끕니다");
	}
		//후크 메서드
	public void washCar() {
		//아무것도 구현하지 않음 -> 일반 메서드이다.
	}
	//실행에 흐름을 만들어 둔다.
	//재정의 할 수 없게 설계한다. - final (메서드 앞)
	//하위 클래스에서 재정의 할 수 없음
	final public void run() {
		startCar();
		drive();
		stop();
		turnOff();
	}
	
}
package ch13;

public class Aicar extends Car {

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

	@Override
	public void stop() {
		System.out.println("자동차 스스로 멈춤");
	}
	
	
}
package ch13;

public class ManualCar extends Car {

	@Override
	public void drive() {
		System.out.println("사람이 운전을 합니다.");
	}

	@Override
	public void stop() {
		System.out.println("사람이 브레이크를 밟습니다.");
	}


	
	
}	//end of class
package ch13;

public class MainTest1 {

	public static void main(String[] args) {
		
		Aicar aicar = new Aicar();
		aicar.run();
		System.out.println("-------------");
		ManualCar manualCar = new ManualCar();
		manualCar.run();
	}
}
출력값

시동을 켭니다
자율주행을 합니다.
자동차가 스스로 방향을 바꿉니다.
자동차 스스로 멈춤
시동을 끕니다
-------------
시동을 켭니다
사람이 운전을 합니다.
사람이 브레이크를 밟습니다.
시동을 끕니다