package ch05;

// 추상 클래스는 new 할 수 없다. 오브젝트가 아니기 때문.
// 추상 클래스는 추상 메서드를 가질 수 있다.
abstract class Food {
	abstract void eat();
}

class 라면 extends Food {

	String name = "라면";

	@Override
	void eat() {
		System.out.println(name + "을 먹었습니다.");
	}

}

class 불고기 extends Food {

	String name = "불고기";

	@Override
	void eat() {
		System.out.println(name + "를 먹었습니다.");
	}

}

class 갈비 extends Food {

	String name = "갈비";

	@Override
	void eat() {
		System.out.println(name + "를 먹었습니다.");
	}

}

public class FoodEx01 {

	static void start(Food f) {
		f.eat();
	}

	public static void main(String[] args) {
		start(new 라면());
	}
}

 

공통 사항은 추상 클래스에서 메서드를 구현해도된다.

package ch05;

abstract class Food {

	void eat() {
		System.out.println("음식을 먹습니다."); // 공통적인것은 사용
	}

	abstract void cook(); // 공통적인데 오브젝트마다 조금씩 다르다면 추상메서드 사용
}

class 라면 extends Food {

	@Override
	void cook() {
		System.out.println("냄비에 끓인다.");

	}

}

class 삼겹살 extends Food {

	@Override
	void cook() {
		System.out.println("불판에 굽는다.");
	}

}

public class FoodEx02 {
	
	static void start(Food f) {
		f.cook();
		f.eat();
	}
	
	
	public static void main(String[] args) {
		start(new 라면());
	}
}

 

추상클래스를 이용해 순서를 정할 수 있다.

package ch05;


// 추상 클래스는 일반 메서드를 가질 수 있다.
// 추상 클래스는 내가 구현할 수 없는 메서드를 오브젝트에게 미룰 수 있다.
// 추상 클래스는 abstract를 붙인다.
// 추상 클래스를 통해서 순서를 정할 수 있다.
abstract class Food {
	
	abstract void standby();
	
	// protected는 자식만 사용가능
	
	protected void eat() {
		System.out.println("음식을 먹습니다."); // 공통적인것은 사용
	}

	abstract void cook(); // 공통적인데 오브젝트마다 조금씩 다르다면 추상메서드 사용
	
	void auto() {  // 이렇게 제작하면 순서 실수를 하지 않는다 (요리 -> 섭취)
		standby();
		cook();
		eat();
	}
}

class 라면 extends Food {
	
	

	@Override
	void cook() {
		System.out.println("냄비에 끓입니다.");

	}

	@Override
	void standby() {
		System.out.println("라면과 냄비를 준비합니다.");
		
	}

}

class 삼겹살 extends Food {

	@Override
	void cook() {
		System.out.println("불판에 굽습니다.");
	}
	
	@Override
	void standby() {
		System.out.println("고기와 불판을 준비합니다.");
		
	}

}

public class FoodEx02 {
	
	static void start(Food f) {
		f.auto();
	}
	
	
	public static void main(String[] args) {
		start(new 라면());
	}
}

 

추상 클래스를 어댑터 용도로 사용

package ch05;

// 어댑터

abstract class 칼 {
	abstract void kill();

	abstract void cook();

	abstract void repair();
}


// 상속 받는 추상 클래스는 부모 클래스의 모든 클래스를 오버라이딩 할 필요가 없다.
// 요리사 어댑터 - 필요없는 기능만 입력한다. (cook메서드만 자식클래스에 구현을 미룬다.)
abstract class 요리사 extends 칼 {
	
	@Override
	void kill() {}
	
	@Override
	void repair() {}
}

// 요리사 클래스가 구현하지 않은 기능만 구현하면 된다.
class 백종원 extends 요리사{
	
	@Override
	void cook() {
		// TODO Auto-generated method stub
		
	}
}

public class FoodEx03 {
	public static void main(String[] args) {

	}
}

 

 

+ Recent posts