티스토리 뷰

Java+Spring/Java

[Java]다형성의 활용 예제

Vagabund.Gni 2022. 7. 15. 22:40
728x90
반응형

이 예제는 어제 수업시간에 배운 것이다.

 

다형성이라는 객체 지향 프로그래밍의 개념이 어떻게 실제로 사용되는지를 쉽게 볼 수 있다.

 

먼저 손님이 카페에 방문하여 커피를 주문하는 상황을 가정하자.

class Coffee {
    int price;

    public Coffee(int price) {
        this.price = price;
    }
}

class Americano extends Coffee {};
class CaffeLatte extends Coffee {};

class Customer {
    int money = 50000;
}

하나의 멤버와 생성자를 가진 Coffee 클래스와 그 하위 클래스 Americano, CaffeLatte가 선언되어 있다.

 

Customer 클래스는 손님을 나타내는데, 기본적으로 5만 원의 돈을 가지고 있다.

 

여기에서 손님이 아메리카노와 카페라떼를 각각 한 잔씩 사는 상황을 가정해 보자.

 

가장 간편하게는 다음과 같은 메서드를 Customer 클래스에 추가하는 방법이 있을 것이다.

void buyCoffee(Americano americano) { // 아메리카노 구입
	money = money - americano.price;
}

void buyCoffee(CaffeLatte caffeLatte) { // 카페라테 구입
	money = money - caffeLatte.price;
}

이 자체로도 충분히 좋은 코드이지만, 손님이 주문하려는 커피의 종류가 수십 종으로 늘어나면 문제가 생긴다.

 

각각 메뉴마다 새로운 타입을 매개변수로 전달해 주는 buyCoffee() 메서드를 추가해 주어야 하기 때문이다.

 

이때 앞서 살펴본 객체의 다형성을 사용해 메서드를 다음과 같이 바꿔줄 수 있다.

void buyCoffee(Coffee coffee) { // 매개변수의 다형성
        money = money - coffee.price;
    }

buyCoffee() 메서드가 메뉴들의 상위 클래스인 Coffee 타입을 매개변수로 받으면

 

하위 클래스 타입의 어느 것이나 매개변수로 전달될 수 있고, 매번 다른 타입의 참조 변수를

 

매개변수로 전달해 주는 번거로움을 줄일 수 있게 된다.

 

이제 코드 전체를 보면 다음과 같다.

package package2;

public class PolymorphismEx {
  public static void main(String[] args) {
    Customer customer = new Customer();
    customer.buyCoffee(new Americano());
    customer.buyCoffee(new CaffeLatte());

    System.out.println("현재 잔액은 " + customer.money + "원 입니다.");
  }
}

class Coffee {
  int price;

  public Coffee(int price) {
    this.price = price;
  }
}

class Americano extends Coffee {
  public Americano() {
    super(4000); // 상위 클래스 Coffee의 생성자를 호출
  }

  public String toString() {return "아메리카노";}; //Object클래스 toString()메서드 오버라이딩
};

class CaffeLatte extends Coffee {
  public CaffeLatte() {
    super(5000);
  }

  public String toString() {return "카페라떼";};
};

class Customer {
  int money = 50000;

  void buyCoffee(Coffee coffee) {
    if (money < coffee.price) { // 물건 가격보다 돈이 없는 경우
      System.out.println("잔액이 부족합니다.");
      return;
    }
    money = money - coffee.price; // 가진 돈 - 커피 가격
    System.out.println(coffee + "를 구입했습니다.");
  }
}

// 출력 결과
아메리카노를 구입했습니다.
카페라떼를 구입했습니다.
현재 잔액은 41000원 입니다.

앞서 확인한 바와 같이 객체의 다형성을 이용해 buyCoffee() 메서드의 매개변수로 Coffee 타입을 전달해 주었다. 

 

그러므로 객체를 생성하고 참조 변수를 사용할 때 이 Coffee 클래스만 상속받으면  buyCoffee(Coffee coffee) 메서드의

 

매개변수로 전달될 수 있다.

 

워낙 코드가 길지 않았어서 획기적으로 짧아진 건 잘 모르겠지만,

 

다형성을 이용해 매개변수를 조절하는 건 재미있다고 느꼈다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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 31
글 보관함