: 하나의 객체가 여러 타입을 가질 수 있음
→ 부모 타입의 참조변수로, 자식 타입의 인스턴스를 참조할 수 있도록 하여 구현 (반대는 불가)
ParentClass pobj = new ChildClass(); // up-casting
오버라이딩된 메소드 사용 가능
→ 그 외 자식타입의 메소드와 변수는 형변환(down-casting)을 통해 사용 가능
여러 자식 타입의 객체를 배열로 묶을 수 있음 (= 공통 분모로 묶기)
: 다른 타입으로 변환
→ 기본형 외의 자료형은 상속관계의 클래스끼리 casting 가능
instanceof 연산자
: 참조하고 있는 인스턴스 타입 확인
→ 사용 시 각 객체의 정보를 외부 객체가 알게 되므로 캡슐화가 깨짐
⇒ 사용 지양!
public static MainClass {
public static void main(String args[]) {
// 부모 변수에 자식 인스턴스 담기(up-casting)
ParentClass pobj = new ChildClass(); // 출력: Parent > Child
// 오버라이딩한 method
pobj.method(); // 출력: Child method()
System.out.println(pobj instanceof ChildClass); // true
System.out.println(pobj instanceof ParentClass); // true
// down-casting
ChildClass cobj = (ChildClass) pobj;
cobj.onlyChild(); // pobj는 사용 못하는 메소드
System.out.println(cobj instanceof ChildClass); // true
System.out.println(cobj instanceof ParentClass); // true
}
}
public class ParentClass {
public ParentClass() {
System.out.println("Parent");
}
public void method() {
System.out.println("Parent method()");
}
}
public class ChildClass extends ParentClass {
public ChildClass() {
System.out.println("Child");
}
@Override
public void method() {
System.out.println("Child method()");
}
public void onlyChild() {
System.out.println("onlyChild()");
}
}
: 공통 부분을 추출한 클래스
→ 필드와 메소드 이름을 각각 통일시켜 가독성 향상, 개발의 효율 증대
특징
abstract
키워드 사용
: 내용은 없고 선언만 되어 있는 함수
특징
abstract
키워드가 붙고 {}
블록이 없는 형태주의!
❌ 추상 클래스 ⇏ 반드시 추상 메소드 포함
⭕ 추상 메소드를 포함하는 클래스 ⇒ 반드시 추상 클래스
// 추상 클래스
abstract class AbstactClass {
// 추상 메소드
public abstract void method();
}
// 상속
class Child extends AbstractClass {
@Override
public void method() {
System.out.println("Overriding");
}
}
: 클래스들이 필수로 구현해야 하는 추상 자료형 (객체 설계도)
→ 확장에 열려있고(다중 상속) 변경에 닫혀있다(표준화)
특징
interface
키워드 사용implements
키워드 사용
// 인터페이스
public interface MyInterface {
// 정적 변수
public static final String LAST_NAME = "Lee";
// 추상 메소드
public abstract void func();
}
// 구현
class MyClass implements MyInterface {
@Override
void func() {
System.out.println("Overrided func()");
}
}