<추상클래스>
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 이 생략되어 있다.
- 도메인을 준다 : 공통코드로 범위를 지정할 수 있다.
'Java programing > 프로그래밍 언어 활용' 카테고리의 다른 글
Java - 커피숍만들기, Linked List, ArrayList, Generic (0) | 2020.04.03 |
---|---|
Java - 햄버거 만들기 (composite) (0) | 2020.04.03 |
Java - 상속, 추상클래스(abstract) 1 (0) | 2020.03.30 |
Java - 오버로딩 (0) | 2020.03.27 |
Java - this, 행동 (0) | 2020.03.27 |