정의
- 한 객체가 여러 가지 타입을 가질 수 잇는 것을 말한다.
- 부모 클래스 타입 참조 변수가 자식 클래스의 인스턴스를 가리킬 수 있는 기능을 의미한다.
특징
- 클래스들 사이에는 반드시 상속 관계가 전제되어야 한다.
부모 클래스 타입으로 선언된 변수를 큰 타입이고, 자식 클래스 타입으로 선언된 변수나 인스턴스가 작은 작은 타입이 된다.
- 재사용성이 높아진다.
- instanceof 연산자가 함께 사용된다.
instanceof 연산자는 객체가 어떤 클래스인지, 어떤 클래스를 상속받았는지 확인하는데 사용된다.
종류
업캐스팅 (upcasting)
부모 클래스 타입 변수 = 자식 클래스 타입 변수(또는 자식 클래스 인스턴스)
- 부모 타입 참조 변수가 자식 클래스 타입 변수 또는 자식 클래스 인스턴스를 가리킬 수 있는 능력을 의미한다.
- 업캐스팅 상태에서 메소드를 호출하면 JVM은 항상 하위 클래스의 오버라이딩된 메소드를 먼저 호출한다.
다운캐스팅 (downcasting)
자식 클래스 타입 변수 = (자식클래스)부모 클래스 타입 인스턴스
- 업캐스팅 상태에서 자식 클래스의 필드나 메소드에 접근하기 위해 다시 자식 클래스 타입으로 변환해주는 것을 의미한다.
예제
// Person 클래스 - 사람
class Person {
public void print() {
System.out.println("Person.print");
}
}
// Student 클래스 - 학생
class Student extends Person {
public void print() {
System.out.println("Student.print");
}
public void print2() {
System.out.println("Student.print2");
}
}
// CollegeStudent 클래스 - 대학생
class CollegeStudent extends Person {
public void print() {
System.out.println("CollegeStudent.print");
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person();
// 업캐스팅
Person studentPerson = new Student();
person.print(); // Person.print
studentPerson.print(); // Student.print
Student student = new Student();
// 다운 캐스팅
student = (Student)studentPerson;
student.print2(); // Student.print2
// instanceof
System.out.println(studentPerson instanceof Student); // true
System.out.println(person instanceof Student); // false
if(studentPerson instanceof Student) {
Student innerStudent = (Student)studentPerson;
}
if(person instanceof Student) {
Person innerPerson = (Person)student;
}
}
}
⊙ 참고 문헌
- 이병승, 「초보 개발자를 위한 자바:한 권으로 배우는 자바 마스터 가이드 북」, 영진닷컴, 2024, p459 - 477
- 마종현, 「제로베이스 백엔드 취업 파트타임 스쿨 5기:Part 01. Java 기초-Chapter 01. Java 프로그래밍-09.다형성」, 제로베이스, 2024, https://zero-base.co.kr/