스크럼 : 팀이 중심이 되어 개발의 효율성을 높이는 기법
스프린트(Sprint) : 실제 개발 작업을 진행하는 과정으로, 보통 2~4주 정도의 기간 내에서 진행함
XP(eXtreme Programming) : XP는 수시로 발생하는 고객의 요구사항에 유연하게 대응하기 위해 고객의 참여와 개발 과정의 반복을 극대화하여 개발 생산성을 향상시키는 방법
리팩토링(Refactoring) :
기존 코드를 기능 변경 없이 구조나 디자인을 개선하는 과정
데이터베이스 관리 시스템(DBMS; DataBase Management System)
사용자와 데이터베이스 사이에서 사용자의 요구에 따라 정보를 생성해 주고, 데이터베이스를 관리해 주는 소프트웨어 이다.
웹 애플리케이션 서버(WAS; Web Application Server)
사용자의 요구에 따라 변하는 동적인 콘텐츠를 처리하기 위해 사용되는 미들웨어이다.
요구사항 개발 프로세스(출.석.명.확)
도출(Elicitation) -> 분석(Analysis) -> 명세(Specification) -> 확인(Validation)
요구사항 도출은 시스템, 사용자, 개발자 등 시스템 개발에 관련된 사람들이 서로 의견을 교환하여 요구사항을 어떻게 수정할 것인지를 식별하고 이해하는 과정이다.
프로토타이핑(Prototyping)
프로토타이핑은 프로토타입(견본품)을 통해 효과적으로 요구 분석을 수행하면서 명세서를 산출하는 작업으로, 가장 단순한 형태는 설명을 위해 종이에 대략적인 순서나 형태를 그려 보여주는 것이다.
요구사항 명세에서 기능 요구항은 빠짐없이 기록하지만, 비기능 요구사항은 필요한 것만 기술한다.
자료 흐름도(DFD)

요구사항 분석용 CASE(자동화 도구)
요구사항 분석용 CASE는 요구사항을 자동으로 분석하고, 요구사항 분석 명세서를 기술하도록 개발된 도구를 의미한다.
대표적인 요구사항 분석용 CASE
HIPO(Hierarchy Input Process Output)
UML(Unified Modeling Language)
unified : 통일된
UML은 시스템 분석, 설계, 구현 등 시스템 개발 과정에서 시스템 개발자와 고객 또는 개발자 상호 간의 의사소통이 원활하게 이루어지도록 표준화한 대표적인 객체지향 모델링 언어이다.
UML 구성 요소
사물(Things)

관계(Relationships)

연관 관계

집합(Aggregation) 관계

전체(whole)와 부분(part)로 나누어 지며, 비어있는 다이아몬드가 있는 쪽이 전체이다. 해당 내용을 보면 school에는 student와 teacher가 있으며, student와 teacher은 다른 school로 갈 수 있다.
포함(Composition) 관계

포함 관계는 집합 관계의 특수한 형태로, 포함하는 사물의 변화가 포함되는 사물에게 영향을 미치는 관계이다.
일반화(Generalization) 관계

일반화 관계는 하나의 사물이 다른 사물에 비해 더 일반적이거나 구체적인 관계이다.
예를 들어 사람은 여자와 남자보다 일반적인 개념이고, 반대로 여자와 남자는 사람보다 구체적인 개념이다.
의존(Dependency) 관계

사람은 자동차를 이용하여서 출퇴근을 한다. 이 경우 보통 같은 자동차를 이용한다. 하지만 자동차에 주유를 할 때, 특정 주유소에 있는 특정 주유기만을 사용하지 않는다. 이 같이 주유 서비스를 받을 때마다 달라지는 주유기같은 것을 의존 관계로 표현한다.
의존 관계는 연간 관계와 같이 사물 사이에 서로 연관은 있으나 필요에 의해 서로에게 영향을 주는 짧은 시간 동안만 연관을 유지하는 관계이다.
하나의 사물과 다른 사물이 소유 관계는 아니지만 사물의 변화가 다른 사물에도 영향을 미치는 관계이다.
영향을 받는 사물(이용자)이 영향을 주는 사물(제공자) 쪽으로 점선 화살표를 연결하여 표현하다.
실체화(Realization) 관계

비행기는 날 수 있고 새도 날 수 있다. 그러므로 비행기와 새는 날 수 있다는 행위로 그룹화 할 수 있다.
사람, 자동차, 컴퓨터, 동물 등과 같이 우리 주위에서 사용되는 물질적이거나 개념적인 것을 개체(Entity)라고 한다. 이러한 개체를 컴퓨터 내부에 추상적으로 표현한 것을 사물(Things) 또는 객체(Object)라고 하느데, 다이어그램을 표현할 때는 사물보다는 객체라는 표현을 주로 사용한다.
다이어그램(Diagram)
UML 다이어그램 종류

클래스 다이어그램

클래스, 인터페이스, 추상 클래스 등 객체 지향 프로그래밍에서 사용되는 모든 요소를 보여준다. 3개의 직사각형으로 구성되며 맨 위부터 이름, 속성, 메소드가 명시되어 있다.
속성은 클래스의 상태를 나타내며 메소드는 클래스가 수행할 수 있는 작업을 나타낸다. 또한 클래스와 클래스 간의 관계는 일반적으로 상속, 연관, 집합, 의존 등으로 표현한다.
다중성 표시 방법

객체 다이어그램

클래스 다이어그램과 유사하지만, 클래스 간의 관계를 보여주는 클래스 다이어그램과 달리 객체 다이어그램은 객체 간의 관계를 보여준다. 이는 객체 간의 상호작용을 파악할 수 있다.
상태 다이어그램(기출 문제)

스테레오 타입(Stereotype) is not 고정관념
컴포넌트(Component)
컴포넌트는 문서, 소스코드, 파일 라이브러리 등과 같은 모듈화된 자원으로, 재사용이 가능하다.
인터페이스
클래스나 컴포넌트의 저체 또는 일부분의 동작(Operation)을 모아 놓은 것이며, 클래스가 외부적으로 가시화되는 행동을 표현한다.
관계(Relationship)







활동(Activity) 다이어그램

스윔레인(Swim Lane)
액티비티 수행을 담당하는 주체를 구분하는 선
가로 또는 세로 실선을 그어 구분한다.수영 경기장에서 각 선수별로 레인을 지정하여 해당 레인 안에서만 경기를 진행하도록 구분하는 것처럼 활동 다이어그램에서 사용되는 스윔레인도 액터나 시스템별로 처리 흐름이 진행되는 부분을 구분하기 위한 구분선이다.
객체지향 방법론의 구성 요소
객체지향 방법론의 기본 원칙
컴포넌트(Component)
문서, 소스코드, 파일, 라이브버리 등과 같은 모듈화된 자원으로, 재사용이 가능하다.
컴포넌트 기반(CBD) 방법론
컴포넌트를 조합하여 하나이 새로운 애플리케이션을 만드는 방법론
소프트웨어 재사용 방법
추상화 형태로 써진 명세를 구체화하여 프로그램을 만드는 방법으로, 패턴 구성 방법이라고도 함소프트웨어 재사용과 재공학의 차이
재사용의 경우, 이미 개발되어 인정받은 소프트웨어를 다른 소프트웨어 개발이나 유지에 사용하는 것이며
재공학의 경우, 새로운 요구에 맞도록 기존 시스템을 이용하여 보다 나은 시스템을 구축하고, 새로운 기능을 추가하여 소프트웨어 성능을 향상시키는 것이다.
재사용 방법에는 합성 중심과 생성 중심이 있다.
CASE(Computer Aided Software Engineering)
CASE는 소프트웨어 개발 과정에서 사용되는 요구분석, 설계, 구현, 검사 및 디버깅 과정 전체 또는 일부를 컴퓨터와 전용 소프트웨어 도구를 사용하여 자동화하는 것이다.
CASE의 주요기능
- 소프트웨어 생명 주기 전 단계의 연결
- 다양한 소프트웨어 개발 모형 지원
- 그래픽 지원
CASE Tool(자동화 도구)
자동호 도구는 소프트웨어 공학과 관련된 직업 중에서 하나의 작업을 자동화하는 패키지를 의미한다
하향식 비용 산정 기법
하향식 비용 산정 기법은 과거의 유사한 경험을 바탕으로 전문 지식이 많은 개발자들이 참여한 회의를 통해 비용을 산정하는 비과학적인 방법이다.
산정 기법으로는 전문가 감정 기법, 델파이 기법이 있다
전문가 감정 기법의 경우 경험이 많은 두 명 이상의 전문가에게 비용 산정을 의뢰하는 기법이다.
델파이 기법의 경우 전문가 감정 기법의 주관적인 편견을 보완하기 위해 많은 전문가의 의견을 종합하여 산정하는 기법이다.
산정 기법으로는 LOC(원시 코드 라인 수), 개발 단계별 인월수 기법, 수학적 산정 기법이 있다.
LOC(원시 코드 라인 수, source Line of Code) 기법
계산 방법 : 예측치 = a+4m+b/6 (a:낙관치 b: 비관치, m:기대치(중간치))
개발 단계별 인월수(Effort Per Task) 기법
LOC 기법에 의하여 소프트웨어 개발에 소요되는 노력이 40PM(Programmer-Month)으로 계산되었다. 개발에 소요되는 기간이 5개월이고, 1인당 인건비가 100만원 이라면, 이 프로젝트에 소요되는 개발 비용은 얼마인지 구하시오
개발 비용 = 노력(인월)x단위 비용(1인당 월평균 인건비)
40 x 1,000,000 = 40,000,000
수학적 산정 기법
COCOMO(COnstructive COst MOdel)
COCOMO의 소프트웨어 개발 유형
조직형(Organic Mode)
cf.. KDSI : 전체 라인수를 1,000라인 단위로 묶은 것(=Kilo LOC)
반분리형(Semi-Detached Mode)
내장형(Embedded Mode)
COCOMO 모형의 종류
기본형, 중간형, 발전형이 있다
Putnam 모형
Putnam 모형은 소프트웨어 생명 주기의 전 과정 동안에 사용될 노력의 분포를 예상하는 모형이다.
Putnam(푸트남)이 제안하였으며, Rayleigh-Norden 곡선의 노력 분포도를 기초로 한다. 또한, 개발 기간이 늘어날수록 프로젝트의 적용 인원의 노력이 감소한다.
기능 점수(FP, Function Point) 모형
기능 점수 모형은 소프트웨어의 기능을 증대시키는 요인별로 가중치를 부여하고, 요인별 가중치를 합산하여 총 기능 점수를 산출하며, 총 기능 점수와 영향도를 이용하여 기능 점수(FP)를 구한 후 이를 이용해서 비용을 산정하는 기법이다.
SLIM
Rayleigh-Norden 곡선과 Putnam 예측 모델을 기초로 하여 개발된 자동화 추정 도구
PERT 차트

프로젝트에 필요한 전체 작업의 상호 관계를 표시하는 네트워크로, 작업들간의 상호 관련성, 결정 경로, 경계 시간, 자원 할당 등을 제시하는 프로젝트 일정 계획 기법이다.
간트 차트

프로젝트 관리(Project Management)
일정 관리, 비용 관리, 인력 관리, 위험 관리, 품질 관리가 있다
CMMI(Capability Maturity Model Integration)
기.관.정.량.화SPICE
소프트웨어 개발 표준 중 정보 시스템 분야에서 소프트웨어의 품질 및 생산성 향상을 위해 소프트웨어 프로세스를 평가 및 개선하는 국제 표준으로, 공식 명칭은 ISO/IEC 15504인 것.
소프트웨어 개발 프레임워크
소프트웨어 개발 프레임워크 특성
cf. 다형성 : 하나의 인터페이스나 타입을 통해 여러 다른 형태의 객체를 참조하고 조작할 수 있는 기능
디자인 패턴(Design Pattern) 이란?
디자인 패턴은 개발하면서 발생하는 반복적인 문제들을 어떻게 해결할 것인지에 대한 해결 방안으로 실제 현업에서 비즈니스 요구 사항을 프로그래밍으로 처리하면서 만들어진 다양한 해결책 중에서 많은 사람들이 인정한 모범 사례(Best Practice) 이다.
이러한 디자인 패턴은 객체 지향 4대 특성(캡슐화, 상속, 추상화, 다형성)과 설계 원칙(SOLID)을 기반으로 구현되어 있다.

Command(커맨드 패턴) : 요청을 객체로 캡슐화하여 요청을 매개변수화 하고, 요청을 큐에 저장하거나 로깅하고 실행을 지연시킨다.
Interpreter(인터프리터 패턴) : 언어나 문법에 대한 해석기를 제공하여, 주어진 언어로 표현된 문제를 해결하는 패턴이다.
Iterator(이터레이터 패턴) : 컬렉션 내의 요소들에 접근하는 방법을 표준화하여 컬렉션의 내부 구조에 독립적으로 접근할 수 있는 패턴이다. -> 순차적 접근
Mediator(중재자 패턴) : 객체 간의 상호 작용을 캡슐화하여, 객체 간의 직접적인 통신을 방지하는 패턴이다.
Observer(옵저버 패턴) : 객체 간의 일대다 종속 관계를 정의하여 한 객체의 상태 변경이 다른 객체들에게 알려지도록 한다.
Visitor(방문자) : 각 클래스들의 데이터 구조에서 처리 기능을 분리하여 별도로 구성함으로써, 클래스를 수정하지 않고도 새로운 연산의 추가가 가능함
Stratege(전략 패턴) : 알고리즘을 정의하고, 실행 중에 선택할 수 있게 한다.
State(상태 패턴) : 객체의 상태를 캡슐화하고, 상태 전환을 관리한다.
Chain of Responsibility(책임 연쇄 패턴) : 요청을 보내는 객체와 이를 처리하는 객체를 분리하여, 다양한 처리자 중 하나가 요청을 처리한다
Memento(메멘토(기억/기념) 패턴) : 객체의 내주 상태를 저장하고 복원할 수 있는 기능을 제공하는 패턴이다
Template Method(템플릿 메서드 패턴) : 알고리즘의 구조를 정의하면서 하위 클래스에서 각 단계의 구현을 제공하는 디자인 패턴이다.
구문 or 문장 커버리지
분기 or 결정 커버리지
조건 커버리지(분기 커버리지 하위)
조건/결정 커버리지

비밀키(개인키)와 공개키의 차이
웹 서버
웹 브라우저 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램
웹 서버란, 사용자가 웹 브라우저(Chrome)에서 어떠한 페이를 요청하면 웹 서버에서 그 요청을 받아 정적 컨텐츠를 제공하는 서버이다. 여기서 정적 컨텐츠란 단순 HTML 문서, CSS, Javascript, 이미지, 파일 등 즉시 응답 가능한 컨텐츠 이다.
그렇다면, 웹 서버는 정적만 제공하냐?
-> 그것은 아니다. 웹 서버가 동적 컨텐츠를 요청 받으면 WAS에게 해당 요청을 넘겨주고, WAS에서 처리한 결과를 사용자에게 전달해주는 역할도 한다.

WAS
인터넷 상에서 HTTP 프로토콜을 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행하는 미들웨어로서, 주로 동적 서버 컨텐츠를 수행하는 것으로 웹 서버와 구별이 되며, 주로 데이터베이스 서버와 같이 수행한다.
WAS는 웹 서버와 웹 컨테이너가 합쳐진 형태로, 웹 서버 단독으로 처리할 수 없는 데이터베이스의 조회나 다양한 로직 처리가 필요한 동적 콘텐츠를 제공한다. 덕분에 사용자의 다양한 요구에 맞춰 웹 서비스를 제공할 수 있다. WAS는 JSP, Servlet 구동환경을 제공해주기 때문에 웹 컨테이너 혹은 서블릿 컨테이너 라고도 불린다.

💡 그렇다면 WAS만 써도 되겠네!? 답은 (❌)
WAS는 DB조회 및 다양한 로직을 처리하는데 집중해야 해서 단순한 정적 컨텐츠는 웹 서버에서 맡기며 기능을 분리시켜 서버 부하를 방지해야해. 만약 WAS가 정적 콘텐츠 요청까지 처리하면, 부하가 커지고 동적 콘텐츠 처리가 지연되면서 수행 속도가 느려지고 이로 인해 페이지 노출 시간이 늘어나는 문제가 발생하여서 효율성이 크게 떨어져
웹 서버를 WAS 앞에 두고 필요한 WAS들을 Web Server에 플러그인 형태로 설정하면 더욱 효율적인 분산 처리가 가능하다
많은 사람들이 모여 작업을 수행하다 보면 같은 대상물을 보고도 서로 다르게 표현하여 의사소통에 문제가 생기는 경우가 있다. 이러한 문제를 해결하기 위해 공통된 표현 방법을 만들어서 사용하는 것이다.
UML은 공통된 표현법을 사용하는 개발할 대상물을 다이어그램으로 표현하는 도구이다.
클래스는 객체를 생성하기 위한 설계도 또는 템플릿이고, 객체는 클래스에 의해 생성된 실체 또는 인스턴스이다. 클래스는 객체의 속성(데이터)과 행동(메서드)을 정의하며, 객체는 이러한 정의를 기반으로 메모리에 할당되어 실제 사용되는 개체를 의미한다.
클래스 : 붕어빵 틀
객체(인스턴스) : 붕어빵 -> 객체 하나하나를 인스턴스라고 부르며, 대체로 객체와 인스턴스는 혼용해서 표현한다.
인스턴스는, 클래스 기준에서 생성된 것으로 어떤 클래스에서 파생되었는지를 강조할때 사용한다.
객체들이 가질 수 있는 속성과 동작을 추상적으로 표현한 것이 클래스(Class)이다.
액션(Action)은 더 이상 분해할 수 없는 단일 작업이고, 액티비티(Activity)는 몇 개의 액션으로 분리될 수 있는 작업이다.
- 시스템이나 객체들이 메시지를 주고받으며 시간의 흐름에 따라 상호 작용 하는 과정을 액터, 객체, 링크, 메시지 등의 요소를 사용하여 그림으로 표현한 것이다
- 동작에 참여하는 객체들이 주고받는 메시지를 표현하는데 메시지뿐만 아니라 객체들 간의 관계까지 표현한다
- 클래스 다이어그램에서 관계가 제대로 표현됐는지 점검하는 용도로도 사용된다.
- 초기에는 협업(Collaboration) 다이어그램이라고 불렸다
커뮤니케이션(Communication) 다이어그램
링크(Link)
소프트웨어 재공학은 기존 시스템을 이용하여 보다 나은 시스템을 구축하고, 새로운 기능을 추가하여 소프트웨어 성능을 향상시키는 것이다.
델파이 기법
소프트웨어 프로젝트 관리는 주어진 기간 내에 최소의 비용으로 사용자를 만족시키는 시스템을 개발하기 위한 전반적인 활동이다.
CMMI는 소프트웨어 개발 조직의 업무 능력 및 조직의 성숙도를 평가하는 모델
소프트웨어 개발 방법론 테일러링은 소프트웨어 개발 방법론의 절차, 사용기법 등을 수정 및 보완하는 작업이다.
소프트웨어 개발 프레임워크 중 EJB(Enterprise JAVA Beans) 기반의 복잡함과 무거움을 극복하고 개발 생산성 향상과 고품질의 시스템 개발을 위한 자바 플랫폼상의 경량화된 오픈 소스 웹 애플리케이션 프레임워크
CHAR은 항상 지정된 크기만큼 기억 장소가 확보되고 VARCHAR은 기억 장소의 크기가 지정되어도 필드에 저장된 데이터만큼만 기억 장소가 확보된다.
인덱스는 검색 시간을 단축시키기 위해 만든 보조적인 데이터 구조이다.
인덱스 키의 순서에 따라 데이터가 정렬되어 저장되는 방식이다. 실제 데이터가 순서대로 저장되어 있어 인덱스를 검색하지 않아도 원하는 데이터를 빠르게 찾을 수 있다. 하지만 데이터 삽입, 삭제 발생 시 순서를 유지하기 위해 데이터를 재정렬 해야한다.
트랜잭션(Transaction)은 데이터베이스에서 여러 작업(명령어)들을 하나의 묶음으로 처리하는 단위이다. 쉽게 말해, 여러 개의 작업을 한 번에 처리하고 그 결과가 모두 성공해야만 실제로 데이터에 반영되도록 만드는 기능이다.
ex. 예를 들어 은행에서 돈을 이체할 때,
1. 내 계좌에서 돈을 빼고
2. 친구 계좌에 돈을 넣는
두 가지 작업이 동시에 이루어져야 한다. 만약 한 작업만 성공을 하고 나머지는 실패하면 문제가 발생한다. 이 두 작업을 묶어서 '둘 다 성공해야만 실제로 처리한다'는 약속이 바로 트랜잭션이다.
즉 트랜잭션은 COMMIT 되거나 ROLLBACK 되어야 한다
신뢰성 있는 연결을 위해 송신지(보내는 곳)와 수신지(받는 곳) 간의 통신에 앞서 3단계에 걸친 확인 작업을 수행한 후 통신을 수행한다.
- 1단계 : 송신지에서 수신지로 'SYN' 패킷을 전송
- 2단계 : 수신지에서 송신지로 'SYN' + 'ACK' 패킷을 전송
- 3단계 : 송신지에서 수신지로 'ACK' 패킷을 전송
SYN 패킷의 경우 연결 요청을 의미하는 패킷이다.

여러 객체를 묶은 기능 단위 블록
Q. 소프트웨어 개발 방법론 중 프로토타입 모형(Prototype Model)에 대해 간략히 서술
A. 프로토타입은 개발될 소프트웨어에 대한 견본품을 만들어 최종 결과물을 예측
Q. 요구공학(Requirement Engineering)의 개념을 간략히 서술하시오
A. 요구공학은 요구사항을 정의하고, 분석 및 관리하는 프로세스를 연구하는 학문
Q. 정형화된 분석 절차에 따라 사용자 요구사항을 파악, 문서화하는 체계적 분석방법으로 자료흐름도, 자료사전, 소단위명세서의 특징을 갖는 것은?
구조적 개발 방법론
-> 정형화된 분석 절차가 나오면, 구조적 개발 방법론이다.
-> 특징으로는, 분할과 정복(Divide and Conquer)이다.
ex. 6의 약수 1,2,3,6 중 자신을 제외한 1,2,3을 모두 더하면 6이 된다.
#include <stdio.h>
main() {
int s, el = 0;
for (int i = 6; i<=30; i++) { // i는 6부터 30까지
s = 0;
for (int j=1; j <=i/2; j++)
if(i%j == 0)
s = s + j;
if(s==i)
el++;
}
printf("%d", el);
}
한 번만 생성되고, 계속 그 하나만 쓰는 객체
class Connection {
private static Connection _inst = null; // 전역에서 딱 1개만 존재하는 인스턴스
private int count = 0; // 호출 횟수 저장하는 변수
public static Connection get() {
if (_inst == null) { // 아직 생성되지 않았다면
_inst = new Connection(); // 새로 만들어서
}
return _inst; // 항상 같은 인스턴스를 반환
}
public void count() { count++; } // count를 1 증가
public int getCount() { return count; } // count 값을 리턴
}
public class Test {
public static void main(String[] args) {
Connection conn1 = Connection.get(); // 새 객체 생성됨
conn1.count(); // count = 1
Connection conn2 = Connection.get(); // 기존 객체 재사용
conn2.count(); // count = 2
Connection conn3 = Connection.get(); // 기존 객체 재사용
conn3.count(); // count = 3
conn1.count(); // count = 4
System.out.print(conn1.getCount()); // 4 출력
}
}
1부터 100까지의 '완전수'를 찾아서 더하는 프로그램
1부터 100사이의 완전수는 '6'과 '28'이 있다
#include <stdio.h>
int isPerfectNum(int num) {
int sum = 0;
for (int i =1; i<num; i++) {
if (num % i == 0)
sum += i;
}
if (num==sum) return 1
else return 0
}
main() {
int r = 0;
for (int i = 1; i <= 100; i++)
if (isPerfectNum(i))
r+= i;
printf("%d", r);
}
public static String get() {
return name;
} 부분에서 오류 발생정적 메서드에서 일반 변수(name)을 쓸 수 없다
class Person {
private String name;
public Person(String val) {
name = val;
}
public static String get() {
return name;
}
public void print() {
System.out.println(name);
}
}
public class Test {
public static void main (String[] args) {
Person obj = new Person("Kim");
obj.print();
}
}