1. 알고리즘
1. 알고리즘의(Algorithm) 개념
- 넓은 의미에서 자료구조와 함께 프로그램을 구성하는 요소를 의미
- 좁은 의미에서는 어떤 문제에 대한 답을 찾는 해법을 의미한다.
2. 알고리즘의 특성
- 알고리즘의 표현은 자연어, 순서도, 의사 코드, 프로그래밍 언어를 이용하는 방법이 있으며, 따라서 프로그래밍 언어가 아니더라도 알고리즘의 표현은 가능
cf : 의사코드(슈도 코드, Pseudo-Code) : 프로그램을 작성할 때 각 모듈이 작동하는 논리를 표현하기 위한 언어로 일반적인 언어로 코드를 흉내 내어 알고리즘을 써놓은 코드이다.
1. 입력 : 외부로부터 입력되는 자료가 0개 이상
2. 출력 : 출력되는 결과가 1개 이상
3. 명확성 : 각 명령어의 의미가 명확
4. 유한성 : 정해진 단계를 지나면 종료
5. 유효성 : 모든 명령은 실행이 가능한 연산들이어야 함
3. 알고리즘 기법
1. 분할과 기법(Divide and Conquer)
- 문제를 나눌 수 없을 때까지 나누고, 각각을 풀면서 다시 병합하여 문제의 답을 얻는 알고리즘
2. 동적계획법(Dynamic Programming)
- 어떤 문제를 풀기위해 그 문제를 더 작은 문제의 연장선으로 생각하고, 과거에 구한 해를 활용하는 방식의 알고리즘
3. 탐욕법(Greedy)
- 결정을 해야할 때마다 그 순간에 가장 좋다고 생각되느느 것을 해답으로 선택함으로써 최종적인 해답에 도달하는 방식의 알고리즘
4. 백트래킹(Backtracking)
- 어떤 노드의 유망성 점검 후, 유망하지 않으면 그 노드의 부모 노드로 되돌아간 후 다른 자손노드를 검색하는 알고리즘
4. 시간 복잡도에 따른 알고리즘 분류
1. O(1)
- 상수형 복잡도, 자료 크기 무관하게 항상 같은 속도로 작동
- 해시 함수(Hash Function)
2. O(logn)
- 로그형 복잡도, 문제를 해결하기 위한 단계의 수가 log2n번만큼 수행 시간을 가짐
- 이진 탐색(Binary Search)
3. O(n)
- 선형 복잡도, 입력자료를 차례로 하나씩 모두 처리, 수행 시간이 자료 크기와 직접적 관계로 변함 정비례
- 순차 탐색(Sequential Search)
4. O(nlogn)
- 선형 로그형 복잡도, 문제를 해결하기 위한 단계의 수가 nlog2n번 만큼의 수행 시간을 가짐
- 퀵 정렬, 병합 정렬
- 퀵 정렬(Quick sort) : 기준이 되는 피벗을 정해서 그것보다 큰 원소와 작은 원소들로 분할하여 분할된 각 배열을 같은 방법으로 다시 정렬해 나가는 알고리즘 이다.
- 병합 정렬(Merge Sort) : 전체 원소를 하나의 단위로 분할한 후 분할한 원소를 다시 병합해서 정렬하는 알고리즘 이다.
5. O(n2)
- 제곱형 주요 처리루프 구조가 2중인 경우
- n크기 작을 때에는 n2이 nlogn보다 느릴 수 있음
- 거품 정렬, 삽입 정렬, 선택 정렬
- 거품 정렬(Bubble Sort) : 서로 이웃한 데이터들을 비교하며 가장 큰 데이터를 가장 뒤로 보내며 방식으로 반복 수행하여 데이터를 정렬하는 알고리즘이다.
- 삽입 정렬(Insertion Sort) : 자료 배열의 모든 요소를 앞에서 부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘이다.
2. 소스 코드 품질 분석
1. 소스 코드 품질 분석 개념
- 소스 코드에 대한 코딩 스타일, 설정된 코딩 표준, 코드의 복잡도, 코드 내에 존재하는 메모리 누수 현황, 스레드의 결함 등을 발견하기 위한 활동으로 정적 분석 도구와 동적 분석 도구가 있다.
2. 소스 코드 품질 분석 도구
1. 정적 분석 도구
- 작성된 소스 코드를 실행시키지 않고, 코드 자체만으로 코딩 표준 준수 여부
, 코딩 스타일 적정 여부, 잔존 결함 발견 여부를 확인하는 코드 분석 도구
2. 동적 분석 도구
- 애플리케이션을 실행하여 코드에 존재하는 메모리 누수 현환을 발견하고, 발생한 스레드의 결함 등을 분석하기 위한 도구
3. 소스 코드 품질 분석 도구
1. 정적 분석 도구
- pmd : 자바 및 타 언어 소스 코드에 대한 버그, 데드 코드 분석
- cppcheck : C/C++ 코드에 대한 메모리 누수, 오버플로우 등 문제 분석
- SonarQube : 소스 코드 품질 통합 플랫폼, 플러그인 확장 가능
- checkstyle : 자바 코드에 대한 코딩 표준 검사 도구
2. 코드 복잡도
- ccm : 다양한 언어의 코드 복잡도 분석 도구, 리눅스, 맥 환경 CLI형태 지원
- cobertura : jcoverage 기반의 테스트 커버리지 측정 도구
3. 동적 분석 도구
- Avalanche : Valgrind 프레임워크 및 STP 기반 소프트웨어 에러 및 취약점 동적 분석 도구
- Valgrind : 자동화 된 메모리 및 스레드 결함 발견 분석 도구
3. 코드 최적화
1. 코드 최적화(Code Optimization)의 개념
- 소스 코드 최적화는 읽기 쉽고 변경 및 추가가 쉬운 클린 코드를 작성하는 것으로, 소스 코드 품질을 위해 기본적으로 지킬 원칙과 기준을 정의하고 있다.
2. 클린 코드
1. 클린 코드 (Clean Code) 개념
- 잘 작성되어 가독성이 높고, 단순하며, 의존성을 줄이고, 중복을 최소화하여 깔금하게 잘 정리된 코드를 말한다
2. 클린 코드 특징
- 중복 코드 제거로 애플리케이션의 설계가 개선된다.
- 가독성이 높으므로 애플리케이션의 기능에 대해 쉽게 이해할 수 있다.
- 버그를 찾기 쉬워지며, 프로그래밍 속도가 빨라진다.
3. 클린 코드를 저해하는 베드 코드(Bad Code)
- 다른 개발자가 로직(Logic)을 이해하기 어렵게 작성된 코드이다.
- 처리 로직의 제어가 정제되지 않고 서로 얽혀 있는 스파게티 코드, 변수나 메소드에 대한 이름 정의를 알 수 없는 코드, 동일한 처리 로직이 중복되게 작성된 코드 등이 있다.
[베드 코드 유형]
1. 오염 : 비즈니스 기능을 수행하지 못하는 많은 컴포넌트들이 존재
2. 문서부족 : 현재 코드와 문서가 일치하지 않고 수정과 변경을 위한 도메인 자식은 크게 증가하지만 개발자의 지식부족
3. 의미 없는 이름 : 함수, 클래스, 컴포넌트 이름들이 명확한 의미를 갖지 못하거나 실제 작동과 불일치
4. 높은 결합도 : 클래스와 컴포넌트 간에 데이터와 컨트롤 흐름이 네트워크로 복잡하게 연결
5. 아키텍처 침식 : 아키텍처가 더 이상 구별도지 않고, 여러 솔루션으로 이루어져 아키텍처 상변형들로 인해 시스템 품질이 떨어짐
4. 클린 코드 유형
1. 의미 있는 이름 : 변수나 클래스, 메소드 명을 의도가 분명한 이름(사용 용도, 작업 명)으로 사용
2. 간결하고 명확한 주석
- 주석이 필요한 경우 최대한 간결하고 명확하게 작성
- 코드 안에 변경 이력이나 저자 등의 기록은 형상 관리 도구를 사용
- 코드를 처음 접하는 사람이 궁금한 점에 대해 주석 작성
3. 보기 좋은 배치
- 읽는 사람이 편하게 읽을 수 있도록 구성
- 반복되는 구분은 새로운 함수로 정리하고 배열을 정리하여 읽기 쉽게 리팩토링
4. 작은 함수
- 함수는 가급적으로 작게 만들고 If문이나 While 문 안의 내용은 한줄로 처리되도록 작성
- 함수 하나당 하는 일은 하나만 하도록 선언하고 중복이 없도록 작성
5. 읽기 쉬운 제어 흐름
- 조건, 루프, 흐름을 통제하는 선언문이 코드에 있으면 코드가 읽기 어려움
- if/Else 조건문에서 인수의 순서는 긍정적이고 간단한 내용을 앞쪽에 배치
6. 오류 처리
- 오류 코드의 반환보다 예외 처리를 활용
- 메소드는 널(null)을 전달하거나 반환하지 말고 널(null) 체크 코드 작성