자바의 정석 - 매개변수의 다형성 (어렵)

Yohan·2024년 1월 22일
0

매개변수의 다형성

  • 참조형 매개변수는 메서드 호출 시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.

다형성

  1. Tv t = new SmartTv(); 조상 타입의 참조변수로 자손 객체를 다루는 것
  2. 참조변수의 형변환 (리모콘 바꾸기) - 사용가능한 멤버변수 개수 조절
  3. instanceof 연산자 - 형변환 가능여부 확인

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; // 보너스점수
}
  • 위 Buyer class에 오버로딩을 통해 아래 메서드들을 추가
    -> 하지만 이 방법은 코드 중복 발생
    void buy (Tv t) {
        money -= t.price;
        bonusPoint +=t.bonusPoint;
    }

    void buy (Computer c) {
        money -= c.price;
        bonusPoint +=c.bonusPoint;
    }

    void buy (Audio a) {
        money -= a.price;
        bonusPoint +=a.bonusPoint;
    }
  • 그래서 위 코드를 아래와 같이 수정
    void buy (Product p) {
        money -= p.price;
        bonusPoint +=p.bonusPoint;
    }
  • 조상 타입의 참조변수로 자손 객체를 다루는 것이 가능한 다형성의 특징을 이용하여 아래 코드를 이용하여 위 메서드에 대입 가능!
Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();

class Product {
    int price; // 제품 가격
    int bonusPoint; // 제품 구매 시 제공하는 보너스점수

    Product(int price) {
        this.price = price;
        bonusPoint = (int) (price / 10.0); // 보너스점수는 제품 가격의 10%
    }
}


class Tv1 extends Product {
    Tv1() {
        // 조상클래스의 생성자 Product(int price)를 호출한다.
        super(100); // Tv의 가격 : 100만원
    }

    // Object 클래스의 toString()을 오버라이딩한다.
    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 + "을/를 구입하셨습니다.");
    }
}

class Ex {
    public static void main(String[] args) {
        Buyer b = new Buyer();

        // Product p = new Tv1();
        // b.buy(p); = b.buy(new Tv1());와 동일
        b.buy(new Tv1());
        b.buy(new Computer());

        System.out.println("현재 남은 돈은" + b.money + "만원입니다.");
        System.out.println("현재 보너스점수는" + b.bonusPoint + "점입니다.");
    }
}
profile
백엔드 개발자

0개의 댓글