TOPCIT 에센스 정리 - 01. 소프트웨어 개발

weenybeenymini·2020년 10월 27일
1

1. 소프트웨어 공학 개요

체계적인 소프트웨어의 개발 관리 -> 시스템 품질과 개발 생산성 결정의 중요 요인

학습 목표

소프트웨어 특성 - 다기능화 및 대규모화

소프트웨어 공학의 배경
수요 급증, 구현 인력 부족 발생으로 도입

목적
선코딩 - 후수정의 결함 발견
-> 구조적 정형적 기법 발생 <- 사용성이 떨어지거나 비용 높고 진척도가 떨어져ㅜ
-> 재사용성을 높여 효율적으로 개발하자
-> 시장이 급속하게 변화하기 시작한 후 애자일 방법론을 본격적으로 사용

핵심 키워드

소프트웨어 생명주기
: 사용자 환경 및 문제점 이해에서 시작하여
운용/유지 보수에 이르기까지의 모든 과정

[타당성 검토->개발 계획->요구사항 분석->설계->구현->테스트->운용->유지보수]

소프트웨어 개발 단계
요구사항분석, 설계, 구현, 테스팅

소프트웨어 요구관리, 유지관리, 형상관리, 품질관리

추가적 정리

  • 애자일 방법론
    : 기민한, 좋은 것을 빠르고 낭비없게 만들자! 이름 뜻!
    <짧은 주기로, 제품 서비스를 릴리즈>

  • 종류
    Scrum
    스크럼 회의, 소멸 차트, 스프린트 리뷰 -> 투명성, 커뮤니케이션
    XP
    단순 설계, 테스트 기반, pair programming, continuous integration, small release
    Lean
    build -> measure -> learn 반복
    Kanban
    업무를 작게 분할 카드에 기록하고 동시 진행 항목 제한 -> 연속적 흐름 개발

2. 소프트웨어 재사용

학습 목표 / 핵심 키워드

재사용
개념 - 기존의 관련 지식을 활용해 새로운 소프트웨어 구축
또는 반복적으로 사용하기에 적합하도록 구성
목적 - 신뢰성, 확장성, 생산성 높여
지식이란 - 설계 정보, 데이터 정보, 코드, 인력, 요구사항
고려사항 - 초기투자, 생산성 평가 및 척도, 도구 라이브러리

역공학
개념 - 이미 만들어진 시스템을 역으로 추적해
문서(구조도, 흐름도, 개체 관례도 등)를 얻어내는 일
필요한 이유 - 변경이 빈번해 시스템 효율이 낮음, 유지보수가 어려운 문제
장점 - 분석을 도움, 유지보수성 향상

3. 자료구조와 알고리즘

학습 목표

자료구조 정의 : 자료를 컴퓨터의 기억장치 내에 저장하는 방법
다양한 자료를 효율적으로 표현하고 활용할 수 있도록
자료의 특성과 사용 용도를 고려하여 조직적으로 정의!

분류
선형 구조 : 일렬로 연결 (배열 리스트 스택 등)
비선형 구조 : 계층구조나 망구조의 특별한 형태 (트리 그래프 등)

핵심 키워드

배열 리스트 스택 큐 데크 트리 그래프

알고리즘 정의 : 주어진 문제를 해결하기 위한 일련의 처리 절차를 기술
성능분석 - 정확성, 작업량, 기억 장소 사용량, 최적성, 단순성
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)
무방향 가중치 그래프 내 모든 정점을 포함,
서로 연결된 트리,
사이클 없음, 가중치의 합이 최소가 되도록

사용하는 알고리즘
크루스칼 - 사이클 체크하며 가중치 최소인 간선 선택
프림 - 한 정점 선택해서 구성된 최소 신장 트리에 안 연결된 애들 선택하며 확장

4. 소프트웨어 설계 원리와 구조적 설계

학습 목표 / 핵심 키워드

분할 - 복잡한 문제를 해결하기 쉬움

설계 시 고려되어야 하는 소프트웨어 설계 원리 종류
추상화 - 상세한 수준 고민x 생략o -> 있다고 생각하고 상위 수준 고려
정보은닉 - 내부 내용 감추고 접근 제한 인터페이스 사용
단계적 정제 - 높은 추상화에서 낮은 추상화 단계로 구체화
모듈화 - 시스템을 구성 요소로 나눠, 복잡도 낮춰, 잘 모듈을 나눠야해
구조화

설계 단계에서 품질에 영향을 미치는 요소
응집도 - 모듈 내부가 서로 강한 연관성 있음? (외부와는 상호 교류 낮음?)
결합도 - 모듈 사이의 상호 연관성의 복합도 ex) 전역 변수 지양
=> 응집도는 높게, 결합도는 낮게 변경이 있을 때 밖에 영향이 적도록

구조적 설계 방법 : 구조적 분석 결과를 구조적 설계로 옮겨

자료 흐름을 나타내보자!
구조적 분석 기법에선
버블 차트 또는 자료흐름도(DFD:Data Flow Diagram) 표기법 사용
구조적 설계에선
구조도표(모듈 사이의 제어, 흐름, 반복, 선택 등 나타냄) 사용

정보 흐름의 종류 -> 요구사항 명세서를 설계 문서로 바꾸는 데 영향
변환 중심 설계 - 입력흐름, 변환중심, 출력흐름
트랜잭션 중심 설계 - 들어온 입력을 여러 갈래의 출력 흐름으로 쪼갬

5. 소프트웨어 아키텍처 설계

아키텍처..?
구성 요소, 구성들 간의 관계, 시스템의 기능 및 속성 제약사항을
적절히 반영하는 구조를 조직화하여 시스템의 전체적인 형태

아키텍처 설계..?
모듈화된 시스템의 전반적인 구조를 정하자!

학습 목표 / 핵심 키워드

모듈 - 구성 요소
컴포넌트 - 다시 사용할 수 있는 범용성을 위해 개발된 독립적인 모듈
ex) client, server, filter, layer, database, 프로세스, 객체 집합...
커넥터 - 컴포넌트 간 상호작용의 수단 제공
ex) procedure call, event broadcast, database protocol, 소켓, 미들웨어...
서브시스템 - 시스템은 서브시스템들로 이루어져있고, 컴포넌트나 다른 서브 시스템으로 구성됨
프레임워크 - 설계와 구현을 재사용할 수 있도록, 협업화된 형태로 클래스들을 제공

아키텍처 유형
저장소 구조 - 한 곳에 모든 공유 데이터 보관하고 다른 서브에들이 사용
MVC - 사용자 인터페이스를 시스템의 다른 부분과 분리
모델 : 백그라운드에서 동작하는 로직 처리
뷰 : 사용자가 보는 화면, 모델에 있는 데이터를 보여줘!
컨트롤러 : 사용자의 입력처리, 흐름제어 (뷰와 모델이 인터렉션하는 것을 제어)
클라이언트-서버 모델 - 서비스를요구-서비스를제공, 분산 시스템
계층구조 - 하위층이 제공하는 서비스를 상위층이 사용 ex) OSI
각 층을 쉽게 변경 가능, 인터페이스를 맞춰 쉽게 재사용 가능
파이프 필터 구조 - 파이프를 타고 흐르고, 필터에서 처리과정 ex) 컴파일러, 생물정보학 워크플로우

설계 표현 방법
컨텍스트 모델, 컴포넌트 다이어 그램, 패키지 다이어 그램, 배치 다이어 그램

6. 객체 지향 설계

학습 목표

객체 지향 분석 개념 : 객체의 집합으로 실세계를 보고 상호작용 파악
모델링 : 대상 시스템의 성능 또는 동작과정을 분석하기위해
이를 간단히 도식화 또는 수학적으로 표현
유스케이스로 사용자와 시스템이 어떻게 상요작용 되는지 알고->
정보모델링으로 클래스간 주고받는 정보를 알아내고->
동적모델링으로 어떻게 클래스끼리 상호작용할지

객체 지향 설계
개념 -
원리 -

정적 모델링 - 시간에 개념이 개입되지 않은 객체의 정적인 정보 ex) 속성, 관계 등
동적 모델링 - 상태나 동작의 변화, 상호작용 등 오퍼레이션

UML

디자인 패턴
개념 -
대표적 패턴 -

핵심 키워드

유스케이스, 시퀀스 다이어그램, 액티비티 다이어그램

객체, 클래스, 캡슐화, 상속, 연관, 집합 클래스, 속성, 관계, 연관, 오퍼레이션,
다형성 : 동일한 이름의 오퍼레이션이라도 클래스에 따라 다르게 동작
== 하나의 함수나 연산자가 여러 목적으로 사용

클래스 다이어그램, 인터랙션 다이어그램, 상태 다이어그램, 액티비티 다이어그램

싱글톤 패턴, 팩토리 매소드 패턴, 퍼사드 패턴, 스트래티지 패턴

추가적 정리

0개의 댓글