김주엽
1. 📌 핵심 개념 정리
✅ 요약하기
- 경계 살피고 익히기
- 외부 코드를 통합하기 전에 간단한 테스트 케이스를 작성해 외부 코드를 익히자.
- 짐 뉴커크는 이를 학습 테스트라고 부르는데 학습 테스트는 프로그램에서 사용하려는 방식대로 외부 API를 호출한다.
- 학습 테스트는 API를 사용하려는 목적에 초점을 맞춘다.
- 학습 테스트는 공짜 이상이다
- 학습 테스트는 투자하는 노력보다 얻는 성과가 더 크다.
- 학습 테스트는 패키지가 실제로 예상대로 도는지 검증한다.
- 사용하던 패키지가 버전이 바뀔 경우 학습 테스트가 이 사실을 곧바로 밝혀낸다.
- 학습 테스트를 있든 없든 실제 코드와 동일한 방식으로 인터페이스를 사용하는 테스트 케이스가 필요하다.
- 이 경우 학습 테스트가 있다면 패키지를 새 버전으로 이전하기 쉬워진다.
- 아직 존재하지 않는 코드를 사용하기
- 아는 코드와 모르는 코드를 분리하라.
- 때로는 우리 지식이 경계를 너머 미치지 못하는 코드 영역이 있다.
- 필요한 기능에 대해 인터페이스를 먼저 정의하라.
- 인터페이스를 구현하면 코드 가독성이 높아지고 의도도 분명해진다.
- 깨끗한 경계
- 경계에 위치하는 코드는 깔끔하게 분리한다.
- 기대값을 정의하는 테스트 케이스를 작성하자.
- 통제가 불가능한 외부 패키지에 의존하지 않고 통게 가능한 우리 코드에 의존하는 편이 훨씬 좋다.
- 외부 패키지를 호출하는 코드를 가능한 줄여라.
- 새로운 클래스로 경계를 감싸거나
Adapter
패턴을 사용하라.
- 새로운 클래스로 경계를 감싸거나
2. 🤔 이해가 어려운 부분
🔍 질문하기
책을 읽으며 이해하기 어려웠던 개념이나 명확하지 않았던 내용을 정리합니다.
- 깨끗한 경계
- 어려웠던 부분
Adapter
패턴에 대한 언급이 있는데 이론만 알지 다뤄본 경험이 없어 이해가 안갔다. - 이해한 점
- 서로 다른 두 서비스를 중간에 위치해 연결해 주는 역할을 하는 패턴을 말한다.
- 기존 코드를 변경하지 않고 연결해 주는 역할인 어댑터 클래스를 만들어서 변환한다.
- 기존 클래스를 변경하지 못하거나 새로운 시스템을 기존 시스템과 호환되게 할 때 사용한다.
- 예시
// Micro USB 충전 방식 interface MicroUSB { void chargeWithMicroUSB(); } // Micro USB를 사용하는 기존 핸드폰 class OldPhone implements MicroUSB { public void chargeWithMicroUSB() { System.out.println("마이크로 USB로 충전 중..."); } } // USB-C 충전 방식 interface USBTypeC { void chargeWithUSBTypeC(); } // USB-C를 사용하는 새로운 충전기 class NewCharger implements USBTypeC { public void chargeWithUSBTypeC() { System.out.println("USB-C로 충전 중..."); } }
Micro USB
충전 방식을 사용하는 핸드폰에USB-C
충전기를 사용할 일이 발생했다고 가정하자.
이 경우 두 충전기를 변환하는 어댑터가 필요하다.
기존의// 변환에 사용하는 어댑터 클래스 class USBAdapter implements MicroUSB { private USBTypeC usbTypeCDevice; public USBAdapter(USBTypeC usbTypeCDevice) { this.usbTypeCDevice = usbTypeCDevice; } @Override public void chargeWithMicroUSB() { System.out.println("USB-C를 마이크로 USB로 변환 중..."); usbTypeCDevice.chargeWithUSBTypeC(); // USB-C 충전기 사용 } }
Micro USB
를 어댑터 클래스에implements
키워드로 구현하고has-a
관계로 변환하려는 서비스를 참조한다.
이후에 오버라이딩된 메서드에서USB-C
에서 사용하는 메서드를 호출해준다.
아래는 최종 사용 예시이다.OldPhone oldPhone = new OldPhone(); // 기존 핸드폰 NewCharger newCharger = new NewCharger(); // 새로운 USB-C 충전기 // 기존 핸드폰은 마이크로 USB만 지원 -> USB-C 어댑터 필요 USBAdapter adapter = new USBAdapter(newCharger); adapter.chargeWithMicroUSB(); // 어댑터를 통해 USB-C 충전기 사용
- 어려웠던 부분
3. 📚 참고 사항
📢 논의하기
관련된 자료가 있다면 공유하고, 더 깊이 논의하고 싶은 아이디어나 의견을 정리합니다.
- 관련 자료 공유