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 |
'Study > 정보처리기사' 카테고리의 다른 글
| 정보처리기사 실기 7장. 애플리케이션 테스트 관리_3 (1) | 2023.09.26 |
|---|---|
| 정보처리기사 실기 7장. 애플리케이션 테스트 관리_2 (0) | 2023.09.26 |
| 정보처리기사 실기 7장. 애플리케이션 테스트 관리_1 (0) | 2023.09.26 |
| 정보처리기사 실기 4장. 서버 프로그램 구현_5 (2) | 2023.09.25 |
| 정보처리기사 실기 4장. 서버 프로그램 구현_4 (1) | 2023.09.25 |