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) {
}
}
'Programming Language > Java' 카테고리의 다른 글
자바 인터페이스의 변수와 함수 (0) | 2020.03.31 |
---|---|
자바 인터페이스 - 추상클래스 - 일반클래스 - 메인 기본 구조 (0) | 2020.03.31 |
이클립스 lombok 롬복 (자동 생성자, 자동 게터 세터) (0) | 2020.03.31 |
이클립스 계층별로 패키지 정리 (0) | 2020.03.31 |
자바 오버라이드, 상속, 동적 바인딩 (0) | 2020.03.30 |