티스토리 뷰
이 예제는 어제 수업시간에 배운 것이다.
다형성이라는 객체 지향 프로그래밍의 개념이 어떻게 실제로 사용되는지를 쉽게 볼 수 있다.
먼저 손님이 카페에 방문하여 커피를 주문하는 상황을 가정하자.
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) 메서드의
매개변수로 전달될 수 있다.
워낙 코드가 길지 않았어서 획기적으로 짧아진 건 잘 모르겠지만,
다형성을 이용해 매개변수를 조절하는 건 재미있다고 느꼈다.
'Java+Spring > Java' 카테고리의 다른 글
[Java]인터페이스의 활용 예제 (0) | 2022.07.15 |
---|---|
[Java]final 키워드, 인터페이스(Interface) (0) | 2022.07.15 |
[Java]추상화, abstract 제어자, 추상 클래스 (0) | 2022.07.15 |
[Java]참조 변수의 타입 변환 / instanceof 연산자 (0) | 2022.07.15 |
[Java]다형성(Polymorphism) (0) | 2022.07.15 |
[Java]Getter/Setter 메서드 (0) | 2022.07.15 |
- Total
- Today
- Yesterday
- 칼이사
- 자바
- 파이썬
- 지지
- 유럽
- a6000
- 리스트
- 기술면접
- 백준
- 스프링
- RX100M5
- 세계여행
- 알고리즘
- java
- Algorithm
- 남미
- 중남미
- 맛집
- 여행
- 야경
- spring
- 세계일주
- Backjoon
- 스트림
- 유럽여행
- 동적계획법
- BOJ
- Python
- 면접 준비
- 세모
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |