new 의 함정 — 실습 / 약 20분
의도적으로 「new 함정」 코드를 짜보고, 부품 교체 요청을 받았을 때 코드가 어떻게 부서지는지 직접 체감합니다. 다음 차시 IoC/DI 를 배울 때 「왜 이걸 배우는지」 가 살아있게 됩니다.
// File: OrderApp.java
class GmailSender {
void send(String msg) { System.out.println("📧 Gmail: " + msg); }
}
class OrderService {
private GmailSender mail = new GmailSender(); // ← 강한 결합!
void order() {
System.out.println("주문 처리...");
mail.send("주문 완료");
}
}
public class OrderApp {
public static void main(String[] args) {
OrderService service = new OrderService();
service.order();
}
}
$ javac OrderApp.java
$ java OrderApp
주문 처리...
📧 Gmail: 주문 완료
위 코드에 KakaoSender 클래스를 추가하고 OrderService 를 수정합니다.
class KakaoSender {
void notify(String msg) { System.out.println("💬 Kakao: " + msg); }
// ^^^^^^ Gmail 의 send 와 메서드 이름이 다르다!
}
GmailSender → KakaoSendernew GmailSender() → new KakaoSender()mail.send(...) → mail.notify(...) (메서드 이름 다름)mail 도 어색해짐 — 의미상 messenger 같은 게 맞음class OrderService {
private KakaoSender messenger = new KakaoSender(); // ← 모두 변경
void order() {
System.out.println("주문 처리...");
messenger.notify("주문 완료"); // ← 호출 코드도
}
}
다음 차시 IoC/DI 에서는 다음 패턴을 배웁니다 — 미리 살짝.
interface MessageSender {
void send(String msg);
}
class OrderService {
private MessageSender sender; // 인터페이스에 의존
OrderService(MessageSender sender) {
this.sender = sender; // 외부에서 받음 (주입)
}
void order() { sender.send("주문 완료"); }
}
이렇게 짜면 부품을 갈아끼워도 OrderService 는 한 줄도 수정 안 됩니다.