티스토리 뷰
지난 글에 이어서 조금 더 긴 코드로 인터페이스의 장점에 대해 알아보자.
상황은 다음과 같다.
- 카페를 운영하는 사람이 있다.
- 단골은 매일 같은 음료만 먹는다
- 단골손님 A는 아이스 아메리카노를 먹는다.
- 단골손님 B는 딸기라떼를 먹는다.
위와 같은 내용을 코드로 옮겨보면 다음과 같을 것이다.
class CafeCustomer {
public String CafeCustomerName;
public void setCafeCustomerName(String CafeCustomerName) {
this.CafeCustomerName = CafeCustomerName;
}
}
class CafeCustomerA extends CafeCustomer {
}
class CafeCustomerB extends CafeCustomer {
}
class CafeOwner {
public void giveItem(CafeCustomerB cafeCustomerB) {
System.out.println("give a glass of strawberry latte to CafeCustomer B");
}
public void giveItem(CafeCustomerA cafeCustomerA) {
System.out.println("give a glass of iced americano to Customer A");
}
}
public class OrderExample {
public static void main(String[] args) throws Exception {
CafeOwner cafeowner = new CafeOwner();
CafeCustomerA a = new CafeCustomerA();
CafeCustomerB b = new CafeCustomerB();
cafeowner.giveItem(a);
cafeowner.giveItem(b);
}
}
// 출력 결과
give a glass of iced americano to Customer A
give a glass of strawberry latte to CafeCustomer B
먼저 손님을 위한 CafeCustomer 클래스를 만들고 각각 CustomerA, B로 상속시킨다.
사장님을 위한 CafeOwner 클래스를 만들고 그 안에 giveItem()메서드를 선언해
각각 단골손님을 위한 출력 메시지를 지정한다.
이어서 OrderExample 클래스에서 CafeOwner 클래스를 이용해 객체를 생성하면
출력 결과와 같은 메시지가 반환된다.
잘 만들어진 코드이지만 앞의 글과 마찬가지로 단골의 수가 늘어난다면 어떻게 될까?
CafeOwner 클래스 내의 메서드를 오버로딩 해야하는 횟수가 그만큼 늘어날 것이다.
이번에도 인터페이스를 사용해 코드를 작성해 보자.
먼저 interface 키워드를 이용해 Customer 인터페이스를 생성한다.
public interface Customer {
// 상수
// 추상 메서드
}
계속해서 implements 키워드를 이용해 CafeCustomerA, B에 각각 Cusmoter 인터페이스를 구현한다.
public class CafeCustomerA implements Customer {
}
public class CafeCustomerB implements Customer {
}
이어서 인터페이스와 매개변수의 형변환을 이용해 CafeOwner 클래스를 새로 적는다.
// 기존 코드
public class CafeOwner {
public void giveItem(CafeCustomerB cafeCustomerB) {
System.out.println("give a glass of strawberry latte to CafeCustomer B");
}
public void giveItem(CafeCustomerA cafeCustomerA) {
System.out.println("give a glass of iced americano to CafeCustomer A");
}
}
// 인터페이스를 활용하여 작성한 코드
public class CafeOwner {
public void giveItem(Customer customer) {
System.out.println("??????????");
}
}
여기까지만 와도 손님의 수에 따라 구현해야 했던 메서드의 개수가 하나로 줄어들었다는 사실을 알 수 있다.
앞으로 손님이 늘어나더라도 CafeOwner 클래스는 Customer 타입을 매개변수로 받기 때문에
수정하지 않아도 된다.
계속해서 개별 단골 손님들이 주문한 내용을 다루기 위해 getOrder()라는 추상메서드를
Customer 인터페이스에 추가한 후 구현한다.
public interface Customer {
public abstract String getOrder();
}
public class CafeCustomerA implements Customer {
public String getOrder(){
return "a glass of iced americano";
}
}
public class CafeCustomerB implements Customer {
public String getOrder(){
return "a glass of strawberry latte";
}
}
추가된 메서드를 이용해 CafeOwner 클래스를 변경하면 다음과 같다.
public class CafeOwner {
public void giveItem(Customer customer) {
System.out.println("Item : " + customer.getOrder());
}
}
이제 마지막으로 모든 작업을 이어주면 아래와 같은 코드가 완성된다.
interface Customer {
String getOrder();
}
class CafeCustomerA implements Customer {
public String getOrder(){
return "a glass of iced americano";
}
}
class CafeCustomerB implements Customer {
public String getOrder(){
return "a glass of strawberry latte";
}
}
class CafeOwner {
public void giveItem(Customer customer) {
System.out.println("Item : " + customer.getOrder());
}
}
public class OrderExample {
public static void main(String[] args) throws Exception {
CafeOwner cafeowner = new CafeOwner();
// Customer cafeCustomerA = new CafeCustomerA();
// Customer cafeCustomerB = new CafeCustomerB();
cafeowner.giveItem(new CafeCustomerA());
cafeowner.giveItem(new CafeCustomerB());
}
}
// 출력 결과
Item : a glass of iced americano
Item : a glass of strawberry latte
앞서 살펴봤듯이 CafeOwner 클래스가 눈에 띄게 단순해진 것을 알 수 있다.
사실 단순해졌을 뿐 아니라 더 이상 단골 손님의 수에 의존하는 클래스가 아닌
독립적인 클래스가 되었다는 데 의미가 있다.
CafeOwner의 giveItem() 메서드의 매개변수를 다형성을 이용해 Customer 타입으로
할당하는 부분이 아직 완벽히 이해가 되지는 않지만, 이전 예제와 함께
반복해서 꾸준히 봐야겠다.
'Java+Spring > Java' 카테고리의 다른 글
[Java]List<E>, ArrayList<E>, LinkedList<E> (0) | 2022.07.15 |
---|---|
[Java]컬렉션 프레임워크(Collection Framework) (0) | 2022.07.15 |
[Java]제네릭(Generic) (0) | 2022.07.15 |
[Java]final 키워드, 인터페이스(Interface) (0) | 2022.07.15 |
[Java]추상화, abstract 제어자, 추상 클래스 (0) | 2022.07.15 |
[Java]다형성의 활용 예제 (0) | 2022.07.15 |
- Total
- Today
- Yesterday
- 리스트
- 스트림
- 백준
- 기술면접
- 스프링
- 중남미
- a6000
- java
- spring
- 동적계획법
- 유럽
- 세계일주
- 맛집
- Algorithm
- 남미
- 유럽여행
- 세계여행
- 지지
- 파이썬
- 야경
- 자바
- 칼이사
- 면접 준비
- Backjoon
- 세모
- 알고리즘
- Python
- 여행
- RX100M5
- BOJ
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |