Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

매개변수의 다형성(다형성 장점 1) 본문

Java/객체지향

매개변수의 다형성(다형성 장점 1)

빌드이너프 2023. 6. 13. 14:25

다형성이란

조상 타입 참조 변수로 자손 타입 객체를 다루는 것

 

참조변수의 형변환이란

사용할 수 있는 멤버의 갯수를 조절하는 것(리모컨 바꾸기)

 

instanceof

참조변수의 형변환 가능여부 확인, 가능할 경우 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 메서드 안에서만 사용 가능하다