다형성 (Polymorphism)

조상원·2025년 8월 2일

JAVA

목록 보기
16/34
  • 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질.
  • 부모 클래스 타임의 참조 변수에 자식 객체들을 대입하여 다룰 수 있는 것이 다형성의 기본 개념

Up Casting

  • 자식 타입의 객체가 부모 타입의 객체로 형 변환 되는 것.
  • 자동으로 형 변환이 일어나기 때문에 부모 클래스 타입의 참조 변수가 모든 자식 객체들을 별도의 형 변환 없이 대입 받을 수 있다.
  • 부모 타입으로 업 캐스팅된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능
  • 예외 : 부모 타입의 메소드가 오버라이딩되었다면 오버라이딩된 메소드가 대신 호출
// Dog 클래스 타입의 객체를 Animal 클래스 타입의 참조 변수에 대입
Animal animal = new Dog();

// 자식 클래스에서 오버라이딩 된 코드가 실행된다.
System.out.println(animal.bark()); // "멍멍~ 짖는다." 출력
// Cat 클래스 타입의 객체를 Animal 클래스 타입의 참조 변수에 대입
Animal animal = new Cat();

// 자식 클래스에서 오버라이딩 된 코드가 실행된다.  
System.out.println(animal.bark()); // "야옹~ 운다." 출력

Down Casting

  • 다운 캐스팅은 부모 타입의 객체가 자식 타입의 객체로 형 변환 되는 것
  • 자동으로 형 변환이 일어나지 않기 때문에 형 변환 연산자를 사용해서 형 변환 해야함
Animal animal = new Dog();
// 클래스 간의 형 변환은 반드시 상속 관계에 있는 클래스들끼리만 가능하다.
Dog dog = (Dog) animal; 
  • 부모 클래스 타입 참조 변수가 실제로 참조하는 객체를 확인하지 않고 강제 형 변환을 시도하면 ClassCastException 예외가 발생할 수 있음
  • 객체가 어떤 클래스의 인스턴스인지 instanceof 연산자를 사용해서 확인할 수 있음
// animal이 참조하는 객체가 Dog 클래스로 생성된 객체이면 true
// animal이 참조하는 객체가 Dog 클래스로 생성된 객체가 아니면 false
if(animal instanceof Dog) {
  ...
// animal이 참조하는 객체가 Cat 클래스로 생성된 객체이면 true
// animal이 참조하는 객체가 Cat 클래스로 생성된 객체가 아니면 false
} else if (animal instanceof Cat){
  ...
} 

0개의 댓글