공든탑앱 열기

코드 품질과 성능 개선

정보처리기사 · 애플리케이션 테스트 · 약 12분

쉽게 말하면

코드는 동작만 하면 끝이 아니라 다른 사람이 읽고 고치기 쉬워야 해요. 그래서 코드가 얼마나 복잡한지 숫자로 재는 방법이 있어요. 대표가 맥케이브의 순환 복잡도로, 분기가 많을수록 커져요. 읽기 좋은 코드를 클린 코드라 하고, 기능은 그대로 두고 구조만 다듬는 것을 리팩토링이라 해요. 아무도 내용을 모르는 오래된 코드는 외계인 코드라고 불러요.

시험용 정의

순환 복잡도(맥케이브)는 프로그램 논리의 복잡도를 재는 척도로 V(G) = E − N + 2(간선 수 − 노드 수 + 2) 또는 영역 수(닫힌 영역 + 1), 조건 분기 수 + 1로 구한다. 값이 클수록 테스트할 경로가 많고 이해하기 어렵다. 클린 코드는 읽기 쉽고 중복이 없는 코드로 원칙은 가독성, 단순성, 의존성 배제, 중복성 최소화, 추상화다. 리팩토링은 외부 동작은 바꾸지 않고 내부 구조를 개선하는 것이다. 이해하기 어려운 코드에는 스파게티 코드(얽힌 흐름), 외계인 코드(아주 오래되어 유지보수가 어려운 코드)가 있다. 품질 분석 도구는 실행하지 않는 정적 분석(pmd, cppcheck, SonarQube, checkstyle)과 실행하며 보는 동적 분석(Avalanche, Valgrind)이 있다.

비유로 이해하기

도로망의 복잡도와 같다. 갈림길(분기)이 많을수록 모든 길을 다 가 보려면 시간이 오래 걸린다. 리팩토링은 목적지는 그대로 두고 얽힌 골목을 곧게 정리하는 공사다.

자세히

먼저 알아 둘 말

말뜻
제어 흐름 그래프프로그램 흐름을 노드(처리)와 간선(흐름)으로 그린 그래프
독립 경로다른 경로에 없는 새 간선을 하나 이상 지나는 경로
코드 스멜당장 오류는 아니지만 문제를 일으킬 수 있는 나쁜 코드 징후 (긴 메서드, 중복 코드)
정적 분석코드를 실행하지 않고 규칙 위반·결함 가능성을 찾는 것
동적 분석프로그램을 실행하며 메모리 누수 등을 찾는 것

순환 복잡도 구하는 세 가지 방법

방법식
간선과 노드V(G) = E − N + 2
영역그래프가 나누는 영역 수 (바깥 영역 포함)
판단 노드조건 분기(if, while 등) 수 + 1

클린 코드 원칙

원칙내용
가독성누구나 읽기 쉽게. 이해하기 쉬운 이름, 들여쓰기
단순성한 함수는 한 가지 일만, 작게
의존성 배제다른 모듈에 미치는 영향 최소화
중복성 최소화같은 코드는 하나로
추상화상위에는 간략히, 자세한 내용은 하위로

성능 개선 포인트

  • 알고리즘의 시간 복잡도를 낮춘다 (O(n²) → O(n log n))
  • 불필요한 반복 연산, 데이터베이스 왕복 호출, 파일 입출력을 줄인다
  • 측정 지표: 처리량, 응답 시간, 경과 시간, 자원 사용률

기출에서 더 나온 것

말뜻
정적 분석코드를 실행하지 않고 분석한다. 소프트웨어 도구로 한다
추상화 원칙상위 클래스·함수는 간략한 특성만, 자세한 내용은 하위에서 구현한다
구현 단계 작업 순서코딩 계획 → 코딩 → 컴파일 → 테스트
코드 간결성 지침공백으로 구분하고 괄호·들여쓰기로 분명하게 쓴다. 한 줄에 여러 문장을 몰아 쓰지 않는다

시험에 이렇게 나와요

확인 문제

Q1. 제어 흐름 그래프에서 간선(E)이 9개, 노드(N)가 7개일 때 순환 복잡도는?

  1. 2
  2. 3
  3. 4
  4. 16
정답 보기

3번 4

V(G) = E − N + 2 = 9 − 7 + 2 = 4. 독립적인 실행 경로가 4개라는 뜻이고, 기초 경로 테스트 케이스 수의 기준이 된다.

Q2. 순환 복잡도에 대한 설명으로 옳은 것은?

  1. 코드의 줄 수를 센 값이다
  2. V(G) = E − N + 2로 구할 수 있다
  3. 값이 작을수록 테스트할 경로가 많다
  4. 블랙박스 테스트에서 주로 쓴다
정답 보기

2번 V(G) = E − N + 2로 구할 수 있다

간선 − 노드 + 2. 클수록 복잡하다.

Q3. 아주 오래되었거나 개발자가 없어 유지보수가 매우 어려운 프로그램 코드는?

  1. 의사 코드
  2. 외계인 코드
  3. 클린 코드
  4. 목적 코드
정답 보기

2번 외계인 코드

외계인 코드다. 아무도 이해하지 못해 고치기 어렵다. 클린 코드는 읽기 쉬운 코드, 의사 코드는 알고리즘을 말로 적은 것이다.

Q4. 다음 중 정적 분석 도구가 아닌 것은?

  1. pmd
  2. cppcheck
  3. checkstyle
  4. Valgrind
정답 보기

4번 Valgrind

Valgrind는 실행하며 메모리 문제를 찾는 동적 분석 도구.

Q5. if 문 3개만 있는 함수(중첩 없이 순서대로)의 순환 복잡도는?

  1. 3
  2. 4
  3. 6
  4. 8
정답 보기

2번 4

조건 분기 수 + 1 = 3 + 1 = 4.

헷갈리기 쉬운 O·X

리팩토링은 새로운 기능을 추가해 프로그램의 외부 동작을 바꾸는 작업이다.

정답 보기

X 외부 동작은 그대로, 내부 구조만 개선.

클린 코드 원칙에는 중복성 최소화가 포함된다.

정답 보기

O

순환 복잡도가 높을수록 코드를 이해하고 테스트하기 쉽다.

정답 보기

X 복잡할수록 어렵다.

함께 보면 좋은 개념