Java의 특징은 객체지향.
객체지향의 특징은 추상화, 캡슐화, 상속, 다형성이 있다. 오늘은 그 중에서 다형성에 대해 알아보자.
다형성(Polymorphism)
여러 타입의 객체로 취급될 수 있는 능력을 말한다. 보통 객체는 하나의 타입으로 고정. 그런데 다형성을 사용하면 다른 타입으로도 사용이 가능하다는 뜻
다형성 참조에 대해 짚고 넘어가자.
예시로 부모와 자식의 클래스를 만들었다.
public class Parent {
public void parentMethod() {
System.out.println("Parent.parentMethod");
}
}
public class Child extends Parent {
public void childMethod() {
System.out.println("Child.childMethod");
}
}
이 상태로 아래의 코드를 봐보자.
Parent poly = new Child();
poly.parentMethod();
코드를 보면 부모의 클래스로 Child 클래스 인스턴스를 생성했다.
즉 부모 타입은 자식 타입을 담을 수 있다.
하지만 반대로 자식 타입은 부모 타입을 담을 수 없다.!!
즉 다양한 형태를 참조할 수 있다고 해서 다형적 참조라고 칭한다.
만약에 부모에서 자식에 있는 메서드를 호출하려고 한다면? 컴파일 에러가 발생한다. 이럴 때는 캐스팅을 이용해주면 된다!
public class CastingMain1 {
public static void main(String[] args) {
//부모 변수가 자식 인스턴스 참조(다형적 참조)
Parent poly = new Child();
//단 자식의 기능은 호출할 수 없다. 컴파일 오류 발생
//poly.childMethod();
//다운캐스팅(부모 타입 -> 자식 타입)
Child child = (Child) poly;
child.childMethod();
}
}
위처럼 자식 클래스로 명시적 형변환을 진행해준다. 그러면 자식부터 메서드를 찾기 때문에 가능해진다.
이걸 다운캐스팅이라고 한다.
여기서 주의해야 하는 상황이 있다!!
부모의 클래스로 부모의 인스턴스를 생성하는 경우 다운캐스팅이 불가능하다.
사진과 같이 Parent로 인스턴스를 생성했지만 (Child)로 명시적 캐스팅을 하지만 에러가 발생한다.
그 이유가 무엇일까??
1. Parent pa1 = new Child();
2. Parent pa2 = new Parent();
위 처럼 2가지 경우에서 살펴보자.
1번의 경우 자식의 인스턴스를 생성했다. 상속받은 자식이기 때문에 힙 영역에 부모클래스, 자식클래스가 전부 생성된다.
그러나 2번의 경우 부모의 인스턴스를 생성했다. 즉 자식의 클래스가 힙 영역에 존재하지 않는다. 그래서 명시적 캐스팅을 하면 에러가 발생하는 것이다!!
'JAVA 강의(인프런)' 카테고리의 다른 글
abstract(추상) & interface(인터페이스) (1) | 2023.12.06 |
---|---|
다형성 (2) (0) | 2023.12.06 |
상속 (0) | 2023.12.03 |
Final을 Static과 같이 사용해야 하는 이유 (1) | 2023.12.03 |