김시용
1. 📌 핵심 개념 정리
✅ 요약하기
각자 해당 챕터에서 중요하다고 느낀 개념이나 아이디어를 간략하게 정리하고 개선 전, 후에 대한 예시 코드를 비교하며 개념을 설명합니다.
- 모든 테스트를 실행하라
시스템은 검증이 가능해야 한다 = 테스트가 가능한 시스템
모든 테스트를 실행하기 위해선 SRP 및 DIP 준수하게 된다.
-> 의존성 주입, 인터페이스, 추상화 등과 같은 도구를 사용해 결합도를 낮춘다.
즉, 시스템은 낮은 결합도와 높은 응집력을 가져야 한다.
- 리팩터링: 중복을 없애라
중복이란, 구조가 똑같거나 비슷한 코드
깔끔한 시스템을 위해서는 단 몇줄이라도 중복을 제거하겠다는 의지가 필요하다.
아주 작은 양이지만 공통 부분을 새 메서드로 뽑고 보니 클래스가 SRP를 위반하는 경우도 있다
-> 해당 메서드를 다른 클래스로 옮겨도 좋다. (소규모 재사용 = 추상화를 통해 재사용 기회 포착할 수 있다)
- TEMPLATE METHOD
알고리즘의 구조를 정의하고, 일부 단계를 서브클래스에서 구현하도록 하는 디자인 패턴입니다.
이 패턴을 사용하면 알고리즘의 주요 흐름은 그대로 두고, 세부적인 구현만 서브클래스에서 변경할 수 있습니다. 이렇게 하면 코드의 중복을 줄이고, 변경이 필요한 부분을 쉽게 수정할 수 있습니다.
- 리팩터링: 표현하라
프로젝트 비용 중 대다수는 장기적인 유지보수에 들어간다. 이러한 유지보수를 편하게 하기 위해 코드는 개발자의 의도를 분명히 표현해야 한다.- 좋은 이름 선택
- 함수와 클래스 크기 가능한 줄이기
- 표준 명칭 사용
- 단위 테스트 케이스 꼼꼼히 작성하기
즉, 나중에 읽을 사람을 고려해 조금이라도 읽기 쉽게 만들려고 충분히 고민하고 노력하기
- 리팩터링: 클래스와 메서드 수 최소화
함수와 클래스 수를 가능한 줄이기
= 독단적인 견해는 멀리하고 실용적인 방식 택하기
4가지 규칙중 우선순위가 가장 낮다.
2. 🤔 이해가 어려운 부분
🔍 질문하기
책을 읽으며 이해하기 어려웠던 개념이나 명확하지 않았던 내용을 정리합니다.
- TEMPLATE METHOD
-
어려웠던 부분
TEMPLATE METHOD 사용 방법 -
궁금한 점
예시를 통해 사용 방법 익히기 -
예시: 커피 만들기와 차 만들기
커피와 차를 만드는 과정을 템플릿 메서드를 통해 공통된 흐름을 정의하고, 각 음료의 세부적인 부분은 자식 클래스에서 구현하도록 합니다. -
추상 클래스: 공통된 알고리즘 정의 (알고리즘의 뼈대 제공)
abstract class CaffeineBeverage { // 템플릿 메서드: 알고리즘의 뼈대를 정의 public final void prepareRecipe() { boilWater(); brew(); pourInCup(); addCondiments(); } // 공통 단계: 물 끓이기 private void boilWater() { System.out.println("물 끓이는 중..."); } // 세부 단계: 서브클래스에서 구현해야 할 부분 protected abstract void brew(); // 공통 단계: 컵에 붓기 private void pourInCup() { System.out.println("컵에 붓는 중..."); } // 세부 단계: 서브클래스에서 구현해야 할 부분 protected abstract void addCondiments(); }
-
-
CaffeineBeverage 클래스를 상속받아 커피 만들기 알고리즘을 구현
class Coffee extends CaffeineBeverage { @Override protected void brew() { System.out.println("커피를 추출하는 중..."); } @Override protected void addCondiments() { System.out.println("설탕과 크림을 추가하는 중..."); } }
-
CaffeineBeverage 클래스를 상속받아 차 만들기 알고리즘을 구현
class Tea extends CaffeineBeverage { @Override protected void brew() { System.out.println("차를 우려내는 중..."); } @Override protected void addCondiments() { System.out.println("레몬을 추가하는 중..."); } }
No Comments