체계적인 소프트웨어의 개발 관리 -> 시스템 품질과 개발 생산성 결정의 중요 요인
소프트웨어 특성 - 다기능화 및 대규모화
소프트웨어 공학의 배경
수요 급증, 구현 인력 부족 발생으로 도입
목적
선코딩 - 후수정의 결함 발견
-> 구조적 정형적 기법 발생 <- 사용성이 떨어지거나 비용 높고 진척도가 떨어져ㅜ
-> 재사용성을 높여 효율적으로 개발하자
-> 시장이 급속하게 변화하기 시작한 후 애자일 방법론을 본격적으로 사용
소프트웨어 생명주기
: 사용자 환경 및 문제점 이해에서 시작하여
운용/유지 보수에 이르기까지의 모든 과정
[타당성 검토->개발 계획->요구사항 분석->설계->구현->테스트->운용->유지보수]
소프트웨어 개발 단계
요구사항분석, 설계, 구현, 테스팅
소프트웨어 요구관리, 유지관리, 형상관리, 품질관리
애자일 방법론
: 기민한, 좋은 것을 빠르고 낭비없게 만들자! 이름 뜻!
<짧은 주기로, 제품 서비스를 릴리즈>
종류
Scrum
스크럼 회의, 소멸 차트, 스프린트 리뷰 -> 투명성, 커뮤니케이션
XP
단순 설계, 테스트 기반, pair programming, continuous integration, small release
Lean
build -> measure -> learn 반복
Kanban
업무를 작게 분할 카드에 기록하고 동시 진행 항목 제한 -> 연속적 흐름 개발
재사용
개념 - 기존의 관련 지식을 활용해 새로운 소프트웨어 구축
또는 반복적으로 사용하기에 적합하도록 구성
목적 - 신뢰성, 확장성, 생산성 높여
지식이란 - 설계 정보, 데이터 정보, 코드, 인력, 요구사항
고려사항 - 초기투자, 생산성 평가 및 척도, 도구 라이브러리
역공학
개념 - 이미 만들어진 시스템을 역으로 추적해
문서(구조도, 흐름도, 개체 관례도 등)를 얻어내는 일
필요한 이유 - 변경이 빈번해 시스템 효율이 낮음, 유지보수가 어려운 문제
장점 - 분석을 도움, 유지보수성 향상
자료구조 정의 : 자료를 컴퓨터의 기억장치 내에 저장하는 방법
다양한 자료를 효율적으로 표현하고 활용할 수 있도록
자료의 특성과 사용 용도를 고려하여 조직적으로 정의!
분류
선형 구조 : 일렬로 연결 (배열 리스트 스택 등)
비선형 구조 : 계층구조나 망구조의 특별한 형태 (트리 그래프 등)
배열 리스트 스택 큐 데크 트리 그래프
알고리즘 정의 : 주어진 문제를 해결하기 위한 일련의 처리 절차를 기술
성능분석 - 정확성, 작업량, 기억 장소 사용량, 최적성, 단순성
1. 공간 복잡도
고정 공간량 + 가변 공간량
2. 시간 복잡도
컴파일시간 + 실행시간 (명령문의 실행 빈도수)
정렬/탐색 알고리즘
이름 : 설명 (평균 시간)
삽입정렬 : 현재 위치에서 키를 정해서 자신이 들어갈 위치를 찾아! 들어가! O(n^2)
쉘정렬 : 특정 길이로 쪼개서 삽입정렬을 함 O(n^1.5)
선택정렬 : 범위만큼 돌면서 최소값을 찾아 왼쪽으로 이동 O(n^2)
퀵정렬 : 분할 정복, 특정값보다 작은 값을 왼쪽에 큰 값은 오른쪽에 재귀로 풀어! O(nlogn)
버블정렬 : 인접한 데이터간에 교환 작으면 이동 이동 이동 O(n^2)
힙정렬 : 트리를 사용해서 정렬해! O(nlogn)
머지정렬 : 분할 정복, 데이터를 반으로 나누고 나누고 위로 올라오면서 정렬 O(nlogn)
기수정렬 : 데이터의 낮은 자리 수부터 비교하며 정렬 O(dn)
선형탐색 : 처음부터 마지막까지 쭉 보면서원하는 거 찾아 O(n)
이진탐색 : 계속 중간값 비교하며 들어가기 탐색 대상이 반씩 줄어 O(log2n)
피보나치탐색 : 피보나치 순열을 이용해 서브파일 생성하며 검색 O(log2n)
보간탐색 : 있을 것 같은 곳 간다음 선형탐색 ex)사전, 전화번호부 O(log(n))
블록탐색 : 일정 수 블록으로 구분하고 데이터 있는 블록 찾아 키값 검색 O(log(n))
이진트리탐색 : 이진트리 사용해서 검색, 삽임 검색 삭제 다 O(log(n))
해싱 : 해싱함수 사용해서 데이터 저장된 주소 계산 오 빨라~
그래프 탐색
: 하나의 정점에서 시작해서 그래프의 모든 정점을 한 번씩 방문!
ex) 특정 도시에서 다른 도시 싸게 가기, 전자 회로 연결 가능?
깊이 우선 - DFS 스택
현재 경로 노드들을 기억 저장 공간 수요 적고 구현 용이
너비 우선 - BFS 큐
어떤 노드들을 방문했는지 여부 저장 필수, 최소 거리 구할 때
데크(double-ended queue)
큐의 앞과 뒤에서 삽입과 삭제가 가능
트리 1:다
원소들 간에 계층관계를 가짐
시작노드 root node 연결하는 선 edge
같은 부모 자식 노드 sibling node
그래프 다:다
객체를 나타내는 정점 vertex 객체를 연결하는 간선 edge
전기회로 분석, 최단거리 검색, 인공지능 등 에 사용
인접행렬 (2차원 배열로 간선 연결 유무 저장),
인접리스트 (각 정점에 인접 정점을 연결) 등 구현 방법 사용
최소 신장 트리(Minimum Spanning Tree)
무방향 가중치 그래프 내 모든 정점을 포함,
서로 연결된 트리,
사이클 없음, 가중치의 합이 최소가 되도록
사용하는 알고리즘
크루스칼 - 사이클 체크하며 가중치 최소인 간선 선택
프림 - 한 정점 선택해서 구성된 최소 신장 트리에 안 연결된 애들 선택하며 확장
분할 - 복잡한 문제를 해결하기 쉬움
설계 시 고려되어야 하는 소프트웨어 설계 원리 종류
추상화 - 상세한 수준 고민x 생략o -> 있다고 생각하고 상위 수준 고려
정보은닉 - 내부 내용 감추고 접근 제한 인터페이스 사용
단계적 정제 - 높은 추상화에서 낮은 추상화 단계로 구체화
모듈화 - 시스템을 구성 요소로 나눠, 복잡도 낮춰, 잘 모듈을 나눠야해
구조화
설계 단계에서 품질에 영향을 미치는 요소
응집도 - 모듈 내부가 서로 강한 연관성 있음? (외부와는 상호 교류 낮음?)
결합도 - 모듈 사이의 상호 연관성의 복합도 ex) 전역 변수 지양
=> 응집도는 높게, 결합도는 낮게 변경이 있을 때 밖에 영향이 적도록
구조적 설계 방법 : 구조적 분석 결과를 구조적 설계로 옮겨
자료 흐름을 나타내보자!
구조적 분석 기법에선
버블 차트 또는 자료흐름도(DFD:Data Flow Diagram) 표기법 사용
구조적 설계에선
구조도표(모듈 사이의 제어, 흐름, 반복, 선택 등 나타냄) 사용
정보 흐름의 종류 -> 요구사항 명세서를 설계 문서로 바꾸는 데 영향
변환 중심 설계 - 입력흐름, 변환중심, 출력흐름
트랜잭션 중심 설계 - 들어온 입력을 여러 갈래의 출력 흐름으로 쪼갬
아키텍처..?
구성 요소, 구성들 간의 관계, 시스템의 기능 및 속성 제약사항을
적절히 반영하는 구조를 조직화하여 시스템의 전체적인 형태
아키텍처 설계..?
모듈화된 시스템의 전반적인 구조를 정하자!
모듈 - 구성 요소
컴포넌트 - 다시 사용할 수 있는 범용성을 위해 개발된 독립적인 모듈
ex) client, server, filter, layer, database, 프로세스, 객체 집합...
커넥터 - 컴포넌트 간 상호작용의 수단 제공
ex) procedure call, event broadcast, database protocol, 소켓, 미들웨어...
서브시스템 - 시스템은 서브시스템들로 이루어져있고, 컴포넌트나 다른 서브 시스템으로 구성됨
프레임워크 - 설계와 구현을 재사용할 수 있도록, 협업화된 형태로 클래스들을 제공
아키텍처 유형
저장소 구조 - 한 곳에 모든 공유 데이터 보관하고 다른 서브에들이 사용
MVC - 사용자 인터페이스를 시스템의 다른 부분과 분리
모델 : 백그라운드에서 동작하는 로직 처리
뷰 : 사용자가 보는 화면, 모델에 있는 데이터를 보여줘!
컨트롤러 : 사용자의 입력처리, 흐름제어 (뷰와 모델이 인터렉션하는 것을 제어)
클라이언트-서버 모델 - 서비스를요구-서비스를제공, 분산 시스템
계층구조 - 하위층이 제공하는 서비스를 상위층이 사용 ex) OSI
각 층을 쉽게 변경 가능, 인터페이스를 맞춰 쉽게 재사용 가능
파이프 필터 구조 - 파이프를 타고 흐르고, 필터에서 처리과정 ex) 컴파일러, 생물정보학 워크플로우
설계 표현 방법
컨텍스트 모델, 컴포넌트 다이어 그램, 패키지 다이어 그램, 배치 다이어 그램
객체 지향 분석 개념 : 객체의 집합으로 실세계를 보고 상호작용 파악
모델링 : 대상 시스템의 성능 또는 동작과정을 분석하기위해
이를 간단히 도식화 또는 수학적으로 표현
유스케이스로 사용자와 시스템이 어떻게 상요작용 되는지 알고->
정보모델링으로 클래스간 주고받는 정보를 알아내고->
동적모델링으로 어떻게 클래스끼리 상호작용할지
객체 지향 설계
개념 -
원리 -
정적 모델링 - 시간에 개념이 개입되지 않은 객체의 정적인 정보 ex) 속성, 관계 등
동적 모델링 - 상태나 동작의 변화, 상호작용 등 오퍼레이션
UML
디자인 패턴
개념 -
대표적 패턴 -
유스케이스, 시퀀스 다이어그램, 액티비티 다이어그램
객체, 클래스, 캡슐화, 상속, 연관, 집합 클래스, 속성, 관계, 연관, 오퍼레이션,
다형성 : 동일한 이름의 오퍼레이션이라도 클래스에 따라 다르게 동작
== 하나의 함수나 연산자가 여러 목적으로 사용
클래스 다이어그램, 인터랙션 다이어그램, 상태 다이어그램, 액티비티 다이어그램
싱글톤 패턴, 팩토리 매소드 패턴, 퍼사드 패턴, 스트래티지 패턴