<추상클래스>

 

 

1. 부모 클래스는 최대한 추상적인걸 들고있으면 된다.(고유한거 아니고 중복되는걸 들고있으면 됨)

 

2. 최대한 공통적인걸 뽑아올려서 추상적으로 정의하는 것 

 

3. 추상클래스는 일반 메서드를 가질 수 있다.

 

4. 추상 클래스는 내가 구현할 수 없는 메서드를 오브젝트에게 미룰 수 있다.

 

5. 추상클래스는 abstract를 붙인다.

* abstract 메소드는 private를 걸 수 없다 (override 해야되기때문에 공개되어야함)

 

 

package ch05;

// 추상클래스는 일반 메서드를 가질 수 있다.
// 추상클래스는 내가 구현할 수 없는 메서드를 오브젝트에게 미룰 수 있다.
// 추상클래스는 abstract를 붙인다.
// 추상클래스를 통해서 순서를 정할 수 있다.
abstract class Food {
	abstract void standby();
	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 라면());
	}

}

 

6. 추상클래스를 통해서 순서를 정할 수 있다.

 

 

 

 

- 라면을 실행하기 위해 f.eat, f.cook을 만든다.

 

- 순서를 실수할 수 있기 때문에 좀 더 간편하게 만들기 위해서 

 

 

- 위에서 순서를 정의해준다.

 

 

- 틀리지 않고 좀 더 간편하게 호출가능!

 

 

 

 

 

- protected : 같은 패키지에 모든 클래스에서 접근이 가능하다.

다른 패키지이고 '자식 클래스'의 경우 접근이 허용된다.

 

 

 

7. 추상클래스는 어댑터의 용도로 사용 가능하다.

 

 

 

package ch05;

// 추상클래스는 어댑터의 용도로 사용가능하다.
abstract class 칼 {
	abstract void kill();
	abstract void cook();
	abstract void repair();
}

abstract class 요리사어댑터 extends 칼 {
	@Override
	void kill() {
		
	}
	@Override
	void repair() {
		
	}
}

class 백종원 extends 요리사어댑터 {
	@Override
	void cook() {
		
	}
	
}

public class FoodEx03 {

	public static void main(String[] args) {

	}

}

 

 

* 이렇게 정의하는게 맞지만 쓰는 메서드가 정해져 있기 때문에 코드가 매우 지저분하다.

 

 

 

* 요리가 아닌 것들을 구현한다.

 

- 백종원에게 구현을 미룰 수 있다.(걸러낼 수 있다) -> 요리가 아닌 것들을 구현하면 백종원은 요리만 구현하면 된다.

 

 


 

<인터페이스>

 

 

1. 변수 : public static final 생략


2. 함수 : public abstract 생략 

 

3. 인터페이스는 통로(교차로)의 역할을 한다. = 동적바인딩 

 

4. 무조건 추상메서드만 존재가능하다. = 강제성 부여 

 

5. new 할 수 없다.

 

- 추상클래스와 유사하다 / 추상 메서드만 존재가능하다.

(몸체가 있는 메서드는 가질 수 없다.)

 

 

package Animal;

interface Animal {
	void run();
	void sound();
}

class Dog implements Animal {
	@Override
	public void run() {
		System.out.println("강아지 달린다.");
	}
	@Override
	public void sound() {
		System.out.println("멍멍");
	}
	
}

class Bird implements Animal {
	@Override
	public void run() {
		System.out.println("새는 달린다.");
	}
	@Override
	public void sound() {
		System.out.println("짹짹");
	}
	
	void fly() {
		System.out.println("새는 난다");
	}
}

public class AnimalEx02 {
	
	static void start(Animal a) {
		a.run();
		a.sound();
		if(a instanceof Bird) {
			//fly 메서드를 가진 놈이라는걸 확신
			((Bird) a).fly();
		}
	}

	public static void main(String[] args) {
		Animal d = new Dog();
		d.run();
		d.sound();
		
		Animal a = new Bird();
		a.run();
		a.sound();
	}

}

 

- class를 implements 시켜준다.

(규칙을 다 넣고 지키라고 하는 작업)

 

- 추상클래스는 아래에서 끌어올려서 검색한다.

 

 

 

- public 이랑 abstract 생략 가능하다.

 

ex) 자동차에 엑셀(인터페이스)

컴퓨터에 키보드(인터페이스)

* 내가 쉽게 사용할 수 있게 해주는 것

 

 

 

- extends (X) / implements : 다형성이 아니어도 된다. 

 

 

- num : final , static

* 앞에 public static final 이 생략되어 있다.

 

 

 

- 도메인을 준다 : 공통코드로 범위를 지정할 수 있다.

openclose