티스토리 뷰

반응형

 

33. 추상클래스란

| 추상 클래스

  추상 메서드를 포함한 클래스 

  추상메서드 

     -구현 코드 없이 선언부만 있는 메서드

abstract  예약어 사용

추상 클래스는 new( 인스턴스화) 할 수 없음.

cf) concrete class

 

| 추상 클래스 구현

 

 

  • 메서드와 클래스에 abstract 키워드를 사용.
  • 추상 메서드가 포함된 클래스는 추상 클래스로 선언
  • 모든 메서드가 구현되었다고 해도 클래스에 abstract 키워드를 사용하면 추상 클래스

 

| 추상 클래스

추상 클래스는 주로 상속의 상위 클래스로 사용됨

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

구현된 메소드 : 하위 클래스가 공통으로 사용하는 기능의 메서드, 하위 클래스에 따라 재정의할 수 있다.

package abstractex;

public class ComputerTest {

	public static void main(String[] args) {
//		Computer computer = new Computer();
		Computer computer = new DeskTop();
		computer.display();
		computer.turnOff();
		Computer computer1 = new MyNoteBook();
		computer1.display();
		computer1.turnOff();

	}

}
package abstractex;

public abstract class NoteBook extends Computer {
	@Override
	public void typing() {
		System.out.println("notebook typing");

	}

}
package abstractex;

public class MyNoteBook extends NoteBook {
	@Override
	public void display() {
		System.out.println("My notebook typing");
	}
}
package abstractex;

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() {
		System.out.println("desktop  turn off");
	}

}
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("전원 끔");
	}

}

34. 추상클래스 응용 - 템플릿 메서드

 

| 템플릿 메서드

템플릿: 틀이나 견본을 의미한다.

템플릿 메서드: 추상 메서드나 구현된 메서드를 활용하여, 전체 흐름( 시나리오)를 정의해놓은 메서드

 final로 선언하여 재정의할 수 없게함.

 

템플릿 메서드 패턴:

디자인 패턴의 일종

프레임워크에서 많이 사용되는 설계패턴

추상클래스로 선언된 상위 클래스에서 추상메서드를 이용하여 전체 구현의 흐름을 정의하고, 구체적인 각 메서드 구현은 하위 클래스에 위임함

하위 클래스가 다른 구현을 했다고 해서 템플릿 메서드에 정의된 메서드대로 수행하면 된다.

 

package template;

public class CarTest {

	public static void main(String[] args) {
		Car aiCar = new AICar();
		aiCar.run();
		System.out.println("==========");
		Car manualCar = new ManualCar();
		manualCar.run();
		/*
		 * 시동을 켭니다. 자율주행 입니다 자율주행차가 스스로 방향을 바꿉니다. 스스로 멈춤! 시동을 켭니다. 시동을 켭니다. 사람이 조작합니다
		 * 사람이 직접 방향을 바꿉니다. 사람이 차를 멈춤! 시동을 켭니다.
		 * 
		 * 
		 */

	}

}
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 public void run() {

		// final: 재정의 하면 안되는 함수에 붙이기, 하위 클래스에서 시나리오를 바꾸면 안된다.

		startCar();
		drive();
		stop();
		startCar();
		washCar();
	}
}

 

package template;

public class AICar extends Car {

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

	}

	@Override
	public void stop() {
		System.out.println("스스로 멈춤!");

	}

	public void washCar() {
		System.out.println("스스로 세차!");
	}
}

 

package template;

public class ManualCar  extends Car{
	@Override
	public void drive() {
		System.out.println("사람이 조작합니다");
		System.out.println("사람이 직접 방향을 바꿉니다.");

	}

	@Override
	public void stop() {
		System.out.println("사람이 차를 멈춤!");

	}

}

 

 

 

 

 

 

 

 

 

 

바 인강이 듣고 싶다면 => https://bit.ly/3ilMbIO

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함