충분히 쌓여가는
매개변수의 다형성(다형성 장점 1) 본문
다형성이란
조상 타입 참조 변수로 자손 타입 객체를 다루는 것
사용할 수 있는 멤버의 갯수를 조절하는 것(리모컨 바꾸기)
참조변수의 형변환 가능여부 확인, 가능할 경우 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;
}
buy 메서드 추가
매개변수 타입이 Tv이기 때문에 newTv만 들어올 수 있다
void buy(Tv t) {
money -= t.price;
bonusPoint += t.bonusPoint;
}
다른 물건도 사야하는 buy 메서드를 만들어야한다
메서드 이름이 같고 매개변수 이름이 다른 오버로딩 발생
void buy(Computer c) {
money -= c.price;
bonusPoint += c.bonusPoint;
}
void buy(Audio a) {
money -= a.price;
bonusPoint += a.bonusPoint;
}
새로운 물건이 생길 때마다 buy 메서드를 추가해 줄 수 없다
따라서 부모 클래스인 Product로 buy 클래스를 만든다
이렇게 되면 해당 메서드 하나로 여러 물건을 살 수 있다
void buy(Product p) {
money -= p.price;
bonusPoint += p.bonusPoint;
}
즉, 물건별로 메서드를 만드는 것이 아니라 하나로 통합할 수 있다
코드
class Product {
int price;
int bonusPoint;
Product(int price) {
this.price = price;
bonusPoint = (int) (price / 10.0);
}
}
class Tv1 extends Product {
Tv1() {
super(100); // 조상클래스의 생성자 Product(int price) 호출
}
public String toString() { return "Tv"; }
}
class Computer extends Product {
Computer() {
super(200);
}
public String toString() { return "Computer"; }
}
class Buyer {
int money = 1000;
int bonusPoint = 0;
void buy(Product p) {
if (money < p.price) {
System.out.println("잔액 부족");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p + "를 구입했습니다");
}
}
public class polymorphism {
public static void main(String[] args) {
Buyer b = new Buyer();
b.buy(new Tv1());
b.buy(new Computer());
System.out.println(b.money);
System.out.println(b.bonusPoint);
}
}
Tv를 구입했습니다
Computer를 구입했습니다
700
30
main 메서드에서 헷갈리는 부분
b.buy(new Tv1());로 넘겨주면 참조변수 없이 직접 넣을 수 있지만,
매개변수가 없기 때문에 main 메서드 안에서 Tv1를 사용할 수 없고 buy 메서드 안에서만 사용 가능하다
'Java > 객체지향' 카테고리의 다른 글
추상 클래스(abstract class), 추상 메서드(abstract method) (0) | 2023.06.13 |
---|---|
하나의 배열로 여러 종류 객체 다루기(다형성 장점 2) (0) | 2023.06.13 |
instanceof 연산자 (0) | 2023.06.12 |
참조변수의 형변환 (0) | 2023.06.12 |
다형성(polymorphism) (0) | 2023.06.12 |