한 걸음 두 걸음
자바 Java ] 다형성 Polymorphism 본문
반응형
다형성
다형성이란?
같은 함수를 불러도, 객체의 타입에 따라 다른 결과를 얻는 것입니다. 이는 형변환과 관련이 있습니다.
상향 형변환
동물을 상속받는 개, 고양이, 다람쥐 클래스가 있을 때,
동물 d = new 동물();
은 당연히 가능하지만,
동물 d = new 고양이();
는 당연하지 않아보이지만 가능하다.
이 떄 발생하는 것이 바로 상향형변환입니다. 부모클래스의 참조변수(d)로 자식클래스의 객체를 참조했기 때문에, 부모클래스가 자식클래스에게 물려준 것은 사용가능하지만, 자식이 확장해서 만든(부모에게는 없는) 것들에는 접근할 수 없습니다.
예를 들어,
Class Animal {
public int a;
Animal(){
a = 10;
}
}
Class Cat extends Animal{
public int b;
Cat(){
b = 20;
}
}
일 때, main함수에서
public class Main {
public static void main(String[] args) {
Animal ani = new Cat(); //상향 형변환!
ani.a; //10
ani.b; //불가능
}
}
처럼 Animal이 물려주지 못한 것은 접근할 수 없습니다. 만약 참조변수도 Cat클래스였다면
public class Main {
public static void main(String[] args) {
Cat c = new Cat();
c.a; //10
c.b; //20
}
}
모두 가능했을 것입니다.
하향 형변환
반대로 자식클래스 참조변수로 부모클래스 객체를 참조하는 것이 바로 하향형변환입니다. 이는 일반적으로 컴파일오류가 발생하지만,
(상향 형변환)서브클래스 객체가 형변환에 의해 수퍼클래스 참조변수에 의해 참조되고 있는 경우에는 하향 형변환을 통해 Cat c = new Cat();
처럼 원래 정상적인 상태로 만들 수 있습니다.
public class Main {
public static void main(String[] args) {
Animal ani = new Cat(); //상향 형변환!
Cat c = (Cat)ani; //하향 형변환
//정상적인 상태로 되돌아왔으므로 모두 가능
c.a; //10
c.b; //20
}
}
반응형
'Language > Java' 카테고리의 다른 글
자바 JAVA ] instanceof 연산자 : 객체의 타입을 알아내는 방법 (0) | 2019.11.20 |
---|---|
자바 Java ] 람다 표현식 Ramda (0) | 2019.11.20 |
자바 JAVA ] 인터페이스 interface / CompareTo, Comparable (0) | 2019.11.20 |
자바 Java ] 오브젝트 클래스 Object Class (0) | 2019.11.20 |
자바 Java ] 추상클래스 abstract class / 추상 메소드 abstract method (0) | 2019.11.20 |