본문 바로가기
Java

다형성 ( Polymorphism )

by KDW999 2023. 1. 10.

다형성

ㅡ 하나의 객체가 여러 형태를 가지는 것을 의미

ㅡ 부모 클래스의 참조 변수로 자식 클래스의 인스턴스 참조

ㅡ 다형성은 상속, 추상화와 같이 객체지향 프로그래밍의 특징 중 하나

 

형 변환 [ 서로 상속 관계인 클래스만 ]

자식 타입 → 부모 타입 : 형 변환 생략 가능

부모 타입 → 자식 타입 : 형 변환 생략 불가능 / 명시해줘야 한다.

참조 변수의 타입을 변환하는 것 뿐 인스턴스에는 영향을 미치지 않는다.

형 변환을 통해 인스턴스에서 사용할 수 있는 멤버의 범위를 조절

 

class Animal {
	 String ears;
	 String eyes;
	 String legs;
}

class Monkey extends Animal {
	 String arms;

	 Monkey(String arms, String eyes, String ears, String legs){
		 // super, this는 주소로 접근하기에 인자로 받았던 값들이 생성자 실행이 끝난 뒤에도 저장되어 있다.
		 super.ears = ears; // 상위 클래스 변수
		 super.eyes = eyes;
		 super.legs = legs;
		 this.arms = arms; // 자기 클래스 변수
	 }
}

public class Polymorphism {

	public static void main(String[] args) {
    
    Monkey monkey1 = new Monkey("arms", "eyes", "ears", "legs");
		System.out.println(monkey1);
		System.out.println(monkey1.arms + monkey1.eyes + monkey1.ears + monkey1.legs);
        
        Animal animal1 = monkey1; // monkey1의 주소를 animal1에 넣은 것 뿐 monkey1의 값에 변함은 없다
		System.out.println(animal1); // 주소는 monkey1과 같음 대신 Animal에서 arms가 하위 변수라 인식을 못함
		System.out.println(animal1.eyes + animal1.ears + animal1.legs); // 주소를 받았기에 animal1에서 monkey에서 선언된 변수들을 사용 가능
    	}
}

자식인 Monkey의 눈으로 바라보면 변수 arms부터 부모의 변수 ears, eyes, legs가 다 보이나 부모인 Animal의 눈으로 바라보면 자기 변수인 ears, eyes, legs만 보이고 자식의 변수인 arms는 보이지 않는다.

 

 

Monkey monkey2 = (Monkey)animal1; // animal1 참조변수의 타입을 자식 클래스로 형 변환 명시 animal1의 주소가 monkey2로 대입, Monkey 클래스에 있던 기존 변수 arms부터 부모 클래스의 변수도 다 접근 가능

 

Instanceof 연산자

다형성에서 참조 변수가 실제로 참조하고 있는 인스턴스 타입을 확인할 때 사용하는 기능

 

참조변수 instanceof 클래스 이름  ← 이렇게 사용

참조변수가 클래스를 참조하고 있다면 true / 참조하고 있지 않거나 null 이면 false 반환

 

System.out.println(animal1 instanceof Monkey);

위 코드에서 참조변수 animal1에 monkey1으로 인스턴스를 생성했기에 true가 출력된다.

댓글