클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

[소프트웨어 개발] 4장 애플리케이션 테스트 관리 3 - 애플리케이션 성능 개선 : 알고리즘 및 소스코드 성능 분석 본문

자격증 공부/정보처리기사 필기

[소프트웨어 개발] 4장 애플리케이션 테스트 관리 3 - 애플리케이션 성능 개선 : 알고리즘 및 소스코드 성능 분석

huenuri 2024. 7. 31. 13:17
공부하다 보니 시간이 정말 빨리 가는 것 같다. 점심식사 전까지 두 단원을 마치려고 했으나 한 단원을 마치는 것도 빠듯할 듯 싶다. 강의도 듣고 내용도 한번씩 읽어보고, 학습일지도 쓰며 문제도 풀고, 풀이 영상까지 들어야 하니 할일이 정말 많다.

이번에 학습할 부분은 애플리케이션 성능 개선에 대한 것이다. 알고리즘도 나오고 시간복잡도와 함수에 이어 여러 종류의 알고리즘 등 어려운 내용들이 쏙쏙 등장하고 있다.

 

학습 내용

알고리즘

소스 코드 품질 분석

코드 최적화

 

학습 시간

오후 12시 ~ 2시 15분 <2시간 15분 소요>



 

 

1. 알고리즘

개념

어떠한 문제를 해결하기 위한 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 기법

 

특성

  • 자연어, 순서도, 의사 코드, 프로그래밍 언어를 이용하는 방법이 있음
  • 프로그래밍 언어가 아니더라도 알고리즘 표현은 가능

의사 코드(슈도 코드; Pseudo-Code)
프로그램을 작성할 때 각 모듈이 작동하는 논리를 표현하기 위한 언어로 일반적인 언어로 코드를 흉내 내어 알고리즘을 써놓은 코드

 
 

기법


 

 

시간복잡도에 따른 알고리즘 분류


 

 

알고리즘 설명

1. 해싱 함수

개념

데이터를 키로 변환하는 함수. 예를 들어 길고 복잡한 문자열을 짧고 단순한 문자열(또는 수열)로 변경하는 함수

종류

임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수

  • 해싱 함수를 선택할 때 계산 과정의 단순화, 충돌의 최소화, 기억장소 낭비의 최소화, 오버플로우의 최소화를 고려해야 함
 
 
 

2. 검색 알고리즘

  • 배열의 처음부터 끝까지 차례대로 비교하여 원하는 데이터를 찾아내는 알고리즘
  • 검색할 리스트의 길이가 길면 비효율적이지만, 검색 방법 중 가장 단순하여 구현이 쉽고, 정렸되지 않은 리스트에서도 사용할 수 있다는 장점이 있음
 
 

  • 정렬되어 있는 리스트에서 검색 범위를 절반씩 좁혀가며 데이터를 탐색하는 알고리즘
  • 탐색 효율이 좋고 탐색 시간이 적게 소요
  • 가운데 레코드 번호를 찾기 위해 다음 식을 사용(소수점이 나올 경우 버림 처리)

 

 


 

 

3. 정렬 알고리즘

1) 퀵 정렬(Quick Sort)

  • 피벗을 두고 피벗의 왼쪽에는 피벗보다 작은 값을, 오른쪽에는 큰 값을 두는 과정을 반복하는 알고리즘
  • 레코드의 많은 자료 이동을 없애고 하나의 파일을 부분적으로 나누어 가면서 정렬
  • 퀵 정렬 수행 시간은 다음과 같다.
 
 

2) 합병 정렬(Merge Sort)

  • 전체 원소를 하나의 단위로 분할한 후 분할한 원소를 다시 합병해서 정렬하는 알고리즘
  • 합병정렬의 수행 시간은 다음과 같다.
 
 
 

3) 힙 정렬(Heap Sort)

  • 정렬할 입력 레코드들로 힙을 구성하고 가장 큰 키 값을 갖는 루트 노드를 제거하는 과정을 반복하여 정렬하는 알고리즘
  • 완전이진 트리(Complete Binarty Tree)로 입력 자료의 레코드를 구성
  • 힙 정렬의 수행 시간은 다음과 같다.
 
 
 

4) 거품 정렬(Bubble Sort)

  • 인접한 2개의 레코드 키값을 비교하여 그 크기에 따라 레코드 위치를 서로 교환하는 알고리즘
  • 두 인접한 원소를 교환하는 과정이 거품 모양과 같다고 하여 거품 정렬이라고 이름이 지어졌음
  • 한 PASS를 수행할 때마다 가장 큰 값이 맨 뒤로 이동하기 때문에, PASS를 '요소의 개수-1'번 수행하게 되면 모든 숫자가 정렬됨

 

 

5) 삽입 정렬(Insert Sort)

  • 2번째 키와 첫번째 키를 비교하여 순서대로 나열함
  • 이어서 3번째 키를 1, 2번째 키와 비교해 순서대로 나열하고, 계속해서 n번째 키를 앞의 (n-1)개 키와 비교하여 알맞은 순서에 삽입하는 알고리즘
  • 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘
 
 
 

6) 선택 정렬(selection Sort)

  • 정렬되지 않은 데이터들에 대해 가장 작은 데이터를 찾아 정렬되지 않은 부분의 가장 앞의 데이터와 교환해나가는 알고리즘


 

2. 소스 코드 품질 분석

 

개념

소스 코드에 대한 코딩 스타일, 설정된 코딩 표준, 코드의 복잡도, 코드 내에 존재하는 메모리 누수 현황, 스레드의 결함 등을 발견하기 위한 활동

도구 유형


 

분석 도구


 

복잡도 분석

1. 맥케이브 회전 복잡도(McCabe Cycolmatic Complexity) 개념

소프트웨어 제어 흐름을 그래프로 표현하고 소스코드의 복잡도를 정량적으로 나타내는 지표

2. 맥케이브 회전 복잡도 특징

 
 

3. 맥케이브 회전 복잡도 측정 방식

제어 흐름에 의한 그래프를 통하여 원시 코드의 회전수를 구하여 복잡도를 계산



 

3. 코드 최적화

 

개념

  • 읽기 쉽고 변경 및 추가가 쉬운 클린 코드를 작성하는 것
  • 소스 코드 품질을 위해 기보적으로 지킬 원칙과 기준을 정의

 

클린 코드

1. 개념

잘 작성되어 가독성이 높고, 단순하며, 의존성을 줄이고, 중복을 최소화하여 깔끔하게 잘 정리된 코드

2. 특징

  • 중복 코드 제거로 애플리케이션의 설계가 개선
  • 가독성이 높으므로 애플리케이션의 기능에 대해 쉽게 이해
  • 버그를 찾기 쉬어지며, 프로그래밍 속도가 빨라짐

3. 클린 코드를 저해하는 배드 코드

  • 다른 개발자가 로직을 이해하기 어렵게 작성된 코드
 
 

4. 작성 원칙

클린 코드의 작성 원칙을 준수하고, 나쁜 코드 형식으로 작성된 소스 코드는 클린 코드로 수정하여 성능을 개선해야 한다.

 
 

5. 클린 코드의 유형




학습을 마치고

지난번에 공부했던 자료 구조처럼 이 단원도 일일이 어디에 자료가 들어갔는지 손으로 직접 써보면서 공부해야 했다. 처음에는 정말 어려웠는데 몇 개의 문제를 풀어보니 정렬을 하는 것도 할만 했다.
문제를 푸는데 시간이 많이 걸렸지만 충분히 이해할 수 있어서 의미있는 학습이었다.

이제 점심을 먹고 마지막 5장 학습을 진행해보려고 한다. 이것만 하면 2과목 과정은 모두 마치게 된다~