코드 크기 메트릭(Lines of Code, LOC)

이 메트릭은 프로그램의 크기를 코드 라인 수로 표현하며, 소프트웨어 개발 프로젝트의 규모 추정, 생산성 측정, 품질 관리 등에 활용된다.
코드 크기는 다양한 방식으로 측정될 수 있으며, 각각의 측정 방식은 서로 다른 목적과 의미를 가진다.

특징과 기능

  1. 프로젝트 규모 추정: LOC는 소프트웨어 프로젝트의 크기를 추정하는 데 사용된다.
  2. 생산성 측정: 개발자나 팀의 생산성을 LOC를 기준으로 평가할 수 있다.
  3. 비용 산정: LOC를 기반으로 프로젝트 비용과 개발 노력을 추정할 수 있다.
  4. 복잡성 지표: 코드의 양이 많을수록 일반적으로 복잡성이 높아진다.

유형

  1. 물리적 코드 라인(Physical Lines of Code, LOC):
    이는 가장 단순한 형태의 측정 방식으로, 파일의 전체 라인 수를 세는 것이다.
    다음은 물리적 코드 라인의 예시입니다:

    1
    2
    3
    4
    5
    6
    7
    8
    
    public class Calculator {        // 라인 1
                                    // 라인 2 (빈 줄)
        private int result;         // 라인 3
                                    // 라인 4 (빈 줄)
        public int add(int a, int b) { // 라인 5
            return a + b;           // 라인 6
        }                          // 라인 7
    }                              // 라인 8
    

    이 예시에서 물리적 코드 라인은 8줄이다.
    하지만 이 방식은 빈 줄과 주석도 포함하기 때문에, 실제 코드의 양을 정확히 반영하지 못할 수 있다.

  2. 논리적 코드 라인(Logical Lines of Code, LLOC):
    실제 실행 가능한 구문의 수를 세는 방식이다.
    다음 예시를 보자:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    public int calculate(int x, int y) {   // 논리적 라인 1
        int result = 0;                    // 논리적 라인 2
        if (x > 0) {                       // 논리적 라인 3
            result = x + y;                // 논리적 라인 4
        } else {
            result = x - y;                // 논리적 라인 5
        }
        return result;                     // 논리적 라인 6
    }
    

    이 코드의 논리적 라인 수는 6개이다. 중괄호나 빈 줄은 논리적 라인으로 계산되지 않는다.

  3. 주석 라인(Comment Lines):
    코드의 문서화 수준을 이해하는 데 중요한 메트릭이다.
    다음은 주석의 예시이다:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    /**
     * 사용자 정보를 처리하는 클래스
     */                                    // 주석 라인 1-3
    public class UserProcessor {
        // 사용자 ID를 저장                  // 주석 라인 4
        private String userId;
    
        /* 사용자 정보를 검증하는 메서드
           입력값이 null이면 false 반환 */    // 주석 라인 5-6
        public boolean validate() {
            // TODO: 추가 검증 로직 구현      // 주석 라인 7
            return userId != null;
        }
    }
    

측정 방법

  1. 전체 프로그램을 모듈별로 분할한다.
  2. 모듈별로 규모를 추정하고 총 규모를 계산한다.
  3. LOC 예측치 계산: EV = (opt + 4m + pess) / 6
    • opt: 낙관적 LOC 추정치
    • m: 보통 LOC 추정치
    • pess: 비관적 LOC 추정치

코드 크기를 측정하는 도구들

  1. CLOC (Count Lines of Code):

    1
    2
    
    # CLOC를 사용한 코드 라인 수 측정
    cloc src/
    
  2. SonarQube:
    코드 크기뿐만 아니라 다양한 품질 메트릭을 함께 측정할 수 있다.

  3. JavaNCSS:
    Java 코드의 크기를 측정하는 전용 도구.

코드 크기 관리를 위한 권장사항

  1. 메소드 크기 제한:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    // 너무 큰 메소드의 예
    public void processOrder(Order order) {
        // 100줄 이상의 복잡한 로직
    }
    
    // 개선된 버전
    public void processOrder(Order order) {
        validateOrder(order);
        calculatePrice(order);
        applyDiscounts(order);
        updateInventory(order);
        sendConfirmation(order);
    }
    
  2. 클래스 크기 제한:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    // 너무 큰 클래스의 예
    class OrderManager {
        // 수백 줄의 다양한 책임을 가진 코드
    }
    
    // 개선된 버전
    class OrderValidator { }
    class OrderProcessor { }
    class InventoryManager { }
    class NotificationService { }
    

주의사항

  1. 단순히 라인 수를 줄이는 것이 목표가 되어서는 안 된다. 때로는 더 긴 코드가 더 명확할 수 있다.
  2. 코드 크기는 다른 품질 메트릭과 함께 고려되어야 한다.
  3. 언어나 도메인의 특성에 따라 적절한 코드 크기는 달라질 수 있다.

권장되는 크기 제한

  • 메소드: 20-30줄 이내
  • 클래스: 200-300줄 이내
  • 파일: 500-1000줄 이내

하지만 이러한 제한은 절대적인 것이 아니라 가이드라인으로 사용되어야 한다.
실제로는 코드의 응집도와 책임의 명확성이 더 중요한 기준이 된다.

코드 크기를 효과적으로 관리하기 위한 전략

  1. 단일 책임 원칙을 준수하여 클래스와 메소드의 책임을 명확히 한다.
  2. 코드 리뷰 시 크기 메트릭을 체크한다.
  3. 정기적인 리팩토링을 통해 코드를 정리한다.
  4. 자동화된 도구를 통해 코드 크기를 모니터링한다.

참고 및 출처