인터페이스 실습문제를 받았는데 선생님이 "DeliveryOrder 내부에 인터페이스를 생성하세요~" 라는것임
하지만 전 밖에 생성하는 것도 어려운데여....
일주일 동안 이걸 왜 안에다가 넣을 걸까 왜왜왜 하면서 동기들의 설명도 들어보고 했는데 설명 들을땐 그렇구나 했다가 생각 할수록 이해가 안되는 것임....구글링도 해봤는데 이해가 안됨...쌤한테도 여쭤봤는데 이해가 안됨...
그렇게 찜찜하게 상속부터 공부하다가 인터페이스의 이름이 OnDelivery 라는걸 발견함 갑자기 익숙해서 생각해보니까
리액트 할때 onClick이 생각났다 그래서 다시 한번 중첩 인터페이스에 대해서 찾아보니까 아니나 다를까 이벤트를 다룰때 사용한다는 거임 그래서 구글에 나와있는 내용과 비교를 해봤다.
일단 실습에 사용된 코드는 이렇다
public class DeliveryOrder extends Order{
private String locate;
private OnDelivery onDelivery;
// 인터페이스
interface OnDelivery{
void successDelivery(String menu, String locate, int count);
}
public void setOnDelivery(OnDelivery onDelivery){
this.onDelivery = onDelivery;
}
// 생성자
public DeliveryOrder(String menu, int count, int price) {
super(menu, count, price);
}
}
이렇게 클래스 안에 인터페이스를 만들었는데 구글링에 따르면 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위함이라고 한다.
우선,.,,
// 메인 메서드
Order order = kiosk.initOder(menu, count, orderCode);
메인 메소드 에서 initOrder을 실행하고 init order에서 가격에 대한 처리를 해준다
initOrder은 가격에 대한 처리를 하고 Order 타입을 반환한다
DeliveryOrder order = new DeliveryOrder(menu, count, price);
order.setOnDelivery(this);
return order;
근데 중간에 setOnDelivery를 실행한다 안에 this를 넣어서...이 메소드는 kiosk클래스 안에 있기 때문에 this는 키오스크 클래스를 가리킨다 그렇게 실행된 메소드는 위의 코드처럼 DeliveryOrder클래스의 멤버변수를 초기화 시켜준다
여기서 중요한게 setOnDelivery라는 메소드이다 이 메소드는 onDelivery안에 successDelivery가 구현된 클래스면 모두 받아준다 이 코드에선 그게 키오스크 지만 successDelivery라는 클래스가 구현된 클래스라면 뭐든지 받을 수 있다, 구글링의 예제에서도
button btn = new Button();
btn.setOnClickListener(new CallListener());
btn.touch();
btn.setOnClickListener(new MessageListener());
btn.touch();
구현된 클래스 중에서 뭘 넣었냐에 따라서 필드변수가 바뀌면서 결과가 달라진다
정리
onClick처럼 onDelivery는 이벤트처리의 목적이다
setOnDelivery()는 그 클래스 안에는 뭐가 있는지 모른다!! 하지만 onDelivery 인터페이스의 successDelivery를 구현한 클래스는 모두 들어올 수 있다.(여기선 최종 기능을 수행하는 부분이 kiosk이기 때문에 kiosk에 구현했다)
최종적으로 kiosk 클래스에서 runOrder를 실행하면 onClick처럼 onDelivery가 실행되면서 주문을 완료한다!!
'IT 연구소' 카테고리의 다른 글
다형성 (0) | 2023.08.15 |
---|---|
type casting (0) | 2023.08.14 |
인터페이스의 장점 (0) | 2023.08.06 |
숫자를 문자로 형변환 하는 세가지 방법 (0) | 2023.07.04 |
getter 와 setter (0) | 2023.06.29 |