다형성의 장점
다형성이라고 하면 아래 3가지가 있었다.
- 조상 타입의 참조변수가 자손 타입을 참조하는 것.
- 참조변수의 형변환(사용 가능한 멤버의 갯수를 조절)
- instanceof를 통한 형변환 가능여부 체크
이러한 다형성의 장점은 크게 두 가지가 존재한다.
- 다형적 매개변수
- 하나의 배열로 여러 종류의 객체 다루기
1. 다형적 매개변수
class Product {
int price;
int point;
}
class Tv extends Product {}
class Computer extends Product {}
class Buyer {
int money = 1000;
int point = 0;
void buy(Tv t){
money -= t.price;
point += t.point;
}
void buy(Computer c){
money -= c.price;
point += c.point;
}
}
위 코드를 살펴보면 Tv, Computer를 사는 메서드를 Buyer 내부에 만들어줬다.
이와 같은 방식이라면... 제품이 추가 될 때마다 메서드도 계속하여 추가해 줘야만 한다.
이러한 문제를 다형성의 정의를 이용해서 해결할 수 있을 것 같다.
void buy(Product p){
money -= p.price;
point += p.point;
}
다형성은 부모 타입의 참조변수가 자식 타입의 인스턴스를 참조하는 것이다.
즉, 위처럼 매개변수를 Tv, Computer의 부모 클래스인 Product타입으로 정의 해놓으면 다형성의 정의에 의해서 아래와 같이 해석될 수 있는 것이다.
Product p1 = new Tv();
Product p2 = new Computer();
이런 식으로 buy를 호출할 때, 매개변수인 Product타입에 Tv 객체를 넣어주게 되면 다형성의 성질에 의해서 p1은 Tv클래스의 인스턴스를 가리키게 되는 것이다.
즉, 가장 상단에 있던 코드블럭의 코드가 아래와 같이 간결해질 수 있을 것이다.
class Product {
int price;
int point;
}
class Tv extends Product {}
class Computer extends Product {}
class Buyer {
int money = 1000;
int point = 0;
void buy(Product p) {
money -= p.price;
point += p.point;
}
}
2. 여러 종류의 객체를 하나의 배열로 다루기
- 구매목록을 확인할 수 있는 장바구니를 만든다고 가정해보자.
- 장바구니에는 Tv, Computer 등의 여러가지 제품들이 들어갈 수 있다.
- 그리고, Tv나 Computer같은 제품들은 각각의 속성을 가지는 클래스라고 할 수 있다.
- 즉 여러가지 종류의 객체를 하나의 장바구니에 담아야 하는데 이는 다형성의 성질 덕에 가능하게 된다.
class Product {
int price;
Product() {};
Product(int price) {
this.price = price;
}
}
class Tv extends Product{
Tv(){
super(300);
}
// 최상위 class인 Object에서 toString()메서드 오버라이딩
public String toString(){
return "TV";
}
}
class Computer extends Product{
Computer(){
super(100);
}
public Object toString(){
return "Computer";
}
}
class Buyer{
int money = 1000;
Product cart[] = new Product(10);
int i = 0;
void buy(Product p){
money -= p.price;
cart[i++] = p;
}
}
- 위 예제에선 1번에서 설명한 매개변수의 다형성에 대한 내용은 생략.
- Buyer 클래스의 멤버로 Product 타입의 cart[]라는 배열을 생성했다.
- 여기서, cart[i++] = p 코드에서 볼 수 있듯이
인자로 자식 객체들이 들어와도 p에서는 다형성의 성질에 의해서 자식 인스턴스를 참조하기 때문에,
원하는 대로 cart라는 하나의 배열에 다양한 타입의 객체들이 들어올 수 있는 것이다.
'JAVA' 카테고리의 다른 글
22. 인터페이스 (0) | 2022.11.14 |
---|---|
21. 추상 클래스, 추상 메서드 (0) | 2022.11.11 |
19. 다형성, 참조변수의 형변환 (0) | 2022.11.10 |
18. 캡슐화 (0) | 2022.10.03 |
17. 제어자 (0) | 2022.10.03 |