Skip to main content

김주엽

1. 📌 핵심 개념 정리

✅ 요약하기

  1. 의도를 분명히 밝혀라.
    좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다.
    만약 주석이 필요하다면 그 이름은 의도를 분명히 드러내지 못한 것이다.
  • 개선 전
  int d; // 경과 시간(단위: 날짜)

  public List<int[]> getThem() {
    List<int[]> list1 = new ArrayList<int[]>();
    for (int[] x : theList){
      if (x[0] == 4) {
        list1.add(x);
      }
      return list1;
    }
  }

변수 d는 아무 의미가 드러나지 않는다. 또한 getThem 메서드는 코드가 하는 일을 짐작하기 어렵다.

  • 개선 후
  int elapsedTimeInDays;
  int daysSinceCreation;
  int daysSinceModification;
  int fileAgeInDays;

  public List<Cell> getFlaggedCells() {
    List<Cell> flaggedCells = new ArrayList<Cell>();
    for (Cell cell : gameBoard){
      if (cell.isFlagged()) {
        flaggedCells.add(x);
      }
      return flaggedCells;
    }
  }
  1. 우선 측정 값과 단위를 포함해 변수 이름을 개선했다.
  2. getThem 메서드의 경우 int 배열을 사용하는 대신 간단한 클래스로 만들고
  3. isFlagged라는 좀 더 명시적인 함수를 사용해 조건문을 비교한다.
  4. 단순히 이름만 고쳤는데도 함수가 하는 일을 이해하기 쉬워졌는데 이것이 좋은 이름이 주는 위력이다.

  1. 그릇된 정보는 피하고 의미 있게 구분하라.
    그릇된 정보란 코드의 의미를 혼란스럽게 하거나 오해를 유발할 수 있는 정보를 말한다.
    만약 다음과 같은 코드가 있을 때 사용자의 계정을 가져오려면 어느 메서드를 호출해야 할까?
      getActiveAccount();
      getActiveAccouts();
      getActiveAccountInfo();
    
    명확한 관례가 없다면 프로젝트에 새로 참여한 프로그래머는 어느 함수를 호출할지 알기 어렵다.
    이런 코드를 그릇된 정보를 담은 코드라고 할 수 있다.
  • 개선 전
  int hp, aix, sco;
  int[] accountList;

  void XYZControllerHandlingOfStrings();
  void XYZControllerStorageOfStrings();

  public static void copyChars(char a1[], char a2[]) {
    for (int i = 0; i < a1.length; i++) {
      a2[i] = a1[i];
    }
  }
  1. hp, aix, sco는 유닉스 플랫폼을 가리키는 이름이기에 오해가 발생할 수 있다.
  2. accountList의 경우 int배열이지만 변수에 List를 붙여 오해의 소지를 발생시키고 있다.
  3. XYZControllerHandlingOfStrings 메서드와 XYZControllerStorageOfStrings 메서드 역시 단어가 비슷해 구분하기 어렵다.
  4. copyChars 메서드에서는 매개변수의 이름을 a1, a2, ..., aN 형식으로 지정해 매개변수에 대해 아무런 정보를 제공하지 않고 있다.
  • 개선 후
  int healthPoints, auxiliaryIndex, groupScore; 
  int[] accounts; 

  void convertStringsInXYZController(); 
  void storeStringsInXYZController(); 

  public static void copyCharacters(char source[], char destination[]) { 
    for (int i = 0; i < source.length; i++) { 
        destination[i] = source[i]; 
    } 
  }
  1. 의미가 명확한 healthPoints, auxiliaryIndex, groupScore로 변경하자 어떤 변수인지 확인하기 쉬워졌다.
  2. 이름 끝에 List 대신 s를 붙여 계정을 저장하는 int배열인 것을 좀 더 명확히 했다.
  3. 메서드의 이름을 역할을 명확히 구분할 수 있도록 수정했다.
  4. 매개변수의 이름을 source, destination로 변경해 의미를 쉽게 파악할 수 있도록 수정했다.

  1. 발음하기 쉽고 검색하기 쉬운 이름을 사용하라.
    발음하기 어려운 이름은 토론하기도 어렵다.
    또한 검색하기 쉽도록 많은 코드에 들어갈 법한 단어, 숫자는 사용하지 않는 것이 좋다.
  • 개선 전
  class DtaRcrd102 {
    private Date genymdhms;
  }

위의 코드에서 genymdhms를 발음하려면 어떻게 할까?
저자는 "제니 엠 디 에이치 엠 에스"라고 발음했다. 상당히 우스꽝스러운 발음이었지만 재미는 있을 수 있다.
그러나 매우 형편없는 이름이다. 또한 클래스 DtaRcrd102의 경우 검색할 때 철자가 하나라도 틀리면 원하는 결과를 찾기 어렵다.

  • 개선 후
  class Customer {
    private Date generationTimestamp;
  }

코드 개선 후 발음하기 편하고 검색하기 명확해지기에 원하는 결과를 찾기 쉬워졌다.
"홍길동씨 이 레코드좀 보세요. 'Generation Timestamp'값이 내일 날짜입니다."


  1. 인코딩을 피하라.
    인코딩이란 헝가리안 표기법, 접두사/접미사 기반 네이밍, 불필요한 축약어 등을 말한다.
    과거에는 컴파일러가 타입 점검을 지원하지 않아 프로그래머가 타입을 기억할 단서가 필요했다.
    그러나 현재는 IDE가 눈부시게 발전하며 헝가리안 표기법이나 기타 인코딩 방식은 방해가 된다.
  • 개선 전
  interface IShapeFactory {
    void print(); 
  }

  class CShapeFactory implements IShapeFactory {
    private String m_name;

    @Override
    public void print() {
      System.out.println(m_name);
    }
  }

자바의 경우 강한 타입 언어이고 IDE는 컴파일하지 않고도 타입 오류를 감지할 수 있을 정도로 발전했다.
따라서 클래스, 변수 등에 붙이는 접두어는 더이상 불필요하다.

  • 개선 후
  interface ShapeFactory {
    void print(); 
  }

  class ShapeFactoryImpl implements ShapeFactory {
    private String name;

    @Override
    public void print() {
      System.out.println(name);
    }
  }

코드에 집중할 수 있도록 접두어를 제거해 불필요한 정신적 부담을 줄였다.


2. 🤔 이해가 어려운 부분

🔍 질문하기

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

  1. 개념 또는 원칙의 이름
    • 어려웠던 부분
      해당 개념이 헷갈리거나 명확하지 않았던 점을 구체적으로 설명합니다.
    • 궁금한 점
      해당 개념이 어떤 원리로 동작하는지, 실무에서 어떻게 활용되는지 등을 질문 형태로 정리합니다.

  1. 개념 또는 원칙의 이름
    • 어려웠던 부분
      .
    • 궁금한 점
      .

  1. 개념 또는 원칙의 이름
    • 어려웠던 부분
      .
    • 궁금한 점
      .

3. 📚 참고 사항

📢 논의하기

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

  1. 관련 자료 공유

  1. 논의하고 싶은 주제
    • 주제
      논의하고 싶은 내용을 간략히 정리합니다.
    • 설명
      논의하고 싶은 이유를 작성합니다.