정적코드분석/코딩표준

Cyclomatic Complexity (복잡성 지표)

복잡한 그림

소프트웨어의 한 Unit(Method 혹은 Function) 내의 코드가 얼마나 복잡한지를 정량적으로 표현한 Cyclomatic Complexity 는 1976년 McCabe가 고안한 소프트웨어 지표입니다. 거의 모든 정석 분석 도구에서 이 수치를 지원하며, 각종 테스팅 서적 및 자격증에서도 기본적으로 출제하는 문제이기 때문에 알아두면 좋습니다.

복잡도 v(G) = edges – nodes + 2

라는 공식으로 구하는데 보통

복잡도 v(G) = 분기문 + 1

이라는 공식으로 쉽게 계산할 수 있습니다.

아래 그림을 보죠. (출처 : Wikipedia)

위의 그림에서는 edge가 총 9개, Node가 8개 이기 때문에 공식을 대입해보면 Cyclomatic Complexity는 9 – 8 + 2 = 3이 나옵니다. 또한 분기문을 사용하는 공식으로 풀어보면, 위의 그래프에서는 분기문은 2개(왼쪽라인 2,4번째)이기 때문에 Cyclomatic Complexity는 2+1 = 3 이 됩니다.

이 수치를 고안한 MaCabe는 10 이하로 유지하라고 권고했지만, 발표한 시기는 지금보다 30년이나 오래된 1976년이고 그 동안 프로그래밍 환경이 많이 변했습니다. 요즘에는 많은 코딩 표준이나 정적분석도구에서 10이하로 유지하라고 하지는 않습니다. C++ 코딩 표준 중 한 가지인 JSF Air Vehicle C++ Coding Standard의 경우도 Cyclomatic Complexity를 10이 아닌 20 이하로 유지하라고 명시해놓았습니다.

복잡한 그림
복잡함

Cyclomatic Complexity 의 중요성

Cyclomatic Complexity 수치가 높아진다는 것은, 코드가 복잡하다는 뜻이고 에러가 발생할 확률이 높다는 것을 의미합니다. 아래 표는 기존의 에러를 고치려다가 의도치 않게 또 다른 오류가 발생할 확률을 나타내는 자료입니다.

Cyclomatic Complexity 또 다른오류가생길확률
1~10 5%
20~30 20%
50 이상 40%
거의 100 60%

표에서 보듯이, Cyclomatic Complexity 수치가 높으면 유지보수성에 아주 안 좋은 영향을 끼칩니다.

Cyclomatic Complexity 파생 메트릭

Cyclomatic Complexity 측정값은 한 가지만 있는 것이 아닙니다. 측정 방식에 따라 여러 파생 메트릭이 있습니다. 몇 가지 정적분석 도구에는 기본적인 Cyclomatic Complexity 외에 Modified Cyclomatic Complexity, Strict Cyclomatic Complexity 수치를 지원합니다.

Modified Cyclomatic Complexity

이 수치는 switch~case문을 case수에 관계없이 1로 칩니다. switch~case는 if~else 중첩보다 좀 더 이해하기 쉽고 컨트롤하기 쉽기 때문입니다. 보통 일반 Cyclomatic Complexity 보다 수치가 낮게 나옵니다.

Strict Cyclomatic Complexity(혹은 Extended Cyclomatic Complexity)

이 수치는 if 조건 안에 and(&, &&), or( |, ||)로 묶인 조건문을 별개의 조건문으로 취급합니다. 보통 일반 Cyclomatic Complexity보다 수치가 높게 나옵니다.

Cyclomatic Complexity 장점과 단점

이 수치는 장점과 단점을 모두 가지고 있습니다.

장점 1. 소프트웨어에서 몇 안되는 정량적인 수치입니다. 딱 정수로 된 숫자값 하나기 때문에 이해하기 쉽습니다.
장점 2. 정량적이기 때문에 여러 설계를 수치적으로 직접 비교할 수 있습니다.
장점 3. 개발자가 설계 단계에서 사용하기 쉽습니다.
장점 4. 어떤 인증을 받는 경우 외에도 사용할 일이 많습니다.

단점 1. switch~case문에서는 수치가 너무 높게 나옵니다. 이 경우 Modified 메트릭을 사용하면 됩니다.
단점 2. 코드 복잡도를 알 수는 있지만, 데이터 복잡도를 알기 힘듭니다.
단점 3. 이 수치는 에러 발생 경향과 상관관계가 있지만, 25이하에서는 강한 상관관계를 보이지 않습니다.

코드로 보는 Cyclomatic Complexity

코드로 한 번 알아 보겠습니다. 아래의 소스코드는 Cyclomatic Complexity가 4 입니다. if~else 문이 2개이고 여기에 +2를 하면 수치는 4가 됩니다다. 혹은 분기문이 3개니 +1 을 하면 4가 됩니다.

public void testMethod(){
    int a = 1;
    boolean flag = false;
    if(a == 1){
        ;
    }else if(flag == true){
        ;
    }
    if(a != 1){
        ;
    }
}

아래 코드는 if 조건문안에 boolean 조건 연산이 3개가 있습니다. 일반적인 Cyclomatic Complexity수치는 2지만, Strict Cyclomatic 수치는 4입니다.

public void testMethod2(){
    int a = 1;
    boolean flag = false;
    int b = 2;
    if(a == 1 && flag == true || b == 2){
        ; //Do something
    }
    else{
        ; //Do something
    }
    a = 2;
}

참고문헌 : http://www.aivosto.com/project/help/pm-complexity.html

2 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *