본문 바로가기

Study/정보처리기사

정보처리기사 실기 7장. 애플리케이션 테스트 관리_4

7-10. 복잡도

• 복잡도 (Complexity)

   시스템/시스템 구성 요소/소프트웨어의 복잡한 정도

 

• 시간 복잡도

   알고리즘을 수행하기 위해 프로세스가 수행하는 연산 횟수를 수치화한 것

 

  - 점근 표기법의 종류

 

빅오 표기법
(Big-O Notation)
알고리즘의 실행 시간이 최악일 때를 표기
입력 값에 대해 알고리즘을 수행했을 때 명령어의 실행 횟수는 어떠한 경우에도 표기 수치보다 많을 수 없음
세타 표기법
(Big-θ Notation)
알고리즘의 실행 시간이 평균일 때를 표기
입력 값에 대해 알고리즘을 수행했을 때 명령어 실행 횟수의 평균적인 수치를 표기
오메가 표기법
(Big-Ω Notation)
알고리즘의 실행 시간이 최상일 때를 표기
입력값에 대해 알고리즘을 수행했을 때 명령어의 실행 횟수는 어떠한 경우에도 표기 수치보다 적을 수 없음

 

 

• 빅오 표기법으로 표현한 최악의 알고리즘 시간 복잡도

   가장 보편적으로 사용하는 시간 복잡도

O(1) 입력값에 관계 없이 일정하게 문제 해결에 하나의 단계만을 거침
예) 스택의 삽입(Push), 삭제(Pop)
O(log2n) 문제 해결에 필요한 단계가 입력값 또는 조건에 의해 감소
예) 이진 트리(Binary Tree), 이진 검색(Binary Search) 
O(n) 문제 해결에 필요한 단계가 입력값과 1:1 관계를 가짐
예) for문
O(nlog2n) 문제 해결에 필요한 단계가 n(lon2n)번 만큼 수행
예) 힙 정렬(Heap Sort), 2-Way 합병 정렬 (Merge Sort)
O(n^2) 문제 해결에 필요한 단계가 입력값의 제곱만큼 수행
예) 삽입 정렬(Insert Sort), 쉘 정렬(Shell Sort), 선택 정렬(Selection Sort) ,
      버블 정렬(Bubble Sort), 퀵 정렬(Quick Sort)
O(2^n) 문제 해결에 필요한 단계가 2의 입력값 제곱만큼 수행
예) 피보나치 수열(Fibonacci Sequence)

 

 

• 순환 복잡도 (Cyclomatic Complexity)

   논리적인 복잡도를 측정하기 위한 소프트웨어의 척도

      ‣ = 맥케이브 순환도 (McCabe's Cyclomatic), 맥케이브 복잡도 메트릭 (McCabe's Complexity Metrics)

      ‣ 제어 흐름도 이론에 기반

      ‣ 제어 흐름의 순환 복잡도 V(G) = E - N + 2

         E : 화살표 수, N : 노드의 수

 

 


7-11. 애플리케이션 성능 개선

• 소스 코드 최적화

   나쁜 코드를 배제하고, 클린 코드로 작성하는 것

      ‣ 클린 코드 (Clean Code) : 누구나 쉽게 이해하고 수정 및 추가할 수 있는 단순 명료한 코드

      ‣ 나쁜 코드 (Bad Code) : 프로그램의 로직이 복잡하고 이해하기 어려운 코드

      ‣ 나쁜 코드로 작성된 코드를 클린 코드로 수정하면 애플리케이션의 성능이 개선됨

 

   - 대표적인 나쁜 코드 

 

스파게티 코드 코드의 로직이 서로 복잡하게 얽혀 있는 코드
외계인 코드 아주 오래되거나 참고문서 또는 개발자가 없어 유지 보수 작업이 어려운 코드

 

 

• 클린 코드 작성 원칙

 

가독성 누구든지 코드를 쉽게 읽을 수 있도록 작성
코드 작성 시 이해하기 쉬운 용어를 사용하거나 들여쓰기 기능 등을 사용
단순성 코드를 간단하게 작성
한 번에 한 가지를 처리하도록 코드를 작성하고 클래스/메소드/함수 등을 최소 단위로 분리
의존성 배제 코드가 다른 모듈에 미치는 영향을 최소화
코드 변경 시 다른 부분에 영향이 없도록 작성
중복성 최소화 코드의 중복을 최소화
중복된 코드는 삭제하고 공통된 코드를 사용
추상화 상위 클래스/메소드/함수에서는 간략하게 애플리케이션의 특성을 나타내고, 
상세 내용은 하위 클래스/메소드/함수에서 구현함

 

 

• 소스 코드 최적화 유형

 

클래스 분할 배치 하나의 클래스는 하나의 역할만 수행하도록 응집도를 높이고, 크기를 작게 작성
느슨한 결합 (Loosely Coupled) 인터페이스 클래스를 이용해 추상화된 자료 구조와 메소드를 구현해 클래스 간의 의존성을 최소화 함

 

 

• 소스 코드 품질 분석 도구

   소스 코드의 코딩 스타일, 코드에 설정된 코딩 표준, 코드의 복잡도, 코드에 존재하는 메모리 누수 현상, 스레드 결함 등 발견

 

정적 분석 도구 동적 분석 도구
작성한 소스 코드를 실행하지 않고
코딩 표준이나 코딩 스타일, 결함 등을 확인하는 코드 분석 도구
작성한 소스 코드를 실행하여
코드에 존재하는 메모리 누수, 스레드 결함 등을 분석하는 도구
pmd, cppcheck, SonarQube, checkstyle, ccm, cobertura  Avalanche, Valgrind

 

 

• 소스 코드 품질 분석 도구의 종류

 

  도구 설명 지원 환경
정적 분석 도구 pmd 소스 코드에 대한 미사용 변수, 최적화되지 않은 코드 등
결함을 유발할 수 있는 코드를 검사
Linux, Windows
cppcheck C/C++ 코드에 대한 메모리 누수, 오버플로우 등 분석 Windows
SonarQuve 중복 코드, 복잡도, 코딩 설계 등을 분석하는 소스 분석 통합 플랫폼 Cross-Platform
checkstyle 자바 코드에 대해 소스 코드 표준을 따르고 있는지 검사 Cross-Platform
다양한 개발 도구에 통합하여 사용 가능
ccm 다양한 언어의 코드 복잡도를 분석 Cross-Platform
cobertura 자바 언어의 소스 코드 복잡도 분석 및 테스트 커버리지를 측정 Cross-Platform
동적 분석 도구 Avalanche Valgrind 프레임 워크 및 STP 기반으로 구현됨 Linux, Android
프로그램에 대한 결함 및 취약점 등 분석
Valgrind 프로그램 내 존재하는 메모리 및 스레드 결함 등을 분석 Cross-Platform