다형성(Polymorphism)

Soobin Kim·2024년 4월 3일

Java

목록 보기
21/47

다형성

message polymorphism. 하나의 메시지에 여러 해석이 가능하다는 의미에서 상위 클래스가 동일한 메시지로 하위 클래스를 서로 다르게 동작시키는 객체지향 이론을 말한다.

전제 조건

  1. 상속관계에 있음
  2. 하위 클래스가 상위 클래스의 메서드를 재정의
  3. Upcasting, 상위 클래스 타입으로 형변환
  4. 동적바인딩으로 실행 시간에 상위 클래스 타입 변수로 하위 클래스의 인스턴스 메서드에 접근한다.

다형성 인수

하나의 타입으로 여러 가지 타입을 받을 수 있다.

public static void display(Dog d){/*...*/}
public static void display(Cat c){/*...*/}

// 대신, 다형성 인수(Animal)를 활용하여 Dog타입과 Cat타입을 
// 둘 다 인자로 받아드릴 수 있다.
public static void display(Animal a){/*...*/}

instanceof 연산자로 다형성 인수 실제 타입 검사하기

public static void main(String[] args){
	Dog d = new Dog();
	Cat c = new Cat();
    
    d.display(); // "개"
    				"멍!"
    c.display(); // "고양이"
}
public static void display(Animal a){
	a.name();
    if(a instanceof Dog){
    	((Dog)a).bark();
    }
}
  • 다운캐스팅 전, 실제 타입을 instanceof 연산자를 통해 검사할 수 있다.

다형성 배열

배열은 동일한 자료형만 저장할 수 있지만 부모타입의 배열은 자식타입을 저장할 수 있다(하나의 배열에 서로 다른 타입을 저장할 수 있다).

public static void main(String[] args){
	Animal[] aArr = new Animal[2];
    
	Dog d = new Dog();
	Cat c = new Cat();
    
    aArr[0] = d;
    aArr[1] = c;
    
    printAArrName(aArr);
}
public static void printAArrName(Animal[] aArr){
	for(int i=0;i<aArr.length;i++){
    	System.out.println(aArr[i].name());
    	if(aArr[i] instanceof Dog){
    		((Dog)aArr[i]).bark();
    	}
    }
}

0개의 댓글