여러개의 형태를 갖는다
는 의미package 선언부
public class Son extends Mom {
method 작성부
Mom m = new Son();
package 선언부
public class Son extends Mom {
method 작성부
Mom m = new Son();
(Son)m;
}
package 선언부
Class 작성부
method 작성부
if(레퍼런스 instanceof 클래스 타입1) {
true일 경우 해당 클래스 타입1로 down casting;
} else if (레퍼런스 instanceof 클래스 타입2) {
true일 경우 해당 클래스 타입2로 down casting;
} else if (레퍼런스 instanceof 클래스 타입3) {
true일 경우 해당 클래스 타입3로 down casting;
}
성립조건
- 상속 관계로 이루어져 다형성이 적용된 경우 메소드 오버라이딩이 되어있으면
정적으로 바인딩 된 메소드 코드보다 오버라이딩 된 메소드 코드를 우선적으로 수행
package 선언부
Class 작성부
method 작성부
Car[] carArr = new Car[3];
carArr[0] = new Sonata();
carArr[1] = new Grandure();
carArr[2] = new Morning();
package 선언부
Class 작성부
public void driveCar(Car c) {}
public void execute() {
driveCar(new Sonata());
driveCar(new Grandure());
driveCar(new Morning());
}
package 선언부
접근제한자 abstract class 클래스명 {}
package 선언부
Class 작성부
접근제한자 abstract 반환형 메소드명(자료형 변수명);
package 선언부
접근제한자 interface 인터페이스명 {
/*public static final */자료형 변수명 = 초기값;
/*public abstract */반환자료형 메소드명([자료형 매개변수]);
}
package 선언부
접근제한자 class 클래스명 implements 인터페이스, 인터페이스, ... {}
package 선언부
접근제한자 class 인터페이스 extends 인터페이스, 인터페이스, ... {}
인터페이스의 구현 : 점선 + 빈 세모
- 클래스(자식) - - ▷ 인터페이스(부모)
인터페이스의 상속 : 실선 + 빈 세모
- 인터페이스(자식) ─▷ 인터페이스(부모)
구분 | 추상 클래스 | 인터페이스 |
---|---|---|
상속 | 단일 상속 | 다중 상속 |
구현 | extends 사용 | implements 사용 |
추상 메소드 | abstract 메소드 0개 이상 | 모든 메소드가 abstract |
abstract | 명시적으로 abstract | 묵시적으로 abstract |
일반 메소드 | 사용가능 | 사용불가 |
필드 | 일반 필드 가질 수 있음 | 상수 필드만 가질 수 있음 묵시적으로 public static final |
객체 | 객체 생성 불가 | 객체 생성 불가 |
용도 | 참조 타입 | 참조 타입 |
extends 일반클래스 → extends 추상클래스 → implements 인터페이스
───────────────────────────────▷
강제성이 짙어짐 == 규약이 더 세짐 == 오버라이딩해야하는 메소드의 수가 많아짐