Skip to main content

김시용

1. 📌 핵심 개념 정리

✅ 요약하기

  1. 함수를 작게 만들어라
    가독성을 위하여
    블록과 들여쓰기는 1단~2단이 적당하다
    함수는 한 가지 기능만 하게해라
    > 지정된 함수 이름 아래 추상화 수준이 하나인 단계
    > 의미 있는 이름을 가진 함수 추출 더 이상 불가한 단계

  1. switch 문
    추상 팩토리에 숨긴다 -> 다른 클래스에 노출하지 않는다
    다형적 객체를 생성하는 코드 안에서만 해당 (불가피한 상황 존재)

  1. 함수 이름 잘 짓기
    서술적인 이름 사용 (동사) : 같은 문구, 명사, 동사 형태 사용
    includeSetupAndTeardownPages, includeSetpuPages, includeSuiteSetupPage, includeSetupPage 등
    

  1. 함수 인수
    인수 개수는 적을수록 가독성이 좋다
    단항 함수 : 변환 기능 (상태, 결과 반환) 이항 함수 : 값을 비교 (expected, actual 인수 비교)
    플래그 인수는 상태를 저장하는 인수로 함수 여러 기능 처리를 함축함으로 사용X
    인수 3개 이상 -> 일부 클래스 변수로 선언하기
    • 개선 전
    Circle makeCircle (double x, double y, double radius)
    
    • 개선 후
    Circle makeCircle (Point center, double radius)
    

  1. 오류 코드보다 예외를 사용하라
    if-else문 보단 try/catch문 사용 (별도로 함수로 뽑아내서 사용)

결론
처음부터 함수를 깔끔하게 짤 순 없다. 이름을 바꾸고 중복을 제거하고 코드를 다듬으며 완성시킨다.


2. 🤔 이해가 어려운 부분

🔍 질문하기

  1. 함수에 기능 하나씩
    • 추상화
      함수의 지정된 이름 아래 추상화 수준이 하나인 단계
    • 궁금한 점
      여기서 추상화란 정확히 무엇을 의미하는가?

  1. 반복하지 마라!
    • 어려웠던 부분
      AOP, COP가 정확히 무엇인가?
    • 궁금한 점
      중복 제거에 어떻게 활용되는가?
      • AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)
        프로그램의 핵심 기능(Core Concern)과 부가적인 기능(Cross-cutting Concern, 예: 로깅, 보안, 트랜잭션 관리)을 분리하여 코드의 중복을 제거하고 재사용성을 높이는 기법
      • COP (Component-Oriented Programming, 컴포넌트 지향 프로그래밍)
        프로그램을 독립적인 컴포넌트(Component) 단위로 구성하여 유지보수성과 재사용성을 높이는 프로그래밍 방식

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);
}