김시용
1. 📌 핵심 개념 정리
✅ 요약하기
- 함수를 작게 만들어라
가독성을 위하여
블록과 들여쓰기는 1단~2단이 적당하다
함수는 한 가지 기능만 하게해라
> 지정된 함수 이름 아래 추상화 수준이 하나인 단계
> 의미 있는 이름을 가진 함수 추출 더 이상 불가한 단계
- switch 문
추상 팩토리에 숨긴다 -> 다른 클래스에 노출하지 않는다
다형적 객체를 생성하는 코드 안에서만 해당 (불가피한 상황 존재)
- 함수 이름 잘 짓기
서술적인 이름 사용 (동사) : 같은 문구, 명사, 동사 형태 사용includeSetupAndTeardownPages, includeSetpuPages, includeSuiteSetupPage, includeSetupPage 등
- 함수 인수
인수 개수는 적을수록 가독성이 좋다
단항 함수 : 변환 기능 (상태, 결과 반환) 이항 함수 : 값을 비교 (expected, actual 인수 비교)
플래그 인수는 상태를 저장하는 인수로 함수 여러 기능 처리를 함축함으로 사용X
인수 3개 이상 -> 일부 클래스 변수로 선언하기- 개선 전
Circle makeCircle (double x, double y, double radius)
- 개선 후
Circle makeCircle (Point center, double radius)
- 오류 코드보다 예외를 사용하라
if-else문 보단 try/catch문 사용 (별도로 함수로 뽑아내서 사용)
결론
처음부터 함수를 깔끔하게 짤 순 없다. 이름을 바꾸고 중복을 제거하고 코드를 다듬으며 완성시킨다.
2. 🤔 이해가 어려운 부분
🔍 질문하기
- 함수에 기능 하나씩
- 추상화
함수의 지정된 이름 아래 추상화 수준이 하나인 단계 - 궁금한 점
여기서 추상화란 정확히 무엇을 의미하는가?
- 추상화
- 반복하지 마라!
- 어려웠던 부분
AOP, COP가 정확히 무엇인가? - 궁금한 점
중복 제거에 어떻게 활용되는가?- AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)
프로그램의 핵심 기능(Core Concern)과 부가적인 기능(Cross-cutting Concern, 예: 로깅, 보안, 트랜잭션 관리)을 분리하여 코드의 중복을 제거하고 재사용성을 높이는 기법 - COP (Component-Oriented Programming, 컴포넌트 지향 프로그래밍)
프로그램을 독립적인 컴포넌트(Component) 단위로 구성하여 유지보수성과 재사용성을 높이는 프로그래밍 방식
- AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)
- 어려웠던 부분
3. 📚 참고 사항
추상화 수준이 하나란?
한 함수가 너무 낮은 수준의 작업(세부적인 로직)과 높은 수준의 작업(큰 개념)을 동시에 처리하면 안 된다는 뜻이야
- 개선 전
public void processOrder() {
// 주문 처리 (높은 수준)
System.out.println("주문을 처리합니다.");
// 데이터베이스에서 주문 정보 가져오기 (낮은 수준)
Order order = database.getOrderById(1);
// 결제 처리 (낮은 수준)
PaymentProcessor processor = new PaymentProcessor();
processor.processPayment(order);
// 이메일 전송 (낮은 수준)
EmailService emailService = new EmailService();
emailService.sendOrderConfirmation(order);
}
- 개선 후
public void processOrder() {
System.out.println("주문을 처리합니다.");
Order order = getOrder();
processPayment(order);
sendConfirmationEmail(order);
}
private Order getOrder() {
return database.getOrderById(1);
}
private void processPayment(Order order) {
PaymentProcessor processor = new PaymentProcessor();
processor.processPayment(order);
}
private void sendConfirmationEmail(Order order) {
EmailService emailService = new EmailService();
emailService.sendOrderConfirmation(order);
}