Skip to main content

김주엽

1. 📌 핵심 개념 정리

✅ 요약하기

  1. 경계 살피고 익히기
  • 외부 코드를 통합하기 전에 간단한 테스트 케이스를 작성해 외부 코드를 익히자.
  • 짐 뉴커크는 이를 학습 테스트라고 부르는데 학습 테스트는 프로그램에서 사용하려는 방식대로 외부 API를 호출한다.
  • 학습 테스트는 API를 사용하려는 목적에 초점을 맞춘다.

  1. 학습 테스트는 공짜 이상이다
    • 학습 테스트는 투자하는 노력보다 얻는 성과가 더 크다.
    • 학습 테스트는 패키지가 실제로 예상대로 도는지 검증한다.
    • 사용하던 패키지가 버전이 바뀔 경우 학습 테스트가 이 사실을 곧바로 밝혀낸다.
    • 학습 테스트를 있든 없든 실제 코드와 동일한 방식으로 인터페이스를 사용하는 테스트 케이스가 필요하다.
      • 이 경우 학습 테스트가 있다면 패키지를 새 버전으로 이전하기 쉬워진다.

  1. 아직 존재하지 않는 코드를 사용하기
    • 아는 코드와 모르는 코드를 분리하라.
    • 때로는 우리 지식이 경계를 너머 미치지 못하는 코드 영역이 있다.
    • 필요한 기능에 대해 인터페이스를 먼저 정의하라.
      • 인터페이스를 구현하면 코드 가독성이 높아지고 의도도 분명해진다.

  1. 깨끗한 경계
    • 경계에 위치하는 코드는 깔끔하게 분리한다.
    • 기대값을 정의하는 테스트 케이스를 작성하자.
    • 통제가 불가능한 외부 패키지에 의존하지 않고 통게 가능한 우리 코드에 의존하는 편이 훨씬 좋다.
    • 외부 패키지를 호출하는 코드를 가능한 줄여라.
      • 새로운 클래스로 경계를 감싸거나 Adapter패턴을 사용하라.

2. 🤔 이해가 어려운 부분

🔍 질문하기

책을 읽으며 이해하기 어려웠던 개념이나 명확하지 않았던 내용을 정리합니다.

  1. 깨끗한 경계
    • 어려웠던 부분
      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. 📚 참고 사항

📢 논의하기

관련된 자료가 있다면 공유하고, 더 깊이 논의하고 싶은 아이디어나 의견을 정리합니다.

  1. 관련 자료 공유