코딩 규칙과 방법들

Code를 Clean하게 작성하는 방법!

SoU330 2024. 10. 22. 21:53

 

 

 

Clean Code

코드를 클린하게 작성해야 하는 이유는 유지보수성, 확장성, 가독성과 관련이 있다.

클린 코드는 개인 개발자뿐만 아니라 팀 전체의 생산성과 코드 품질에 큰 영향을 미치며 여러 장점이 있다.

코드를 클린하게 작성하면 유지보수성 향상, 가독성 향상, 확장성과 재사용성 증가, 디버깅 및 테스트 용이, 생산성 증가, 코드 품질 및 신뢰성 향상, 기술 부채 감소, 자신의 성장 등의 효과가 있다.

 

 

 

 

 

 

1. 의미 있는 이름 짓기

  • 변수, 함수, 클래스 이름은 명확하게
    이름만 보고도 그 역할을 쉽게 이해할 수 있어야 한다. 축약어를 피하고 이름이 구체적일수록 좋다.
  • 불필요한 정보 제거
    함수나 클래스 이름에 정보를 과도하게 포함하지 말고 필요 최소한의 정보만 담아야 한다.
  • 일관성 유지
    프로젝트 전체에서 같은 개념에는 같은 단어를 사용해야 한다. 예를 들어 get을 사용했다면 다른 곳에서 fetch나 retrieve를 섞어 쓰지 말아야한다.
// 나쁜 예시
int d; // 날짜를 나타내지만 알 수 없음

// 좋은 예시
int daysSinceModification; // 수정된 이후의 날짜 수

 

 

 

 

 

 

2. 함수는 작고 한 가지 역할만 하게 만들기

  • 단일 책임 원칙(Single Responsibility Principle)
    함수는 하나의 책임만 가져야 한다. 
    함수는 한 가지 작업만 수행해야 하고 그 작업을 명확하게 해야 한다.
  • 작고 간결한 함수
    함수의 길이가 짧을수록 가독성이 좋아진다.
    10줄을 넘기지 않는 것을 추천하고, 큰 함수는 더 작은 함수로 쪼개는 것이 좋다.
  • 함수 이름은 동사로 시작
    함수는 행동을 나타내므로 함수 이름을 동사로 짓는 것이 좋다.

 

 

 

 

 

 

3. 주석을 피하고 코드를 설명하기

  • 코드 자체가 문서처럼
    주석을 남발하는 것보다는 코드를 명확하게 작성하여 주석이 필요 없도록 만드는 것이 중요하다.
  • 주석은 보충 설명용
    주석은 코드가 명확하지 않거나 복잡한 부분에 대해서만 사용하고 가능한 한 코드를 명확하게 하여 주석 없이도 이해할 수 있도록 해야 한다.
// 나쁜 예시
// 사용자 정보를 저장합니다.
saveUserInfo();

// 좋은 예시
saveUserInformationToDatabase(); // 코드만으로도 충분히 설명됨

 

 

 

 

 

 

 

4. 매직 넘버(Magic Number)를 피하고 상수를 사용하기

  • 매직 넘버는 상수로 대체
    숫자나 문자열을 코드 내에서 직접 사용하는 대신, 의미 있는 상수로 대체해야 한다.
    코드의 가독성을 높이고 수정 시에도 여로 군데를 수정할 필요 없이 한 곳에서 변경할 수 있게 한다.
// 나쁜 예시
if (age > 18) {
    // 성인 처리 로직
}

// 좋은 예시
private static final int ADULT_AGE = 18;

if (age > ADULT_AGE) {
    // 성인 처리 로직
}

 

 

 

 

 

 

 

 

5. 오류 처리(예외 처리)를 명확하게

  • 오류를 무시하지 않기
    예외를 무시하거나 간단히 로그만 찍고 넘어가지 말고 상황에 맞는 처리를 해야 한다.
    필요하다면 예외 메시지도 구체적으로 작성해야 한다.
  • 적절한 예외를 던지기
    적절한 상황에 맞는 예외를 던지고 처리할 수 있도록 해야 한다.
// 나쁜 예시
try {
    // 작업 수행
} catch (Exception e) {
    e.printStackTrace(); // 예외 처리 불충분
}

// 좋은 예시
try {
    // 작업 수행
} catch (SQLException e) {
    throw new DatabaseException("Failed to save data", e);
}

 

 

 

 

 

 

 

 

 

6. 의존성 최소화

  • 의존성 주입
    클래스나 함수가 너무 많은 외부 요소에 의존하지 않도록 해야 한다.
    특히 상호 의존성(순환 참조)이 발생하지 않도록 주의해야 한다.
  • 클래스 간 결합도 줄이기
    가능하면 클래스 간의 결합도를 낮추어 한 부분의 변경이 다른 부분에 영향을 주지 않도록 해야 한다.
// 나쁜 예시
public class UserService {
    private UserRepository userRepository = new UserRepository(); // 직접 생성
}

// 좋은 예시
public class UserService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository; // 의존성 주입
    }
}

A 객체가 B 객체에 의존할 때 A가 B를 직접 생성하는 것이 아니라 외부에서 A에게 B를 제공해주는 것을 의존성 주입이라고 한다.

 

 

 

 

 

 

 

7. 테스트 코드 작성 (TDD)

  • 테스트 코드 작성
    테스트 코드를 먼저 작성하고 그에 맞춰 기능을 구현하는 방법이 좋다.
    TDD(Test Driven Development) 방식으로 작성하면 자연스럽게 클린 코드 원칙을 따르게 된다.
  • 단위 테스트(Unit Test)
    각 함수와 클래스가 예상대로 동작하는지 확인하는 단위 테스트를 작성해야 한다.
    이는 버그를 사전에 방지하는 좋은 방법이다.
  • Red : 실패하는 테스트 작성
    Green : 테스트를 통과할 수 있도록 최소한의 기능 구현
    Refactor : 중복 제거, 코드 개선 등 리팩토링

 

 

 

 

 

 

8. 코드 중복 중리기 (DRY 원칙)

  • 중복된 코드 제거
    같은 기능을 여러 군데서 반복하지 않고 재사용이 가능한 함수를 만들어 코드 중복을 줄이는 게 좋다.
    DRY(Don't Repeat Yourself) 원칙을 따르는 것이 중요하다.
// 나쁜 예시
public void createUser() {
    // 사용자 생성 로직
}

public void updateUser() {
    // 사용자 수정 로직 (유사한 로직 반복)
}

// 좋은 예시
public void saveUser(User user) {
    // 사용자 저장 로직
}

 

 

 

 

 

 

 

 

9. 객체 지향 원칙 준수 (SOLID 원칙)

  • 단일 책임 원칙 : 클래스는 하나의 책임만 가져야 한다.
  • 개방-폐쇄 원칙 : 코드는 확장에는 열려 있고 수정에는 닫혀 있어야 한다.
  • 리스코프 치환 원칙 : 하위 클래스는 상위 클래스를 대체할 수 있어야 한다.
  • 인터페이스 분리 원칙 : 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다.
  • 의존 역전 원칙 : 고수준 모듈은 저수준 모듈에 의존하지 말고 추상화에 의존해야 한다.

 

 

 

 

 

 

 

 

10. 코딩 스타일 일관성 유지

  • 코딩 컨벤션 준수
    코드 스타일을 일관되게 유지하는 것이 중요하다. 팀 내에서 합의된 컨벤션을 따르거나 기존의 널리 사용되는 컨벤션을 사용하는 것이 좋다.
  • 들여쓰기와 공백
    들여쓰기를 일관되게 하고 코드를 읽기 쉽게 구성하자.
    한 줄에 너무 많은 코드를 넣지 말고 가독성을 위해 적절히 줄바꿈을 해야 한다.