본문 바로가기
JAVA

20. 다형성의 장점

by seongju.lee 2022. 11. 10.

다형성의 장점

다형성이라고 하면 아래 3가지가 있었다.

  • 조상 타입의 참조변수가 자손 타입을 참조하는 것.
  • 참조변수의 형변환(사용 가능한 멤버의 갯수를 조절)
  • instanceof를 통한 형변환 가능여부 체크

 

이러한 다형성의 장점은 크게 두 가지가 존재한다.

  1. 다형적 매개변수
  2. 하나의 배열로 여러 종류의 객체 다루기

 

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