[작성일: 2023. 01. 29]
목차
다형성(Polymorphism)
- 여러 가지 형태를 가질 수 있는 능력
- 조상 타입 참조변수로 자손 타입 객체를 다루는 것
- 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수는 없음.
int i = 10;
double d = i;
double b = 10.34;
int j = b; // (X) 넓은 곳에서 좁은 곳으로 갈 수 없음.
INT J = (int)b; // 가능.
class Tv {
boolean power;
int channel;
void power() { power = !power; }
void channelUp() { ++channel; }
void channelDown() { --channel; }
}
class SmartTv extends Tv { //
String text;
void caption() { /*내용생략*/ }
}
Tv t = new Tv();
SmartTv s = new SmartTv();
// 일반적으로는 타입이 일치하게 해줘야 하지만,
Tv t = new SmartTv(); // 타입 불일치해도 괜찮은 게 다형성.
// SmartTv의 멤버가 더 많기 때문에 객체로 사용 가능해짐.(일부만 사용)
// 조상 타입 참조변수로 자손 타입 인스턴스 참조
SmartTv s = new Tv(); // 에러. 허용 안 됨.
Q&A
Q. 참조변수의 타입은 인스턴스의 타입과 반드시 일치해야 하나요?
A. NO. 일치하는 것이 보통이지만 일치하지 않을 수도 있음. (다형성)
SmartTv s = new SmartTv(); // 참조 변수와 인스턴스의 타입 일치
Tv t = new SmartTV(); // 조상 타입 참조변수로 자손 타입 인스턴스 참조
Q. 참조변수가 조상타입일 때와 자손타입일 때의 차이?
A. 참조변수로 사용할 수 있는 멤버의 개수가 달라짐.
Q. 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 있는가?
A. NO. 허용되지 않음.
Tv t = new SmartTv(); // 허용
SmartTv s = new Tv(); // 에러
매개변수의 다형성
- 참조형 매개변수는 메서드 호출 시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있음.
- 다형적 매개변수
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(Tv t) {
money -= t.price;
bonusPoint += t.bonusPoint;
}
// 오버로딩1
void buy(Computer c) {
money -= t.price;
bonusPoint += t.bonusPoint;
}
// 오버로딩2
void buy(Audio a) {
money -= t.price;
bonusPoint += t.bonusPoint;
}
// 오버로딩이 많아지면 불편하므로 아래와 같이 메서드를 변경함.
// 조상타입 사용, 메서드 하나로 여러 물건을 살 수 있음.(다형성)
void buy(Product p) {
money -= p.price;
bonusPoint += p.bonusPoint;
}
여러 종류의 객체 배열로 다루기
- 조상타입의 배열에 자손들의 객체를 담을 수 있음.
Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();
// 배열로 바꾸기 -> 다형성으로 자손들이 들어올 수 있음
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();
// 예시
class Buyer {
int money = 1000;
int bonusPoint = 0;
Product[] cart = new Product[10];
int i=0;
void buy(Product p) {
if(money < p.price) {
System.out.println("잔액 부족");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
cart[i++] = p;
}
}
🐣 해당 게시글은 자바의 정석(남궁성 님) 영상으로 함께 공부하며 요약/정리한 글입니다.
🐣 입문 개발자가 작성한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.