728x90
여러 가지 형태를 가질 수 있는 능력
조상 타입의 참조 변수로 자손 타입의 객체를 다루는 것
자손 타입의 참조 변수로 조상 타입의 객체를 다루는 것은 불가능
class Tv {
boolean power;
int channel;
void power() { power = !power; }
void channelUp() { ++channel; }
void channelDown() { --channel; }
}
class SmartTv extends Tv {
String text;
void caption() { }
}
조상타입 참조변수명 = new 자손타입(); // 다형성은 조상 타입 Tv의 참조 변수 t가
Tv t = new SmartTv(); // 자손 타입 SmartTv 객체를 다루는 것
//즉, 타입이 일치하지 않아도 상관없음
SmartTv s = new SmartTv(); // 참조변수의 형변환 방법
Tv t = (Tv)s; // 자손타입을 조상타입으로 형변환(타입생략가능). 변수의 강제형변환과 같음
SmartTv s2 = (SmartTv)t; //자손 타입으로 형변환 하는 경우에는 타입 생략 불가능
void doCheck(Car c) {
if(참조변수c instanceof 타입) { //참조변수가 해당타입으로 형변환이 가능한지
//확인 후 형변환
}
}
객체와 참조변수 타입의 일치/불일치의 차이
일치하는 경우 해당 인스턴스의 모든 멤버 사용 가능
일치하지 않는 경우 조상 타입에만 속한 멤버 사용 가능 (다형성)
참조변수의 형변환
사용할 수 있는 멤버의 수를 조절
멤버의 수 이외의 어떠한 값도 바뀌지 않음
조상 - 자손 관계만 형변환 가능
조상 > 자손 (다운캐스팅) / 자손 > 조상 (업캐스팅)
instanceof
참조변수의 형변환이 가능한지 여부를 확인할 때 사용 (가능하면 true)
형변환 전에 반드시 확인해야 함
형변환을 하는 이유는 인스턴스의 원래 기능을 모두 사용해야할 때
조상타입이면 모두 true 반환
다형성의 장점
// 부모 클래스
class Product {
int price;
int bonusPoint;
}
// 자손 클래스
class Tv extends Product { }
class Computer extends Product { }
class Audio extends Product { }
// 구매자 정보
class Buyer {
int money = 1000;
int bonusPoint = 0;
void buy(Product p) { // 매개변수의 다형성을 이용할 메소드
money -= p.price;
bonus += p.bonusPoint;
}
}
// 인스턴스 생성
Buyer b = new Buyer();
// 매개변수의 다형성을 이용하기
b.buy(new Tv()); // buy(Product p) 와 같은 코드
b.buy(new Computer());
// 객체의 다형성
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();
매개변수의 다형성
참조형 매개변수는 메서드 호출 시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있음
즉, 하나의 메소드로 여러 타입의 매개변수를 받을 수 있음
배열의 다형성
하나의 배열(조상타입의 배열)로 여러 종류의 자손들의 객체를 담을 수 있음
'Java > Notion' 카테고리의 다른 글
인터페이스 (0) | 2023.04.25 |
---|---|
추상화 (0) | 2023.04.25 |
제어자와 캡슐화 (0) | 2023.04.24 |
import / static import (0) | 2023.04.24 |
패키지 (package) (0) | 2023.04.24 |