Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 다형성(Polymorphism) 핵심 개념과 예제 완전 정리

다형성이란 무엇인가?

다형성(Polymorphism)은 하나의 객체가 여러 가지 형태를 가질 수 있는 능력을 의미합니다. 객체 지향 프로그래밍(OOP)에서 다형성이 가장 흔하게 사용되는 경우는 부모 클래스 참조 변수가 자식 클래스 객체를 가리키는 상황입니다.

하나 이상의 IS-A 테스트를 통과할 수 있는 자바 객체라면 모두 다형적(polymorphic)이라고 할 수 있습니다. 자바에서 모든 객체는 자기 자신의 타입에 대한 IS-A 테스트와 Object 클래스에 대한 IS-A 테스트를 반드시 통과하므로, 사실상 모든 자바 객체는 다형성을 가진다고 볼 수 있습니다.

참조 변수의 기본 규칙

객체에 접근할 수 있는 유일한 방법은 참조 변수(reference variable)를 통하는 것이므로, 참조 변수의 특성을 정확히 이해하는 것이 매우 중요합니다. 핵심 규칙은 다음과 같습니다.

  • 참조 변수는 오직 하나의 타입만 가질 수 있으며, 한 번 선언되면 그 타입은 변경할 수 없습니다.
  • final로 선언되지 않았다면, 참조 변수는 다른 객체를 가리키도록 재할당될 수 있습니다.
  • 참조 변수의 타입은 해당 객체에 대해 호출할 수 있는 메서드를 결정합니다.
  • 참조 변수는 선언된 타입의 객체 또는 그 타입의 하위 타입(subtype) 객체를 참조할 수 있습니다.
  • 참조 변수는 클래스 타입 또는 인터페이스 타입 어느 쪽으로도 선언할 수 있습니다.

다형성 예제

간단한 예제를 통해 다형성을 살펴보겠습니다.

public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}

위 코드에서 Deer 클래스는 Animal 클래스를 상속받고 동시에 Vegetarian 인터페이스를 구현하고 있습니다. 이처럼 여러 개의 IS-A 관계를 가지는 클래스는 다형적인 클래스로 간주됩니다. 위 예제에서 다음 내용은 모두 참입니다.

  • A Deer IS-A Animal (사슴은 동물이다)
  • A Deer IS-A Vegetarian (사슴은 초식동물이다)
  • A Deer IS-A Deer (사슴은 사슴이다)
  • A Deer IS-A Object (사슴은 객체이다)

유효한 참조 변수 선언

앞서 살펴본 참조 변수의 규칙을 Deer 객체에 적용하면, 아래와 같은 선언들이 모두 유효(legal)합니다.

Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d;

여기서 주목해야 할 점은 참조 변수 d, a, v, o가 모두 힙(heap) 메모리에 존재하는 동일한 Deer 객체를 가리키고 있다는 사실입니다. 실제 객체는 하나뿐이지만, 서로 다른 타입의 참조 변수를 통해 다양한 형태로 접근할 수 있다는 것이 바로 자바 다형성의 핵심입니다.