[Java] 다형적 참조

Posted by , September 28, 2024
JavaStudy
Series ofJava

스터디에서 다형적참조에 대해 발표하게 되어 정리해보고자 합니다.

0. 서론

다형적 참조에 대해 설명하기 전에 먼저 다형성(Polymorphism)에 대해 알아보죠.
다형성(Polymorphism)은 객체지향 프로그래밍의 중요한 개념중 하나로 여러가지 형태를 가질 수 있는 능력을 의미합니다. 예시를 들자면, 다형성(Polymorphism)은 부모 클래스 타입의 변수가 자식 클래스 타입의 객체를 참조할 수 있다는 것을 뜻합니다.

1. 다형적 참조란?

다시 돌아와서 다형적 참조(Polymorphic Reference)에 대해 알아보죠.
다형적 참조(Polymorphic Reference)는 부모 클래스 타입의 인스턴스로 자식 클래스 타입의 인스턴스를 참조 할 수 있는 기능을 의미합니다. 이는 다형성을 실현하는 방법 중 하나입니다.

다형성과 비슷하다고 생각할 수 있지만 다형성과 다형적 참조는 보시다싶이 서로 다른 개념입니다. 다형성이 더 포괄적인 개념이죠. 다형성과다형적참조

2. 예제코드

Animal 클래스와 Jaelong 클래스가 있다고 가정해보죠. 두 클래스는 부모(Animal)와 자식(Jaelong) 관계입니다.

public class Animal {
    public void print() {
        System.out.println("Animal");
    }
}
public class Jaelong extends Animal {
    public void print() {
        System.out.println("Jaelong");
    }

    public void sound() {
        System.out.println("멍멍");
    }
}
public class PolyTest {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Animal animal2 = new Jaelong();

        animal.print();
        animal2.print();
    }
}

이렇게 코드가 되어있다면 결과를 어떻게 될까요?

[결과]
Animal
Jaelong

Animal animal2 = new Jaelong(); 부분에서 다형적 참조를 통해 자식 클래스의 인스턴스로 변경되었기 때문에 "Jaelong"이라고 결과가 나오게 된 것입니다.

그렇다며 소스코드가 이렇게 되었다면 결과가 어떻게 될까요?

public class PolyTest {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Animal animal2 = new Jaelong();

        animal.print();
        animal2.print();
        // 추가
        animal2.sound();
    }
}

소스를 실행시키면 컴파일 에러가 발생합니다. 왜 그런걸까요?
다형적 참조로 자식 클래스의 인스턴스를 참조 했고 Jaelong 클래스에는 sound()가 있는데 말이죠.

소스분석 animal 변수가 생성이 될때 메모리에 Animal 클래스만 로드가 됩니다. 반면에 animal2 변수 생성이 될때는 Jaelong 클래스와 부모 클래스인 Animal까지 같이 생성이 됩니다.

소스분석2 animal2 변수는 Animal 타입으로 선언했기 때문에 먼저 Animal 클래스에 sound() 메소드가 있는지 확인합니다. 메소드를 찾는 방향은 자식->부모순으로 Animal (부모)에서 내려가면서 찾을 수는 없습니다. 따라서 컴파일 오류가 발생한 것입니다. Jaelong 클래스로 다운 캐스팅후 호출하면 오류 없이 호출 할 수 있습니다.

public class PolyTest {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Animal animal2 = new Jaelong();

        animal.print();
        animal2.print();
        // 추가
        // animal2.sound(); // 컴파일 에러
        ((Jaelong) animal2).sound(); // 다운 캐스팅후 호출
    }
}

3. 정리

  • 다형성(Polymorphism)
    • 객체지향 프로그래밍의 개념중 하나로 여러가지 형태를 가질 수 있는 능력을 의미합니다.
  • 다형적 참조(Polymorphic Reference)
    • 부모 클래스 타입의 인스턴스로 자식 클래스 타입의 인스턴스를 참조 할 수 있는 기능을 의미합니다.
  • 메소드를 찾는 방향은 자식->부모순으로, 부모에서 내려가면서 찾을 수는 없습니다.

참조