[자바/심화] 다형성(Polymorphism)

정의

- 한 객체가 여러 가지 타입을 가질 수 잇는 것을 말한다.

- 부모 클래스 타입 참조 변수가 자식 클래스의 인스턴스를 가리킬 수 있는 기능을 의미한다.

특징

- 클래스들 사이에는 반드시 상속 관계가 전제되어야 한다.

  부모 클래스 타입으로 선언된 변수를 큰 타입이고, 자식 클래스 타입으로 선언된 변수나 인스턴스가 작은 작은 타입이 된다.

- 재사용성이 높아진다.

- 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;
        }
    }    
}

⊙ 참고 문헌

  1. 이병승, 「초보 개발자를 위한 자바:한 권으로 배우는 자바 마스터 가이드 북」, 영진닷컴, 2024, p459 - 477
  2. 마종현, 「제로베이스 백엔드 취업 파트타임 스쿨 5기:Part 01. Java 기초-Chapter 01. Java 프로그래밍-09.다형성」, 제로베이스, 2024, https://zero-base.co.kr/