다형성
ㅡ 하나의 객체가 여러 형태를 가지는 것을 의미
ㅡ 부모 클래스의 참조 변수로 자식 클래스의 인스턴스 참조
ㅡ 다형성은 상속, 추상화와 같이 객체지향 프로그래밍의 특징 중 하나
형 변환 [ 서로 상속 관계인 클래스만 ]
자식 타입 → 부모 타입 : 형 변환 생략 가능
부모 타입 → 자식 타입 : 형 변환 생략 불가능 / 명시해줘야 한다.
참조 변수의 타입을 변환하는 것 뿐 인스턴스에는 영향을 미치지 않는다.
형 변환을 통해 인스턴스에서 사용할 수 있는 멤버의 범위를 조절
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가 출력된다.
'Java' 카테고리의 다른 글
예외 처리 ( Exception Handling ) (0) | 2023.01.11 |
---|---|
추상 클래스 ( Abstract Class ) / 인터페이스 ( Interface ) (0) | 2023.01.10 |
HashMap (0) | 2023.01.10 |
상속 ( Inheritance ) / 오버라이딩 ( Overriding ) (0) | 2023.01.09 |
생성자 ( Constructor ) / this (0) | 2023.01.06 |
댓글