다형성 이전에 상속이란 개념을 먼저 숙지하는 것이 필요하다. 상속에 관한 포스팅을 먼저 보고오는 것을 추천한다.
프로그램 언어의 다형성이란 그 언어의 각 요소들(상수, 변수, 식, 오브젝트, 함수, 메소드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질을 가리킨다.
객체지향프로그래밍(OOP, Object Oriented Programming)의 3대 특징 중 하나인 다형성은 하나의 부모타입 참조변수가 여러 자식 타입의 인스턴스를 가질 수 있는 성질을 말한다.
아래 예제 코드를 통해 다형성을 이해해보자.
Main.java
class A {};
class B extends A {};
class C extends A {};
public class Main {
public static void main(String[] args) {
A var1 = new A(); // 자신(A)을 인스턴스로 생성
// Up Casting
A var2 = new B(); // 자식(B)을 인스턴스로 생성
A var3 = new C(); // 자식(C)을 인스턴스로 생성
// Down Casting
// var1, var2의 type이 A -> B로 바뀜. (부모에서 자식으로)
B var4 = (B)var2;
B var5 = (B)var1;
}
}
상속 관계에 있는 부모, 자식 클래스 간에 부모타입의 참조형 변수가 모든 자식 타입의 객체 주소를 받을 수 있음.
위 예제코드를 참조하시길 바랍니다.
- 자식 객체의 주소를 받은 부모 참조형 변수를 가지고 자식의 멤버를 참조해야 할 경우, 부모 클래스 타입의 참조형 변수를 자식 클래스 타입으로 형 변환하는 것.
- 자동으로 처리되지 않기 때문에 반드시 후손 타입 명시해서 형 변환.
위 예제코드를 참조하시길 바랍니다.
현재 참조형 변수가 어떤 클래스 형의 객체 주소를 참조하고 있는지 확인 할 때 사용
// 표현식
// if(레퍼런스 instanceof 클래스타입) {
// true일때 처리할 내용.
// }
Main.java
class A {};
class B extends A {};
class C extends A {};
public class Main {
public static void main(String[] args) {
A var3 = new C(); // 자식(C)을 인스턴스로 생성
if(var3 instanceof A) {
System.out.println("O");
} else {
System.out.println("X");
}
if(var3 instanceof B) {
System.out.println("O");
} else {
System.out.println("X");
}
if(var3 instanceof C) {
System.out.println("O");
} else {
System.out.println("X");
}
}
}
결과
다음 결과를 통해 var3가 A와 C 클래스의 인스턴스임을 알 수 있다.