정보처리기사 필기 2과목 - 소프트웨어 개발
🎁자료구조
- 자료구조는 컴퓨터 상 자료를 효율적으로 저장하기 위해 만들어진 논리적인 구조이다
자료구조 | 설명 |
선형구조 | 데이터를 연속으로 연결한 자료 구조 - 리스트 , 스택, 큐, 데크 |
비선형구조 | 데이터를 비연속적으로 연결한 자료 구조 - 트리, 그래프 |
선형구조
리스트
종류 | 설명 |
선형리스트 (Linear List) | -배열과 같이 연속되는 기억장소에 저장되는 리스트 -선형 리스트의 대표적인 구조로는 배열등이 있음 -가장 간편한 자료 구조 이며, 접근 구조가 빠름 -자료의 삽입, 삭제 시 기존 자료의 이동이 필요 |
연결리스트(Linked List) | -노드의 포인터 부분으로 서로 연결시킨 리스트 -연결하는 방식에 따라 단순 연결리스트, 원형 연결 리스트, 이중연결 리스트, 이중원형 연결 리스트로 구분 -노드의 삽입, 삭제가 선형 리스트와 달리 편리 -연결을 위한 포인터가 추가되어 저장공간이 추가로 필요 -포인터를 통해 찾는 시간이 추가되어 선형 리스트에 비해 느림 |
스택
- 스택은 한방향으로만 자료를 넣고 꺼낼 수 있는 LIFO(Last - In First - Out)형식의 자료구조이다
- 한방향으로만 POP 과 PUSH 를 할수 있다
- TOP 은 스택에서 가장 위에 있는 데이터로 스택 포인터(Stack Pointer)라고 불린다
연산 | 코드 | 설명 |
삽입 | if Top = n Then Overflow Else { Top = Top + 1 insert S(Top) } |
-스택에 데이터가 n개이면 삽입할 공간이 없으므로 오버플로 -스택에 데이터가 n개가 아니면 스택 포인터 Top 값을 1을 증가 - 스택 포인터 Top 이 가리키는 곳에 데이터 삽입 |
삭제 | If Top = 0 Then Underflow Else { remove S(Top) Top = Top - 1 } |
- 스택에 데이터가 0개이면 삭제할 데이터가 없으므로 언더플로 - 스택에 데이터가 0개가 아니면 스택 포인터 Top 이 가리키는 곳에 데이터 삭제 - 스택 포인터 Top 값을 1감소 |
스택의 응용분야
인터럽트 처리 , 함수 호출(재귀 호출) , 후위표현 연산, 깊이 우선 탐색(DFS)
큐
- 큐는 한쪽 끝에서는 삽입 작업이 이뤄지고, 반대쪽 끝에서는 삭제 작업이 이루어지는 FIFO(First - In First-Out)
- ENQUEUE : 데이터를 차례대로 넣는 연산
- DEQUEUE : 처음 저장된 데이터부터 하나씩 꺼내는 연산
데크
- 데크는 큐의 양쪽 끝에서 삽입과 삭제를 할 수 있는 자료구조이다
- 두개의 포인터를 사용하여, 양쪽의 삭제/삽입이 가능하다
비선형구조
트리
- 트리는 데이터들을 계층화 시킨 자료 구조이다
- 그래프의 특수한 형태로 노드와 선분으로 되어있고, 정점 사이에 사이클이 형성되어 있지 않으며, 자료 사이의 관계성이 계층 형식으로 나타나는 비선형 구조이다
- 인덱스를 조작하는 방법으로 가장 많이 사용하는 구조이다
- 트리는 노드와 노드를 연결하는 링크로 구성된다
- 배열과 달리 노드들이 포인터로 연결되어 노드의 상한선이없다
트리의 용어
용어 | 설명 |
루트노드(Root Node) | 트리에서 부모가 없는 최상위 노드, 트리의 시작점 |
단말노드(Leaf Node) | 자식이 없는 노드, 트리의 가장 말단에 위치 |
레벨(Level) | 루트 노드를 기준으로 특정 노드까지의 경로길이 |
조상노드(Ancestor Node) | 특정노드에서 루트에 이르는 경로상 모든 노드 |
자식노드(Child Node) | 특정노드에 연결된 다음 레벨의 노드 |
부모노드(Parent Node) | 특정 노드에 연결된 이전 레벨의 노드 |
형제노드(Sibiling) | 같은 부모를 가진 노드 |
깊이(Depth) | 루트 노드에서 특정 노드에 도달하기 위한 간선의 수 |
차수(Degree) | 특정 노드에 연결된 자식 노드의 수 - 트리의 차수를 고르라는데 특정 노드를 언급하지 않을 경우, 트리에서 가장 큰 차수를 가지는 값을 찾으면 된다 |
트리 순회 방법
방법 | 설명 |
전위 순회 (Pre-Order Traversal) |
root - > left - > right |
중위 순회 (In-Order Traversal) |
left -> root -> right |
후위 순회 (Post - Order Traversal) |
left -> right - > root |
트리 순회 예시
pre : A B D E C F G
in : D B E A F C G
post : D E B F G C A
트리 순회 예시2
구하고자 하는 정보 | 결과 |
차수 | 3 |
B의 차수 | 3 |
전위 순회 (Preorder) | A-B-D-E-F-H-I-C-G |
중위 순회 (Inorder) | D-B-E-H-F-I-A-C-G |
후위 순회 (Postorder) | D-E-H-I-F-B-G-C-A |
수식 변환 문제
3+2를 표현하는 방식
Prefix : +32
Infix : 3+2
postfix : 32+
그래프
- 그래프는 노드와 노드를 연결하는 간선을 하나로 모아놓은 자료구조이다
- 트리는 사이클이 없는 그래프이다
- 방향그래프 : 정점을 연결하는 선에 방향이 있는 그래프
n개의 정점으로 구성된 방향 그래프의 최대 간선 수는 n(n-1)
- 무방향그래프 : 정점을 연결하는 선에 방향이 없는 그래프
n개의 정점으로 구성된 방향 그래프의 최대 간선 수는 n(n-1)/2
탐색방법 | 설명 |
깊이 우선 탐색 (DFS; Depth-First Search) |
최대한 깊이 내려간 뒤, 더이상 깊이 갈곳이 없을 경우 옆으로 이동 |
너비 우선 탐색 (BFS; Breadth-First Search) |
최대한 넓게 이동한 다음 더 이상 갈 수 없을때 아래로 이동 |
🎁물리 데이터 저장소
순서 | 변환단계 |
1 | 단위 개체를 테이블로 변환 |
2 | 속성을 컬럼으로 변환 |
3 | UID를 기본 키로 변환 |
4 | 관계를 외래 키로 변환 |
5 | 컬럼 유형과 길이 정의 |
6 | 반 정규화 수행 |
인덱스 (Index) 설계
1. 인덱스 적용 기준
- 조회 및 출력 조건으로 사용되는 컬럼인 경우 적용한다
- 인덱스 자동생성 기본키와 유니크 키의 제약조건을 사용할 경우 적용한다
- 분포도가 좋은 컬럼은 단독적으로 생성한다
- 자주 조합되어 사용되는 컬럼은 결합 인덱스로 생성한다
2. 설계시 고려사항
- 지나치게 많은 인덱스는 오버헤드로 작용한다
- 인덱스는 추가적인 저장 공간이 필요함을 고려해야 한다
- 넓은 범위를 인덱스 처리 시 오히려 전체 처리보다 많은 오버헤드를 발생시킬 수 있음에 유의한다
- 인덱스와 테이블의 저장공간을 적절히 분리 될 수 있도록 설계해야한다
뷰 설계
1. 뷰 설계시 고려사항
- 뷰 사용에 따라 수행속도에 문제가 발생할 수 있다
- 뷰 SELECT 문의 조건은 최적의 엑세스 경로를 사용할 수 있도록 한다
2. 뷰 적용 기준
- 인덱스의 단점을 해결한 기법으로 분포도가 넓을 수록 오히려 유리하다
ORM (Object Relational Mapping) 프레임워크
- 관계형 데이터 베이스와 객체지향 프로그래밍 언어 간 호환되지 않는 데이터를 변환 하는 프로그래밍 기법
- iBatis , MyBatis, Embeded SQL
트랜잭션 인터페이스(Transaction Interface)
- 트랜잭션 인터페이스는 데이터 베이스 트랜잭션의 입출력과 기능 형태를 정의한 인터페이스이다
- 트랜잭션 인터페이스는 ACID 원칙을 기반으로 설계된다
트랜잭션 인터페이스의 특징
특징 | 설명 |
원자성(Atomicity) | 트랜잭션 연산을 데이터베이스 모두에 반영 또는 반영하지 말아야함 (완전하게 수행완료 안되면 수행되지 않아야함) |
일관성(Consistency) | 트랜잭션이 실행을 성공적으로 완료할시 일관성 있는 데이터 베이스 상태를 유지 |
격리성(Isolation) | 둘 이상 트랜잭션 동시 실행 시 한개의 트랜잭션만 접근이 가능하여 간섭 불가 |
영속성(Durability) | 성공적으로 완료된 트랜잭션 결과는 영구적으로 반영됨 |
프로시저
- 프로시저는 일련의 쿼리들을 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합이다
- 데이터 베이스 내부에 저장되고 일정한 조건이 되면 자동으로 수행된다
PL/SQL 의 장점
- 컴파일 불필요
- 모듈화 가능
- 절차적 언어사용
- 에러처리
트리거
- 특정 테이블에 삽입, 수정, 삭제 등의 데이터 변경 이벤트가 발생시 DBMS 에서 자동적으로 실행되도록 구현된 프로그램
🎁통합구현
단위 모듈 구현의 개념
- 단위 모듈 구현은 소프트웨어 개발에 있어 기능을 단위 모듈별로 분할하고 추상화하여 성능을 향상시키고,
유지보수를 효과적으로 하기 위한 구현 기법
단위 모듈 구현의 원리
- 정보 은닉(Information Hiding) : 어렵거나 변경 가능성이 있는 모듈을 타 모듈로부터 은폐
- 분할과 정복(Divide & Conquer) : 복잡한 문제를 분해, 모듈 단위로 문제 해결
- 데이터 추상화(Data Abstraction) : 각 모듈 구조를 엑세스하고 수정하는 함수내에 자료구조의 표현 내역을 은폐
- 모듈 독립성(Module Independency) : 낮은 결합도와 높은 응집도를 가짐
구현 단계에서 작업 절차
코딩 계획 -> 코딩 - > 컴파일 -> 테스트
재사용 기법
- 재사용은 이미 개발되어 기능, 성능 및 품질을 인정 받았던 소프트웨어의 전체 또는 일부분을 다시 사용하는 기법
구분 | 설명 |
재공학 (Re-Engineering) | 기존 소프트웨어를 버리지 않고 기능을 개선시키거나 기능을 새로운 소프트웨어로 재활용 (고도화) |
역공학(Reverse Engineering) | SW 에 대한 디버깅, 디컴파일 등의 분석을 통해 기존 제품에 구현된 구조, 원리, 기술 , 알고리즘 등을 역으로 분석하여 재구성 |
재개발(Re - Development) | 기존 시스템 내용을 참조하여 완전히 새로운 시스템을 개발 |
IDE (Integrated Development Environment)도구
- IDE 도구는 코딩, 디버그, 컴파일, 배포 등 프로그램 개발과 관련된 모든 작업을 하나의 프로그램 안에서 처리하는 환경을 제공하는 소프트웨어
- 개발환경지원, 컴파일, 디버깅, 외부 연계, DB 연동
- 이클립스, 비주얼 스튜디오
형상관리의 개념
- 형상관리는 소프트웨어 생명주기 동안 발생하는 변경사항을 체계적으로 관리하여 소프트웨어의 품질 보증을 향상시키는 관리적 활동이다
- 형상관리는 개발 과정의 변경 사항을 관리한다
- 형상관리 관리 항목으로는 프로젝트 요구 분석서, 소스 코드, 운영 및 설치 지침서가 있다
- 유지보수 뿐만아니라 개발 단계에도 사용할수있다
- CVS , SVN , Git
절차 | 설명 |
1. 형상 식별 | - 형상 관리 계획을 근거로 관리의 대상이 무엇인지 식별하는 활동 |
2. 형상 통제 | - 형상 항목의 변경사항에 대하여, 형상통제위원회(CCB)가 승인/기각/보류를 결정하고, 승인된 변경사항의 이행을 체계적으로 통제하는 활동 |
3. 형상 감사 | - 형상 관리 계획대로 형상 관리가 진행되고 있는지 형상 항목의 변경이 요구사항에 맞도록 제대로 이뤄졌는지 등을 살펴보는 활동 |
4. 형상 기록 | -소프트웨어 형상 및 변경 관리에 대한 각종 수행결과를 기록하는 활동 |
형상 관리 도구
도구 | 설명 |
CVS | 가장 오래된 형상관리 도구중의 하나로서 중앙 집중형 서버 저장소를 두고 클라이언트가 접속해서 버전 관리를 실행하는 형상 관리 도구 - 직관 적이고 비교적 단순한 명령세트 - 텍스트 기반 소스 코드 위주 지원 - 등록된 파일 및 디렉토리 의 변동이 불편 - 커밋 실패등에 대한 롤백 기능 미지원 |
SVN | 중앙 집중형 클라이언트-서버 방식으로 CVS 의 단점을 보완 - 커밋 실패시 롤백 가능 |
Git | 리누스 토발즈가 2005년 리눅스 커널의 개발을 위해 만든 형상 관리 시스템 - 분산 저장소 방식 |
애플리케이션 배포 도구
- 애플리케이션 배포 도구는 배포를 위한 패키징 시에 디지털 콘텐츠의 지적 재산권을 보호하고 관리하는 기능을 제공하며, 안전한 유통과 배포를 보장하는 도구이자 솔루션이다
- 기술요소 : 암호화, 키관리, 식별기술, 저작권 표현, 암호화 파일 생성, 정책 관리, 크랙 방지, 인증
애플리케이션 배포 도구 활용 시 고려사항
- 제품 소프트웨어 패키징 도구 및 애플리케이션 배포 도구 활용 시 암호화/보안, 이기종 연동, 복잡성 및 비효율 문제, 최적합 암호화 알고리즘 적용
DRM (Digital Rights Management)
- DRM 은 디지털 콘텐츠에 대한 권리정보를 지정하고 암호화 기술을 이용하여 허가된 사용자의 허가된 권한 범위 내에서 콘텐츠의 이용이 가능하도록 통제하는 기술이다
- 저작권자와 콘텐츠 유통업자 사이의 거래구조 투명성 제공
- 사용가능 횟수, 유효기간, 사용 환경 등을 정의 가능
- 자유로운 상거래 제공
구성요소 | 설명 |
콘텐츠 제공자 (Content Provider) |
콘텐츠를 제공하는 저작권자 |
콘텐츠 소비자 (Content Customer) |
콘텐츠를 구매해서 사용하는 주체 |
콘텐츠 분배자 (Content Distributor) |
암호화된 콘텐츠를 유통하는 곳이나 사람 |
클리어링 하우스 (Clearing House) |
- 저작권에 대한 사용권한, 라이선스 발급, 사용량에 따른 관리 등을 수행하는곳 - 키관리 및 라이선스 발급 관리 - 콘텐츠 권한 정책, 라이선스 관리를 수행 |
DRM 콘텐츠 | 서비스하고자 하는 암호화된 콘텐츠, 콘텐츠와 관련된 메타 데이터, 콘텐츠 사용정보를 패키징하여 구성된 콘텐츠 |
패키저 | 콘텐츠를 메타 데이터와 함께 배포 가능한 단위로 묶는도구 |
DRM 컨트롤러 | 배포된 디지털 콘텐츠의 이용 권한을 통제 |
DRM 의 기술요소
- 암호화 , 키관리, 식별 기술, 저작권 표현, 암호화 파일 생성, 정책 관리 , 크랙 방지, 인증
국제 제품 품질 표준
품질 표준 | 설명 |
ISO/IEC 9126 | ISO/IEC 9126 의 품질 모델은 소프트웨어 품질을 측정하고, 평가하기 위해서 소프트웨어의 품질요소와 특성을 정의 |
ISO/IEC 14598 | 소프트웨어 제품 평가 프로세스 및 평가 모듈을 제공 |
ISO/IEC 12119 | 소프트웨어 패키지 제품에 대한 품질 요구사항 및 테스트 국제 표준 |
ISO/IEC 25000 | 품질 표준을 모두 통합하여 통합적인 국제표준 |
ISO/IEC 9126 의 소프트웨어 품질 특성
품질 특성 | 설명 |
기능성 (Functionality) | 명시된 요구와 내재된 요구를 만족하는 기능을 제공하는 소프트웨어 제품의 능력 |
신뢰성(Reliability) | 명시된 조건에서 사용될 때 성능 수준을 유지할 수 있는 소프트웨어 제품 능력 - 주어진 시간동안 주어진 기능을 오류없이 수행하는 정도 |
사용성(Usability) | 사용자에 의해 이해되고 학습되고 사용되고, 선호될 수 있는 소프트웨어 제품의 능력 |
효율성(Effciency) | 명시된 조건에서 사용되는 자원의 양에 따라 요구된 성능을 제공하는 소프트웨어 제품의 능력 |
유지보수성(Maintainability) | 소프트웨어 제품이 변경되는 능력 |
이식성(Portability) | 하나 이상의 하드웨어 환경에서 운용되기 위해 쉽게 수정될 수 있는 시스템의 능력 |
소프트웨어 공학
- 소프트웨어 공학은 소프트웨어의 개발, 운용, 유지보수 및 파기에 대한 체계적인 접근 방법
- 현대적인 프로그래밍 기술을 계속적으로 작용
- 개발된 소프트웨어의 품질이 유지되도록 지속적 검증 수행
- 소프트웨어 개발 관련 사항 및 결과에 대한 명확한 기록 유지
공학적으로 잘된 소프트웨어 의 특성
- 소프트웨어는 유지보수가 용이해야 한다
- 소프트웨어는 신뢰성이 높아야한다
- 소프트웨어는 충분한 테스팅을 거쳐야한다
소프트웨어 공학 관련 법칙
법칙 | 설명 |
브룩스의 법칙 (Brooks) | "지체되는 소프트웨어 개발 프로젝트에 인력을 추가하는것은 개발을 늦출 뿐이다" 라고 주장한 법칙 - 인력때매 방해 |
파레토 법칙 (Pareto) | 전체 결과의 80% 가 전체 원인의 20% 에서 일어나는 현상을 나타낸 법칙 - 소프트웨어 테스트 원리중 20% 의 모듈에서 80% 의 결함이 발견된다는 '결합 집중' 원리를 내포 |
롱테일 법칙 (Long Tail) | 사소해보이는 80% 의 다수가 20%의 소수 핵심보다도 뛰어난 가치를 창출해낸다는 법칙 파레토 법칙의 반대 |
빌드 자동화 도구
도구 | 설명 |
젠킨스(Jenkins) -> 지금 내가 사용하는 툴 | 자바 기반의 오픈소스로 가장 많이 활용되는 빌드 자동화 도구 , 지속적 통합관리 - 서블릿 컨테이너 |
그래들(Gradle) | 그래들은 그루비와 유사한 도메인 언어를 채용, 현재 안드로이드 앱을 만드는데 필요한 안드로이드 스튜디오의 공식 빌드 자동화 시스템 |
🎁애플리케이션 테스트 관리
테스트 케이스(Test Case)
- 테스트 케이스는 특정 요구사항에 준수하는지를 확인하기 위해 개발된 입력값, 실행 조건, 예상된 결과의 집합
테스트 케이스 작성 절차
순서 | 절차 |
1 | 테스트 계획 검토 및 자료 확보 |
2 | 위험 평가 및 우선순위 결정 |
3 | 테스트 요구사항 정의 |
4 | 테스트 구조 설계 및 테스트 방법 결정 |
5 | 테스트 케이스 정의 |
6 | 테스트 케이스 타당성 확인 및 유지보수 |
테스트 오라클
- 테스트 오라클은 테스트의 결과가 참인지 거짓인지를 판단하기 위해서 사전에 정의된 참값을 입력하여 비교
테스트 레벨 종류
종류 | 설명 | 기법 |
단위 테스트(Unit Test) | - 사용자 요구사항에 대한 단위 모듈, 서브루틴 등을 테스트 하는 단계 - 소프트웨어 설계의 최소 단위인 모듈이나 컴포넌트에 초점을 맞춘 테스트 - 자료구조, 인터페이스 , 독립적 기초 경로, 오류 처리 경로 , 경계 조건 등을 검사 - 단위 테스트는 명세 기반 테스트(블랙박스테스트) , 구조 기반 테스트(화이트 박스 테스트)로 나뉘지만 주로 구조 기반 테스트 위주로 수행한다 |
-인터페이스 테스트 -자료 구조 테스트 -실행 경로 테스트 -오류 처리 테스트 |
통합 테스트(Integration Test) | - 단위 테스트를 통과한 컴포넌트 간의 인터페이스를 테스트 하는 단계 - 소프트웨어 각 모듈간의 인터페이스 관련 오류 및 결함을 찾아내기 위한 체계적인 테스트 기법 |
- 빅뱅 테스트 - 상향식/하향식 테스트 |
시스템 테스트(System Test) | - 개발 프로젝트 차원에서 정의된 전체 시스템 또는 제품의 동작에 대해 테스트 하는 단계 - 통합된 단위 시스템의 기능이 시스템에서 정상적으로 수행되는 지 검증하는 테스트 - 기능적 요구사항 테스트: 블랙박스, 명세서, 비즈니스 절차, 유스케이스 |
- 기능/ 비기능 요구사항 테스트 |
인수 테스트(Acceptance Test) | - 계약상의 요구사항이 만족되었는지 확인하기 위한 테스트 단계 - 최종 사용자와 업무의 이해관계자 등이 테스트를 수행함으로써 개발된 제품에 대해 운영 여부를 결정하는 테스트 |
- 알파/ 베타 테스트 |
테스트 시나리오
- 테스트 시나리오는 애플리케이션의 테스트되어야 할 기능 및 특징, 테스트가 필요한 상황을 작성한 문서이다
정적 테스트 : 테스트 대상을 실행하지 않고 구조를 분석하여 논리성을 검증하는 테스트
- 동료 검토, 워크 스루, 인스펙션(담당자 없이 리뷰)
동적 테스트 : 소프트웨어를 실행하는 방식으로 테스트를 수행하여 결함을 검출하는 테스트
- 화이트박스, 블랙박스
블랙박스 테스트
- 프로그램 외부 사용자의 요구사항 명세를 보면서 수행하는 테스트 이다
- 소프트웨어의 특징, 요구사항, 설계 명세서 등에 초점을 맞춰 테스트가 이뤄진다
- 기능 및 동작 위주의 테스트를 진행하기 때문에 내부 구조나 작동 원리를 알지 못해도 가능하다
- 명세테스트
블랙박스 테스트 유형
- 동등 분할 테스트, 경곗값 분석 테스트, 결정 테이블 테스트, 상태전이 테스트, 유스케이스 테스트, 분류 트리 테스트, 페어 와이즈 테스트, 원인 - 결과 그래프 테스트, 비교 테스트
화이트박스 테스트
- 각 응용 프로그램의 내부 구조와 동작을 검사하는 소프트웨어이다
- 코드분석과 프로그램 구조에 대한 지식을 바탕으로 문제가 발생할 가능성이 있는 모듈 내부를 직접 관찰하고, 테스트 하는 방법
- 소스 코드의 모든 문장을 한번 이상 수행함으로써 진행
- 논리적 경로를 점검
화이트박스 테스트 유형
- 구문커버리지, 결정 커버리지, 조건 커버리지, 변경 커버리지, 다중 조건 커버리지, 경로 커버리지, 제어 흐름 테스트, 데이터 흐름 테스트
테스트 시간에 따른 분류
분류 | 설명 |
검증 (Verification) | 소프트웨어 개발과정을 테스트 |
확인(Validation) | 소프트웨어 결과를 테스트 |
테스트 목적에 따른 분류
분류 | 설명 |
회복 테스트 (Recovery) | 고의로 실패 유도, 정상적 복귀 여부 테스트 |
안전 테스트 (Security) | 보안적인 결함을 미리 점검 |
성능 테스트(Performance) | 시스템이 반응하는 속도 등을 측정 |
강도 테스트(Stress) | 시스템 처리 능력 이상의 부하 임계점 이상의 부하를 가하여 비정상적인 상황에서의 처리를 테스트 |
구조 테스트( Structure) | 시스템의 내부 논리 경로 , 소스 코드의 복잡도를 평가하는데 필요한 테스트 |
회귀(Regression) | 회귀 테스트는 오류를 제거하거나 수정한 시스템에서 오류제거와 수정에 의해 새로이 유입된 오류가 없는지 확인하는 일종의 반복 테스트 기법 |
병행테스트(Parallel) | 결과 비교 |
소프트웨어 테스트의 원리
원리 | 설명 |
결함 존재 증명 | 테스트는 결함이 존재함을 밝히는 활동 |
완벽 테스팅은 불가능 | 무한경로, 무한 입력 값으로 인한 완벽한 테스트는 어렵다 |
초기 집중 | 개발 초기에 체계적인 분석 및 설계가 수행되면 개발기간을 단축할 수 있고 결함 예방 가능 |
결함 집중 | 소프트웨어 테스트 원리중 20% 의 모듈에서 80% 의 결함이 발견된다 - 파레토 법칙 |
살충제 페러독스 | 동일한 테스트 케이스에 의한 반복적 테스트는 새로운 버그를 찾지 못한다는 원리 |
정황 의존성 | 소프트웨어의 성격에 맞게 테스트 해야함 |
오류-부재의 궤변 | 요구사항을 충족시키지 못하면 결함이 없다해도 품질이 높을수없음 |
결함의 개념
- 결함은 개발자 오류로 인해 만들어지는 문서 또는 코딩 상의 결점으로 소프트웨어가 개발자가 설계한 것과 다르게 동작하거나 다른 결과가 발생하는 현상
정적분석도구 : PMD , CheckStyle , Splint, Cppcheck , SonarQube
동적분석도구 : Avalanche, Valgrind
테스트 스텁 : 하향식 통합시험을 위해 일시적으로 필요한 조건만을 가지고 임시로 제공되는 시험용 모듈
- 일시적으로 필요한 조건만을 가지고 임시로 제공되는 시험용 모듈
- 하위 모듈이 없는 경우
테스트 드라이버 : 상향식 통합시험을 위해 모듈 테스트 수행 후의 결과를 도출하는 시험용 모듈
- 결과를 도출하는 시험용 모듈
- 상위 모듈이 없는 경우
하향식 통합시험
- 메인 제어 모듈로부터 아래 방향으로 제어의 경로를 따라 이동하면서 하향식으로 통합하는 테스트이다
상향식 통합시험
- 애플리케이션 구조에서 최하위 레벨의 모듈 또는 컴포넌트로부터 점진적으로 상위 모듈과 함께 테스트하는 기법
🎁알고리즘
알고리즘은 어떠한 문제를 해결하기 위한 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 기법
기법 | 설명 |
분할과 정복(Divide and Conquer) | 문제를 나눌 수 없을때 까지 나누고, 각각을 풀면서 다시 병합하여 문제의 답을 얻는 알고리즘 |
동적계획법(Dynamic Programming) | 어떤 문제를 풀기 위해 그 문제를 더 작은 문제의 연장선으로 생각하고 과거에 구한 해를 활용하는 방식의 알고리즘 |
탐욕법(Greedy) | 결정을 해야할때마다 그 순간에 가장 좋다고 생각되는 것을 해답으로 선택함으로써 최종적인 해답에 도달하는 방식의 알고리즘 |
백트래킹(Backtracking) | 어떤 노드의 유망성 점검 후 , 유망하지 않으면 그 노드의 부모 노드로 되돌아간 후 다른 자손 노드를 검색하는 알고리즘 |
시간 복잡도에 따른 알고리즘 분류
복잡도 | 설명 | 대표 알고리즘 |
O(1) | - 상수형 복잡도 - 자료 크기 무관하게 항상 같은 속도로 작동 - 알고리즘 수행 시간이 입력 데이터 수와 관계없이 일정 |
해시함수(Hash Function) |
O(log2n) | -로그형 복잡도 -문제를 해결하기 위한 단계의 수가 log2n번만큼의 수행 시간을 가짐 |
이진탐색(Binary Search) |
O(n) | - 선형복잡도 - 입력자료를 차례로 하나씩 모두 처리 - 수행 시간이 자료 크기와 직접적 관계로 변함 정비례 |
순차탐색(Sequentail Search) |
O(nlog2n) | - 선형 로그 복잡도 - 문제를 해결하기 위한 단계의 수가 nlog2n 번만큼의 수행시간을 가짐 |
퀵 정렬, 합병 정렬, 힙정렬 |
O(n2) | - 제곱형 주요 처리 루프 구조가 2중인경우 - n 크기 작을 때는 n제곱 이 nlog2n보다 빠를 수 잇음 |
거품 정렬, 삽입 정렬, 선택정렬 |
해싱함수(Hashing Function)
- 해쉬함수는 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수
해싱함수
제산법 (division): 나머지 연산자%를 사용하여 테이블 주소를 계산하는 방식
제곱법(square): 제곱법은 레코드 키값을 제곱한 후에 결과 값의 중간 부분에 있는 몇 비트를 선택하여 해시 테이블의 홈 주소로 사용하는 방식
숫자 분석법(Digit Analysis) : 비교 적 고른 분포 자리수를 선택하여 레코드의 홈 주소로 사용
폴딩법(Folding) : 레코드 키를 여러 부분으로 나누고, 나눈 부분의 각 숫자를 더하거나 XOR 한 값을 홈 주소로 사용하는 방식
기수변환법(Radix) : 키를 변환하여 홈주소 얻음
1. 순차 검색 (Sequential Search) O(n)
- 배열의 처음부터 끝까지 차례대로 비교하여 원하는 데이터를 찾아내는 알고리즘
- 순차검색 예제
아래 리스트에서 901을 찾는다
92, 100, 215 , 341, 625, 716, 812, 813 , 820, 901, 902
- 첫번 째 레코드에 있는 92와 901을 비교
- ...
- 찾으려는 값과 같으면 순차 탐색 종료. 10번의 시도로 찾을 수 있음
2. 이진 검색 (Binary Search) O(log2n)
- 정렬되어 있는 리스트에서 탐색 범위를 좁혀가며 데이터를 탐색
- 탐색 효율이 좋고 탐색 시간이 적게 소요
- 가운데 레코드를 찾기위해서 아래 식을 사용
M = (F + L)/2
M : 남은 범위에서 가운데 레코드 번호
F : 남은 범위에서 첫 번 째 레코드 번호
L : 남은 범위에서 마지막 레코드 번호
이진 탐색 동작 방식
1. 배열의 중간 값을 찾음
2. 중간 값과 검색 값을 비교
2-1. 중간 값이 검색 값과 같으면 끝.
2-2. 중간 값보다 검색 값이 크다면 오른쪽 구간을 탐색
2-3. 중간 값보다 검색 값이 작다면 왼쪽 구간을 탐색
3.값을 찾거나 간격이 비었을 때까지 반복
이진 검색으로 14 를 찾아라 => 비교되는 횟수 : 3
STEP 1.
배열의 중간값 :(0+14)/2 = 7
중간값보다 검색값이 크므로 오른쪽 탐색
STEP2.
7+1 = 8
(8+14)/2 = 11
arr[11] = 12
값 : 12
STEP3.
11+1 = 12
(12+14)/2 = 13
arr[13] = 14
값: 14
3. 퀵 정렬(Quick Sort) O(nlog2n)
- 퀵 정렬은 피벗을 두고 피벗의 왼쪽에는 피벗보다 작은 값을 오른쪽에는 큰값을 두는 과정을 반복하는 알고리즘이다
- 레코드의 많은 자료 이동을 없애고 하나의 파일을 부분적으로 나누어 가면서 정렬한다
최적 수행 시간: O(nlog2n)
평균 수행 시간:O(nlog2n)
최악 수행 시간: O(n2)
4. 합병 정렬(Merge Sort)
- 합병 정렬은 전체 원소를 하나의 단위로 분할 한 후 분할 한 원소를 다시 합병해서 정렬하는 알고리즘
최적 수행 시간: O(nlog2n)
평균 수행 시간:O(nlog2n)
최악 수행 시간: O(nlog2n)
5. 힙정렬(Heap Sort)
- 정렬할 입력 레코드들로 힙을 구성하고 가장 큰 키값을 갖는 루트 노드를 제거하는 과정을 반복하여 정렬하는 알고리즘
최적 수행 시간: O(nlog2n)
평균 수행 시간:O(nlog2n)
최악 수행 시간: O(nlog2n)
6. 거품 정렬(Bubble Sort) O(n2)
- 인접한 2개의 레코드 키값을 비교하여 그 키에 따라 레코드 위치를 서로 교환
7. 삽입 정렬(Insertion Sort) O(n2)
- 삽입정렬은 2번째 키와 첫번째 키를 비교하여 순서 대로 나열하고, 이어서 3번째 키를 1,2 번째 키와 비교해 순서대로 나열하고, 계속해서 n번째 키를 앞의 (n-1)개 키와 비교하여 순서대로 나열 , 알맞는 순서에 삽입
8. 선택 정렬(Selection Sort) O(n2)
- 정렬되지 않은 데이터들에 대해 가장 작은 데이터를 찾아 정렬되지않은 부분의 가장 앞 데이터랑 교환
베드 코드 유형
- 오염, 문서부족, 의미 없는 이름, 높은 결합도, 아키텍처 침식, 외계인 코드, 스파게티 코드, 알 수 없는 변수명, 로직 중복
클린 코드 작성 원칙
- 가독성, 단순성, 의존성 최소, 중복성 제거, 추상화
맥케이브 회전 복잡도 측정 방식
복잡도 = E(간선) - N(노드) + 2
복잡도 = 조건 분기문 + 1
EAI
- 기업에서 운영되는 서로 다른 플랫폼 및 애플리케이션 간의 정보 전달 , 연계, 통합을 가능하게 해주는 솔루션