좋은 코드란?


좋은 코드란, 읽기 좋은 코드를 의미한다.

왜 읽기 좋은 코드가 좋은 코드일까?

읽기 좋은 코드를 작성하려면 시간이 걸리지만, 추후에 미래의 본인이나 협업자가 읽기 편해진다는 이점을 갖고 있다. 이는 곧 유지 보수에 있어 시간 절약을 가져다 줄 수 있다.

좋은 변수명 짓기


상수가 아닌 클래스의 멤버변수/지역변수/메서드 파라미터에는 소문자 카멜표기법을 적용한 명사로 사용한다.

의도가 분명한 이름

변수명은 변수가 표한하고 있는 것을 정확하게 설명할 수 있어야 하기 때문에 가능한 구체적으로 짓는 것이 좋다.

private static String[] split(String input) {
    Matcher matcher = Pattern.compile("//(.)\n(.*)").matcher(input);
 
    if (matcher.find()) {
        return matcher.group(2).split(matcher.group(1));
    }
    ...
 

위와 같이 매직넘버나 메서드가 여러번 호출된 코드는 협업이나 미래에 다시 보게 될 경우 알아보기 힘들 수 있다.

private static String[] split(String input) {
    Matcher matcher = Pattern.compile(CUSTOM_REGEX).matcher(input);
 
    if (matcher.find()) {
        String customDelimiter = matcher.group(CUSTOM_DELIMITER_INDEX);
        String customInput = matcher.group(CUSTOM_INPUT_INDEX);
 
        return customInput.split(customDelimiter);
    }
    ...
}

때문에 가능하면 상수나 변수를 활용하여 라인이 증가하더라도 읽기 좋은 코드를 만드는 것이 훨씬 효과적이다.

맥락을 고려한 이름

이름을 최대한 정확하게 짓다 보면 중복된 코드들이 탄생할 수 있다.

public class Car {
    private final String carName;
    private int carPosition;
}

위와 같이 객체의 상태를 나타내는 변수명의 경우 보통 car.carName 과 같이 호출되기 때문에 중복이 있는 이름이 될 수 있다.

public class Car {
    private final String name;
    private int position;
}

위와 같이 이름을 변경하더라도 충분한 정보를 전달할 수 있으며 호출 시에도 중복이 발생하지 않고 간결한 변수명으로 사용할 수 있다.

boolean 변수명 짓기

boolean 변수명의 경우 참의 의미를 함축하는 변수명을 사용하는 것이 좋다.

if (notFound == false) {}
if (found == true) {}

위 두 문장을 비교해봤을 때 문맥 상 찾았다는 의미를 내포하고 있지만 두 번째 문장이 훨씬 읽기 쉬운 것을 알 수 있다.

자료형 변수명 짓기

배열이나 컬렉션을 사용해 다량의 데이터를 다룰 경우 numberList 와 같은 변수명보다는 numbers 와 같은 복수형 변수명이 더 좋다.

만약 숫자 데이터를 List 에 담아 사용하던 numberList 변수가 갑작스럽게 Set 자료형을 사용해야 할 경우 변수명도 함께 변경해야 하는 상황이 발생한다.

하지만 numbers 와 같이 좀 더 넓은 의미의 숫자 데이터들을 모아 다루는 변수라고 지어둔다면 해당 변수의 자료형이 크게 바꾸지 않는 이상 변경할 일이 없어진다.

좋은 메서드명 짓기


메서드 이름은 기본적으로 소문자 카멜 표기법을 적용한 동사로 사용한다. 다른 타입으로 전환하는 메서드나 빌드 패턴을 구현한 클래스의 메서드에는 전치사를 쓸 수 있다.

JUnit 테스트 메서드명에는 메서드명_테스트상태_기대행위 와 같이 언더스코어로 구분 할 수 있다.

자주 사용되는 동사

  • init - 데이터를 초기화하는 메서드에 주로 쓰인다.
  • is - 맞는지 판단하는 메서드에 주로 쓰인다.
  • has - 데이터를 갖고 있는지 확인하는 메서드에 주로 쓰인다.
  • can - 할 수 있는지 확인하는 메서드에 주로 쓰인다.
  • register save insert put - 어떤 저장소(DB, 파일, 컬렉션 등)에 this 인스턴스 혹은 인자로 전달된 항목을 저장한다는 의미를 띠는 경우에 주로 쓰인다.
  • create build make - 저장 없이 인스턴스를 생성해 반환하는 메서드에 주로 쓰인다.
  • find - 데이터를 찾는 메서드에 주로 쓰인다.
  • to - 형변환하여 반환하는 메서드에 주로 쓰인다.
  • action-By-something - something 을 기준으로 action 을 하는 메서드에 주로 쓰인다.

References