프로그래밍/Java

상속에서 다형성 이야기

seungdols 2015. 7. 28. 21:03
public class Product {
    private int price;
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public Product(int price) {
        // TODO Auto-generated constructor stub
        this.price = price;
    }
    public Product()
    {
        this.price = 100;
    }
}

int price는 가격을 의미한다. 이 것은 나중에 자식 클래스에서 물건의 값을 설정 할 것이다.

public class TV extends Product{
    public TV() {
        // TODO Auto-generated constructor stub
        super(250);
    }
    public String toString(){
        return "TV";
    }
    public void show()
    {
        System.out.println("TV Call");
    }
}

super라는 키워드로 부모 클래스의 생성자를 호출하며, 인자로 250을 전달한다. 즉, int price에는 250의 가격이 책정 된다.

public class Computer extends Product{

    public Computer(){
        super(200);
    }
    public String toString(){
        return "Computer";
    }
}

super라는 키워드로 부모 클래스의 생성자를 호출하며, 인자로 250을 전달한다. 즉, int price에는 200의 가격이 책정 된다.

public class Buyer {
    int money = 1000;

    void buy(Product product)
    {
        if(money < product.getPrice()){
            System.out.println("잔액 부족");
            return;
        }
        money -= product.getPrice();
        System.out.println(product.toString() + "상품 구입");
    }
}

Buy 메소드가 좀 특이하다.
생소하게 생각 될 수 있다. 하지만 저것이 상속에서의 다형성이라고 표현 할 수 있다.
그렇지만 이해가 가지 않는다.
이 상품 상속 구조에서 어떻게 하나의 메소드로 다른 두 상품을 구매 할 수 있을까?
이게 바로 중요한 프로그래밍에서의 의문점이라고 할 수 있다. 이 코드는 왜 이렇지?라는 식..
(이런 바보 같은 질문이 당신의 능력을 키워준다.)
밑에서 설명을 들어보자.

public class Main {
    public static void main(String[] args) {
        Buyer b = new Buyer();
        TV tv = new TV();
        Computer com = new Computer();

        Product pro = new TV();
        ((TV)pro).show();

        b.buy(tv);
        b.buy(com);
    }
}

소스코드를 들여다보면 특이한 점이 있다. 무엇일까?

그것은 바로 Buyer 클래스에있는 메소드 Buy를 주목해보자.

매개변수가 특이하다. 참조변수형으로 선언 되어있다. 저렇게 하는 이유가 뭘까?

바로 다형성때문이다. 상속구조에 있을 경우 부모 클래스로 매개변수타입을 지정하게 되면,

자식 클래스들은 자동적으로 처리가 가능하다.

즉, 다른 클래스가 추가가 되더라도 이 형태를 유지하고 추가 되는 클래스를 Product 클래스를

상속하도록 만들면 클래스는 추가가 되더라도 코드를 재사용 할 수 있다.

다형성은 쉽게 이해가 되지 않는다._

그저 직접 해보는 수밖에 없다.

직접 메소드를 만들어 보자 그리고 Radio 클래스가 추가 된다고 생각해보라.

매개 변수 타입을 특정 타입으로 지정하게 되면 같은 기능을 가진 메소드를 오버로딩해야한다. ( 중복코드 발생 )

반응형

'프로그래밍 > Java' 카테고리의 다른 글

Intellij에서 Java lambda 사용시 Error 해결  (0) 2015.08.21
Java Generic Erasure  (0) 2015.08.01
Static의 이중성!  (0) 2015.01.03
for loop를 빠르게 사용하는 방법은???  (0) 2015.01.03
String을 쓰면 안 되는 이유!  (0) 2015.01.03