소프트웨어 TOPCIT 교재 : https://www.topcit.or.kr/ebook/tech/ess01/JBook.htm


01. 소프트웨어 특성


- 소프트웨어 공학의 4가지 중요요소

방법 : 코딩,자료구조,테스팅 등

도구 : 소프트웨어 개발 생명주기 상의 수많은 도구

절차 : 방법 + 도구, 소프트웨어 개발을 도와줌

사람 : 사람에 대한 의존성이 큼


- 소프트웨어 생명주기

검토 -> 계획 -> 요구사항 분석 -> 구현 -> 테스트 -> 운용 -> 유지보수

- 소프트웨어 관리

유지관리 : 개발 후에도 관리

요구관리 : 관계자들로부터 요구

형상관리 : 산출물에 대한 형상을 만들고 관리

품질관리 : 계획가 일치한가 ?

- 기능성,신뢰성,사용성,효율성,유지보수성,이식성


- Q. 소프트웨어 생명주기에 관한 나선형 모델의 특징과 수행단계를 기술하고, 애자일 방법과 비교.

특징) 프로토타입을 지속적발전시켜 최종 소프트웨어 개발까지 이르게하는 점증적 방법

단계) 계획 -> 위험분석 -> 개발/구축 -> 고객 평가

비교) 1. 나선형은 문서를 통한 개발 방법이며, 애자일은 실질적인 코딩을통한 방법론.

2. 나선형은 발생하는 위험을 관리, 최소화 하지만 애자일은 변화를 수용하고 협업을 강조


- 자료구조 : 컴퓨터에서 다양한 자료를 더욱 효율적으로 활용하도록 조직적,체계적으로 구분하여 표현

- 분류 : 선형,비선형(트리,그래프)

- 자료구조 선택 기준 : 처리시간, 크기, 활용도, 갱신정도, 용이성

- 알고리즘 : 주어진 문제해결을 위한 처리 절차를 단계적으로 기술.

조건 : 입출력(0개이상입력 하나이상 결과출력), 명확성,유한성,유효성

분석기준 : 정확성, 작업량, 기억 장소 사용량, 최적성, 명확성

성능분석 : 공간 복잡도(메모리 사용량), 시간 복잡도(컴파일시간 + 실행시간)

정렬과 탐색 : 정렬 방법과 각 Sort 코딩 다 할줄 알아야 함

- 운영체제 : 컴퓨터 하드웨어와 응용프로그램간의 중재자. 시스템 자원 효율적 관리

- 프로세스 : "실행 중인 프로그램", "PCB를 가진 프로그램" (프로세스 생명주기,PCB,쓰레드 알아두기)

- 병행 프로세스 : 두 개 이상의 프로세스를 동시에 처리

오류 해결책 : 임계영역, 상호 배제, 세마포어

- 스케줄링 : 다중 프로그래밍을 지원하는 운영체제에서 프로세스를 효율적으로 CPU에게 할당하는 것

목적 : 프로세스의 공정성, 처리량 최대화, 반응시간 최소화, 예측 가능,과부화 방지 등

종류 : 선점형(CPU점유 시 다른 프로세스가 빼앗을 수 있음),비선점형(반대)

스케줄링 종류 : FIFO, SJF,SRT,RoundRobin,HRN


- 가상기억장치 : 주기억장치를 많은 여유 공간을 가진 대용량처럼 사용, 매핑

구현기법 : 페이징기법, 세그멘테이션기법

페이지 교체기법 : FIFO, LRU, LFU, NUR

성능에 영향을 미치는 요인 : 워킹 셋,스래싱,지역성


- 컴퓨터구조 키워드 : 멀티코어 프로세서, 병렬시스템(SISD ~ MIMD까지), 파이프라인 프로세서,배열,다중프로세서, 은행원 알고리즘

- 요구사항 분석과 명세화 키워드 : 기능적,비기능적 요구 / 자료흐름도,자료사전,소단위 명세서 / 유스케이스,클래스,액티비티 다이어그램

- 모델링 : 시스템의 성능 또는 동작과정 분석을 위하여 이를 간단히 도식화


- 소프트웨어 설계 원리 : 분할,추상화,정보은닉,단계적 정제,모듈화,구조화 / 응집도, 결합도 / 변환 중심 설계, 트랜잭션 중심 설계, 구조도

응집도 : 모듈 내부가 얼마나 강한 연관성으로 뭉쳐져 있는가? 응집도와 결합도는 서로 반비례함

결합도 : 모듈 사이의 상호 복잡도를 일컫는다.

응집도와 결합도의 종류 숙지 http://raisonde.tistory.com/entry/%EA%B2%B0%ED%95%A9%EB%8F%84Coupling%EA%B3%BC-%EC%9D%91%EC%A7%91%EB%8F%84Cohension

- 구조적 설계 기법 2가지 : 변환흐름 중심 설계, 트랜잭션흐름 중심 설계

변환흐름 중심 설계 : 정보를 받아들여 가공 처리한 후 그 결과를 외부세계에 출력하는 시스템을 이에 합당한 컴퓨터 구조로 매핑

트랜잭션흐름 중심 설계 : 설계에 들어온 입력을 여러 갈래의 출력흐름으로 쪼갤 수 있는 경우에 가능


- 소프트웨어 아키텍처

- 개념 : 소프트웨어 개발에 직간접적으로 영향을 미치고 복잡도를 높이는 다양한 요소들을 체계적으로 다루기 위한 개발 대상 소프트웨어의 청사진

- 설계절차 : 요구사항분석, 아키텍처 분석 및 설계, 아키텍처 검증 및 승인

- 유형 : 저장소, MVC, C-S, 계층 구조

- 설계표현방법

- 컨텍스트 모델 : 요구사항 분석 초기 시스템과 외부환경의 경계를 정해야 함, 이 모델은 시스템과 외부 환경과의 인터페이스에 초점을 둠

- 컴포넌트 다이어그램 : 잘 만들어진 부품을 사다가 조립하여 만들 수 있도록 재사용 가능한 부품을 컴포넌트라고함. 재사용해서 소프트웨어 개발 속도와 생산성 향상

- 패키지 다이어그램 : 다수의 사용자를 위해 개발된 상업용 소프트웨어를 패키지라 함. 서브시스템들 사이의 의존 관계를 나타낸 것임


- 객체지향 설계과정 키워드 : 객체, 클래스, 캡슐화, 상속, 다형성 연관, 집합 / 클래스, 속성, 관계, 연관, 오퍼레이션, 클래스 다이어그램 / 여러종류 다이어그램 / 싱글톤,메소드,파세이드,스트래티지 패턴

객체지향 설계 5원칙 SOLID

1. SRP (단일 책임의 원칙) : 하나의 클래스는 하나의 메소드만을 갖게 됨에 따라 수정에 대한 이유는 한가지여야 한다.

2. OCP (개방 폐쇄의 원칙) : 하나의 클래스는 수정에는 폐쇄되어 있고, 확장에는 개방되어 있어야 한다.

3. LSP (리스콮 치환의 원칙) : 상속의 가장 중요한 원칙, 하위클래스는 언제나 상위클래스로 참조가 가능해야 한다.

4. ISP (인터페이스 분리의 원칙) : 사용자 별로 다른 방식의 인터페이스를 제공해야 한다.

5. DIP (의존성 역전의 원칙) : 인터페이스를 통한 추상화를 통해 최대한 느슨하게 설계하자는 원칙 (리눅스 의존성 문제같은거)

- 객체는 독립적으로 존재하는 실세계의 사물, 클래스는 유사한 객체들의 모임

- 캡슐화 : 정보 은닉을 통한 추상화, 독립성 향상을 얻을 수 있는 방법, 속성과 오퍼레이션을 함께 묶어 보호하려는 방법.

- 상속 : 상위 클래스의 속성이 하위 클래스에 상속(inheritance)된다.

- 다형성 : 동일한 이름의 오퍼레이션일지라도 클래스에 따라 다르게 동작한다.


- 정적 모델링과 동적 모델링

- 정적 모델링 : 시간의 개념이 개입되지 않은 객체의 정적인 정보를 밝히는 것

- 동적 모델링 : 시스템을 구성하는 객체의 상태나 동작의 변화 혹은 객체들 사이의 상호 작용에 관심을 두고 클래스들의 오퍼레이션을 찾는 과정.


- 디자인 패턴 : 소프트웨어를 설계할 때 특정 상황에서 자주 사용하는 패턴을 정형화한 것, 좋은 소프트웨어 설계를 위한 개발자들의 경험적 산물.

- 싱글톤 패턴 : 객체의 생성과 관련된 패턴으로써 특정 클래스의 인스턴스가 오직 하나임을 보장(클래스의 객체를 한 객체로 제한), 이 인스턴스에 접근할 수 있는 방법을 제공

- 팩토리 메소드 패턴 : 객체를 생성하기 위한 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생설할지에 대한 결정은 하위 클래스에서 이루어지도록 인스턴스 생성의 책임을 미룸.

- 파세이드 패턴 : 시스템의 복잡성을 줄이기 위해 서브시스템을 구조화하고 서브시스템으로의 접근을 하나의 파세이드 객체로 제공하는 패턴

- 스트래티지 패턴 : 다양한 알고리즘을 각각 하나의 클래스로 캡슐화하여 알고리즘을 대체가 가능하도록 한 것.


- 사용자 인터페이스 설계원리 핵심 키워드 : UI/UX , HCI, GUI

- UI(:User Interface) : 일관성 필요, 사용자 중심 설계, 피드백, 파괴적인 행동에 대한 확인

- HCI(:Human Computer Interaction) : 모든 시스템은 기능 수행부분과 인터페이스 연계부분으로 나눌 수 있음, 사용자 관점에서 인터페이스는 사용자와 컴퓨터간의 대화 방식 즉 사용자에 대한 소프트웨어의 입출력 언어이다.

- GUI(:Graphic User Interaction) : 윈도우를 사용하는 경우 동시다발적으로 정보를 볼 수 있으며 사용자들이 화면을 교환하며 볼 수 있다.

- 코드 재사용 및 리팩토링 : 어떤 시점에 쓰여진 프로그램의 일부 또는 전부를 사용하는 것.

- 코드 스멜(code smell) : 코드의 가독성이 낮거나 중복된 로직을 의미

- 발생원인 : 가독성이 낮은 프로그램, 중복된 로직(복붙), 복잡한 조건문(과도한 case문)

- 소프트웨어 테스팅 : 어플리케이션 또는 시스템 동작과 성능,안정성이 사용자나 고객의 요구수준에 만족하는지 확인 및 검증하는 것

- 명세기반, 구조기반, 경험기반의 테스팅 기법이있음

- 화이트박스 : 구조적, 코드기반 테스트기법 / 단위 테스팅에서 주로 사용되고, 테스트가 가능한 소프트웨어 내에서 결함을 찾고 기능 검증

- 블랙박스 : 기능 또는 명세기반 테스트 / 주로 시스템 테스팅에서 사용되고 기능 및 비기는 요구사항을 모두 검증한다.(동등 분할, 경계값 분석 등)

- 소프트웨어 유지보수 : SDLC의 마지막 단계로 소프트웨어의 생명을 연장시키는 운영 중심의 작업단계

절차 : 현행 S/W이해 -> 요구사항 분석 -> 영향범위 파악 및 수정 -> 테스트/유지보수

역공학과 재공학, 재사용 ( 소프트웨어 3R )

- 역공학(Reverse Engineering) : 소프트웨어 공학의 한 분야로 이미 만들어진 시스템을 역으로 추적하여 처음의 문서나 설계기법 등의 자료를 얻어냄.(분석 -> 설계단계 -> 요구사항 분석 / 순공학 반대)

- 재공학 : 역공학으로 재구조화된 소프트웨어를 기반으로 다시 추상개념으로 현실화 한 것

- 재사용 : 재공학을 통해 구현 및 사용중인 소프트웨어의 사용


- 소프트웨어 형상관리 (SCM) : 소프트웨어의 개발 과정에서 소프트웨어 변경 사항을 관리하기 위해 개발된 일련의 활동 즉 개발 시점부터 유지보수가 이루어지는 단계까지 발생되는 모든 구성 요소들의 변경이력에 관련된 행동들에 대한 관리

- 형상관리활동 : 식별 -> 통제 -> 감사 -> 기록

- 서브버전(SVN) : 오픈 소프트웨어 버전 관리 시스템이다. C-S모델을 따른다.

- 분산형 저장소(git) : 클라이언트가 마지막 Snapshot을 직접 다운받지 않고 저장소 전부를 복제한다.

- TFS(Team Foundation Server) : 보고, 요구 사항 관리, 프로젝트 관리, 등 기능을 제공하는 MS제품 비쥬얼 스튜디오나 이클립스 백엔드로 사용할 때 최상의 성능


- 소프트웨어 품질관리 : 어플리케이션 생명주기 동안에 이루어지는 모든 활동과 활동 결과로 작성되는 산출물에 대한 품질을 통제하고 보증하기 위한 활동


- 애자일(Agile) : 문서작업 및 설계에 집중하던 개발 방식에서 벗어나 좀 더 프로그래밍에 집중하는 개발 방법론이다.

- 애자일 개발 방법론 XP(eXtreme Programming)

- 스크럼(SCRUM) : 프로젝트 관리를 위한 애자일 방법론으로서 추정 및 조정 기반의 경험적 관리기법의 대표적인 형태.

제품 책임자 : 백로그를 만들고 우선순위를 조정하거나 새로운 항목을 추가

스크럼 마스터 : 팀의 업무 방해요소 제거

스크럼 팀 : 5~9명으로 구성됨

- 스크럼 프로세스 산출물

제품 백로그 : 제품에 담고자하는 기능의 우선순위를 정리한 목록

스프린트 백로그 : 하나의 스프린트 동안 개발할 목록. 

소멸 차트 : 개발 완료까지 남은 작업량을 보여주는 그래프

- 모바일 컴퓨팅 특징 : 편재성, 접근성, 보안성, 편리성, 위치 확인성, 즉시 연결성, 개인화 가능성


- 그리드 컴퓨팅과 클라우드 컴퓨팅 : 그리드 컴퓨팅은 인터넷 상의 모든 컴퓨터 자원을 사용하지만, 클라우드는 사업자 사유 컴퓨팅만 사용(중앙에서 단일 조직이 관리)

- 클라우드 서비스 유형

Iaas : 서버 호스팅 같은 거

Paas : 플랫폼 제공

Saas : 소프트웨어 제공 (범위 넓)


- 하이퍼바이저 : 물리적인 서버를 가상화하는 기술 (vitual box, vmware 등)


Q. 서버 가상화 기술은 방식에 따라서 전가상화 반가상화가 있다. 커널을 수정해야 하는 방식을 선택하고 장점을 설명하라.

- 반가상화 : 운영체제가 자원을 제어하는 것이 아니라 하이퍼바이저가 직접 자원을 제어하기 때문에 속도가 빠르다.

- 소프트웨어 제품 라인 공학을 적용할 경우 얻을 수 있는 효과

- 품질 개선, 생산성 향상, 기술 내재화, 제품 출시 기간 절약

'흑역사 > TOPCIT' 카테고리의 다른 글

[TOPCIT] 03. 네트워크와 보안  (0) 2018.07.27
[TOPCIT] 02. 데이터베이스 정리  (0) 2018.07.27

그대로 출력하기

https://www.acmicpc.net/problem/11718


입력

입력이 주어진다. 입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다. 각 줄은 100글자를 넘지 않으며, 빈 줄은 주어지지 않는다. 또, 각 줄은 공백으로 시작하지 않고, 공백으로 끝나지 않는다.

출력

입력받은 그대로 출력한다.


1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
void main() {
    int a;
    while (1)
    {
        a = getchar();
ㅇ        if (a == EOF) break;
        putchar(a);
    }
}
cs

getchar와 putchar EOF 개념 이해

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
void main() {
    int a;
    while (1)
    {
        a = getchar();
        if (a == EOF) break;
        putchar(a);
    }
}
cs


'흑역사 > 백준 알고리즘' 카테고리의 다른 글

[Algorithm] 백준 2439 별찍기-2  (0) 2018.07.27
[Algorithm] 백준 1002번 터렛  (0) 2018.07.27
[Algorithm] 백준 10172번 개  (0) 2018.07.19


문제 원본 : https://www.acmicpc.net/problem/10172


문제

아래 예제와 같이 개를 출력하시오.

입력

없음.

출력

개를 출력한다.

예제 입력 1 

예제 출력 1 

|\_/|
|q p|   /}
( 0 )"""\
|"^"`    |
||_/=\\__|


특수문자 "와 \ 쓸때 앞에 \ 붙여줘야 함

1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main() {
    printf("|\\_/|\n");
    printf("|q p|   /}\n");
    printf("( 0 )\"\"\"\\\n");
    printf("|\"^\"`    |\n");
    printf("||_/=\\\\__|");
}
cs


2018.02. Cisco CCNP 취득(도움 받은 블로그 : http://cafe.naver.com/sdk800402)


2018.05.25 정보처리기사 취득


~ing

+ Recent posts