정처기 실기 이론: 소프트웨어 설계
정처기 실기

정처기 실기 이론: 소프트웨어 설계

작성일: 2026년 07월 12일2

애자일이란?

절차보다 사람이 중심이 되어 변화에 유연·신속하게 적응하는 신속 적응적 경량 개발 방법론. 짧은 주기(이터레이션 1~4주)로 동작하는 소프트웨어를 만들고 고객 피드백을 다음 주기에 반영.

워터폴 vs 애자일

구분워터폴애자일
진행 방식단계별 순차 진행짧은 반복(이터레이션)
변경 대응후반부 변경 어려움매 주기 요구사항 반영 가능
산출물단계별 문서 중심동작하는 소프트웨어 중심
적합한 프로젝트요구사항 명확·변동 적음요구사항 변경 잦고 불확실성 큼

대표 애자일 프레임워크

프레임워크핵심
스크럼(Scrum)스프린트(2~4주), 데일리 스크럼, 백로그
XP(eXtreme Programming)페어 프로그래밍, TDD, 지속적 통합
칸반(Kanban)작업 흐름 시각화, WIP(진행 중 작업) 제한
린(Lean)낭비 제거, 빠른 가치 전달
시험 팁: "신속 적응적 경량", "워터폴 대비" 키워드가 나오면 정답은 애자일.

요구사항 구분

구분의미예시
기능(Functional) 요구사항시스템이 제공해야 하는 기능·서비스로그인 기능, 장바구니·결제 기능
비기능(Non-functional) 요구사항기능 외에 갖춰야 할 품질·환경·제약 조건응답 1초 이내, 리눅스에서도 동작

비기능 요구사항 6가지 유형

유형핵심 키워드
품질(Quality)신뢰성·가용성·유지보수성 (예: 가용성 99.9%↑)
운영(Operational)사용 환경(OS·플랫폼·언어)
자원(Resource)메모리·디스크·하드웨어 (예: 최소 8GB)
성능(Performance)응답 시간·처리량·동시 사용자 수
보안(Security)인증·인가·암호화 (예: 2단계 인증)
문화/정책(Cultural/Political)법규·관습·정책 준수 (예: 개인정보보호법)

응집도

응집도 유형핵심 키워드
기능적단일 목적
순차적이전 기능의 출력을 다음 기능의 입력으로 사용, 기능간의 의존성
통신적(교환적)동일한 입력 및 출력 데이터
절차적입출력 간 연관성은 없으나 순서에 따라 실행
시간적특정 시간에 함께 실행
논리적유사한 성격, 특정 분류
우연적아무런 관련이 없음

결합도

결합도 유형핵심 키워드
내용다른 모듈 내부 변수나 기능 직접 사용
공통전역 변수 참조 및 갱신
외부외부 데이터 형식, 통신 프로토콜 공유
제어제어 요소 전달
스탬프자료구조 전달
자료최소한의 데이터만 파라미터로 주고받음

SOLID란?

객체지향 설계에서 중요한 5가지 원칙. 소프트웨어의 유지보수성·확장성·재사용성을 높이기 위한 원칙.

원칙정의
SRP 단일 책임 원칙하나의 클래스는 하나의 책임만 가져야 한다(책임 분리)
OCP 개방-폐쇄 원칙확장에는 열려 있고, 수정에는 닫혀 있어야 한다
LSP 리스코프 치환 원칙서브타입은 언제나 기반 타입으로 교체할 수 있어야 한다
ISP 인터페이스 분리 원칙클라이언트는 사용하지 않는 메서드에 의존하면 안 된다
DIP 의존성 역전 원칙고수준·저수준 모듈 모두 추상화에 의존해야 한다

럼바우 모델링이란?

OMT(Object Modeling Technique)라고도 불리는 객체지향 분석·설계 방법론으로, 시스템을 3가지 관점에서 모델링한다.

암기 팁: 객·동·기 = 객체 · 동적 · 기능 모델링
모델링정의표현 방법
객체 모델링(Object) / 정보 모델링객체를 찾아 속성·연산·객체 간 관계를 정의(정적 구조)객체 다이어그램, ER 다이어그램
동적 모델링(Dynamic)시간 흐름에 따른 객체 간 제어 흐름·동작 순서를 표현상태 다이어그램, 시퀀스 다이어그램
기능 모델링(Functional)프로세스 간 자료 흐름 중심으로 처리 과정을 표현자료 흐름도(DFD)

디자인 패턴이란?

GOF(Gang of Four)가 객체지향프로그래밍(OOP)에서 반복적으로 등장하는 문제를 해결하기 위해 제안한 23가지 패턴

생성 패턴

싱글톤 (Singleton Pattern)

한 클래스에 단 하나의 객체만 존재하도록 강제하는 디자인 패턴. single이라는 단어에서 알 수 있듯, 인스턴스가 유일하다는 것이 핵심. 어디서든 참조가 가능하다는 것이 특징.

팩토리 메서드 (Factory Method Pattern)

객체 생성을 위한 인터페이스는 상위 클래스에서 정의하되, 실제로 어떤 클래스의 인스턴스를 만들지는 하위 클래스에서 결정하도록 하는 패턴.

빌더 (Builder Pattern)

복잡한 객체를 생성하는 과정을 단계별로 분리, 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 디자인 패턴. 특히 생성자의 매개변수가 많거나, 객체 생성 과정이 여러 단계로 나뉘어 복잡할 때 유용.

프로토타입 (Prototype Pattern)

기존 객체를 복제하여 새로운 객체를 생성하는 디자인 패턴. 원본 객체를 복사하여 필요한 부분을 수정한 뒤 사용하는 방식. 특히 객체 생성 비용이 비싸거나, 클래스로부터 객체를 만드는 과정이 복잡할 때 유용.

앱스트렉트 팩토리 (Abstract Factory Pattern)

추상 팩토리 패턴은 서로 관련이 있거나 의존적인 객체들의 집합을 생성하기 위한 인터페이스를 제공하되, 구체적인 클래스는 지정하지 않는 패턴. 팩토리 메서드 패턴이 단일 객체를 생성하는 것에 초점을 맞춘다면, 추상 팩토리는 '제품군(Family of Products)'을 생성하는 데 사용.

구조 패턴

어뎁터 (Adapter Pattern)

호환되지 않는 인터페이스를 가진 클래스들을 함께 동작하도록 변환해주는 패턴

데코레이터 (Decorator Pattern)

객체의 기존 코드를 수정하지 않고도 동적으로 새로운 기능이나 책임을 추가할 수 있게 해주는 패턴. 객체를 장식하여 기능을 확장하는 방식.

퍼사드 (Facade Pattern)

'건물의 정면'이라는 뜻으로, 복잡한 서브시스템에 대한 간단한 통합 인터페이스를 제공하는 패턴.

프록시 (Proxy Pattern)

다른 객체에 대한 접근을 제어하기 위해 그 객체의 대리자 역할을 하는 객체를 만드는 패턴.

브릿지 (Bridge Pattern)

'추상화'와 '구현'을 두 개의 독립적인 클래스 계층으로 분리하여, 이 둘이 서로에게 영향을 주지 않고 독립적으로 확장될 수 있도록 하는 패턴.

플라이웨이트 (Flyweight Pattern)

많은 수의 객체를 효율적으로 지원하기 위해 객체의 공유를 통해 메모리 사용량을 줄이는 패턴. '플라이웨이트'는 권투의 경량급을 의미하며, 이름처럼 객체를 가볍게 만들어 메모리 부담을 최소화

컴포지트 (Composite Pattern)

객체들을 트리 구조로 구성하여 '부분-전체' 계층을 표현하는 패턴. 클라이언트가 개별 객체(Leaf)와 복합 객체(Composite)를 동일한 방식으로 제어. ex) 파일 시스템의 폴더 및 파일에 대한 동일한 작업 수행.

행위 패턴 (전옵 중방이상인 메커책템)

전략 (Strategy Pattern)

전략 패턴은 알고리즘군을 정의하고, 각 알고리즘을 캡슐화하여, 필요에 따라 서로 교체해서 사용할 수 있게 만드는 패턴 ex) 실시간 최단 경로 찾기

옵저버 (Observer Pattern)

한 객체의 상태가 변하면, 그 객체에 의존하는 다른 객체들에게 자동으로 알림을 보내고 상태를 갱신할 수 있게 하는 1:N 의존성 관계를 정의하는 패턴

중재자 (Mediator Pattern)

많은 객체들 간의 복잡한 상호작용과 의존성을 하나의 중재자 객체에 캡슐화하여, 객체들이 서로 직접 통신하지 않고 오직 중재자를 통해서만 소통하도록 만드는 패턴 ex) 항공 관제탑

방문자 (Visitor Pattern)

데이터 구조(객체)와 해당 구조에서 수행할 처리(기능)를 분리하는 패턴 ex) 세무사 (여러 범위의 세금 처리를 방문하여 해결)

이터레이터 (Iterator Pattern)

배열, 리스트, 트리 등과 같은 컬렉션(Collection) 객체의 내부 표현(구조)을 외부에 노출시키지 않고, 그 요소들을 순차적으로 접근할 수 있는 방법 ex) TV 리모컨의 채널을 조작하는 버튼

상태 (State Pattern)

객체의 내부 상태가 변경될 때, 객체의 행동 방식도 함께 변경되도록 하는 패턴

인터프리터 (Interpreter Pattern)

특정 언어의 문법을 정의하고, 그 문법으로 작성된 문장을 해석하는 해석기(Interpreter)를 만드는 패턴

메멘토 (Memento Pattern)

객체의 내부 상태를 외부에 노출시키지 않으면서, 객체의 특정 시점 상태를 스냅샷처럼 저장해 두었다가 필요할 때 다시 복원할 수 있게 하는 패턴. ex) 게임 저장 기능

커맨드 (Commend Pattern)

요청 자체를 객체로 캡슐화하여, 요청을 보내는 객체(Invoker)와 요청을 실제로 처리하는 객체(Receiver)를 분리하는 패턴

책임 연쇄(Chain of Responsebility)

요청을 처리할 수 있는 객체들을 체인(사슬)으로 연결하여, 요청이 들어오면 체인을 따라 순서대로 처리 기회를 넘기는 패턴.

  • 독점적 처리: 체인을 따라가다 하나의 처리기가 요청을 처리하면 거기서 종료됩니다. (예: 승인/결재 시스템)
  • 포괄적 처리: 하나의 요청을 여러 처리기가 모두 순차적으로 처리합니다. (예: 웹 프레임워크 미들웨어)
  • 템플릿 메서드 (Template Method)

    알고리즘의 골격(뼈대)은 상위 클래스에서 정의하고, 알고리즘의 특정 단계들은 하위 클래스에서 재정의(override)할 수 있도록 하는 패턴 ex) 라면 끓이기

    생성 패턴 두음: 싱팩빌프앱

    "싱글 팩토리 빌드 프로토스 앱"

  • : 싱글톤(Singleton)
  • : 팩토리 메서드(Factory Method)
  • : 빌더(Builder)
  • : 프로토타입(Prototype)
  • : 앱스트랙트 팩토리(Abstract Factory, 추상 팩토리)
  • 생성 패턴기출 키워드
    싱글톤객체 하나만 생성, 어디서든 참조, 인스턴스가 오직 하나임을 보장
    팩토리 메서드상위 클래스=인터페이스만 정의, 서브 클래스=실제 생성 담당
    빌더조립 + 분리
    프로토타입인스턴스를 복제
    앱스트랙트 팩토리조합을 만드는 인터페이스(API) 제공, Kit이라고 불림

    구조 패턴 두음: 어데퍼프브플컴

  • : 어댑터(Adapter) / : 데코레이터(Decorator) / : 퍼사드(Facade) / : 프록시(Proxy) / : 브리지(Bridge) / : 플라이웨이트(Flyweight) / : 컴포지트(Composite)
  • 구조 패턴기출 키워드
    어댑터서로 다른 인터페이스 연결, 기존 클래스를 재사용하도록 맞춰주는 역할
    데코레이터기능 추가 + 확장
    퍼사드단순 인터페이스 제공
    프록시객체의 대리자가 대신 처리
    브리지기능 클래스-구현 클래스 연결, 추상 계층 분리
    플라이웨이트가상 인스턴스 / 공유로 메모리 절약
    컴포지트트리구조, 복합 객체 = 단일 객체

    행위 패턴: 전략·옵저버·중재자·방문자·이터레이터·상태·인터프리터·메멘토·커맨드·책임연쇄·템플릿메서드

    행위 패턴기출 키워드
    전략알고리즘군을 캡슐화해 교체 가능하게
    옵저버한 객체가 바뀌면 의존하는 다른 객체에 자동 갱신 통보
    중재자객체 간 중재자를 두어 상호작용을 캡슐화
    방문자연산(기능)만 따로 분리해 클래스를 돌며 처리
    이터레이터컬렉션 내 모든 요소를 순차 탐색, Cursor
    상태상태를 캡슐화해 상태에 따라 행위 변경
    인터프리터특정 언어 문법을 정의하고 그 문장을 해석
    메멘토복구, Undo 기능, 객체 상태 저장
    커맨드요청(기능)을 객체로 캡슐화, 재사용성
    책임 연쇄요청 처리 객체를 사슬로 연결, 변경 가능하게
    템플릿 메서드상위=골격(추상 메서드), 하위=세부 구체화

    UML(통합 모델링 언어)란?

    요구사항을 분석하고 설계도를 그리는 단계에서 사용하는 핵심 도구

    구조 다이어그램 (정적 모델)

    다이어그램키워드
    클래스속성, 메서드, 클래스 관계
    객체특정 시점의 인스턴스, 실제 예시
    컴포넌트물리적 컴포넌트, 의존성
    배치(배포)컴포넌트 종속성, 물리적 요소 위치
    복합체 구조클래스 내부 구조, 협력 관계
    패키지유스케이스, 클래스 요소들의 그룹화, 폴더모양

    행위 다이어그램 (동적 모델)

    다이어그램키워드
    유스케이스사용자 관점, 시스템 기능, 상호작용
    시퀀스시간 흐름, 메시지 흐름
    커뮤니케이션객체 간의 관계와 메시지 교환에 집중
    상태하나의 객체가 겪는 상태 변화
    활동작업의 흐름, 처리 로직, 처리 흐름
    타이밍시간 제약에 따른 객체 상태 변화

    UML 클래스 다이어그램의 6가지 관계

    관계표기키워드
    포함, 복합 (Composition)강한 마름모◆ (속 찬)영구적, 강한, 속 찬
    집합 (Aggregation)약한 마름모◇ (속 빈)포함, 독립적, 속 빈
    연관 (Association)강한 화살표→ (실선)서로 관련, 지속적
    의존 (Dependency)약한 화살표⇢ (점선)짧은 시간, 잠깐
    일반화 (Generalization)강한 속 빈 화살표─▷ (실선)일반적, 상속
    실체화 (Realization)약한 속 빈 화살표- -▷ (점선)인터페이스, 약속

    소프트웨어 아키텍처 4+1 뷰 모델

    복잡한 시스템을 5가지 다른 관점(View)으로 나누어 체계적으로 바라보는 방법론.

    핵심 키워드
    유스케이스 뷰사용자 기능, 시나리오, 유스케이스 다이어그램
    논리 뷰기능적 요구사항, 정적 구조, 클래스 다이어그램
    프로세스 뷰비기능적 요구사항, 동적 동작, 시퀀스 다이어그램
    구현 뷰소프트웨어 모듈, 컴포넌트 구조, 컴포넌트 다이어그램
    배포 뷰물리적 아키텍처, 하드웨어 배포, 배포 다이어그램

    UI와 UX의 차이

  • UI(User Interface): 사용자가 시스템과 정보·명령을 주고받는 매개체(CLI·GUI). '어떻게 보이고 조작되는가'
  • UX(User Experience): 사용하면서 느끼는 감정·경험 전반. '사용해보니 어떤 느낌인가'. UI 외에 콘텐츠·서비스 흐름·신뢰도가 합쳐짐
  • UI 설계 4원칙

    원칙설명 / 핵심 키워드
    직관성(Intuitiveness)누구나 쉽게 이해·사용, 별도 학습 없이 조작(예: 휴지통=삭제)
    유효성(Validity)정확하고 완벽하게 목표 달성, 의도한 결과 산출
    학습성(Learnability)누구나 쉽게 배우고 익힘, 짧은 학습 시간
    유연성(Flexibility)다양한 요구·실수를 수용, 되돌리기 허용(Ctrl+Z)

    UI 종류 (CLI · GUI · NUI · OUI · VUI)

    약자특징 / 예시
    CLI (Command Line)명령어를 텍스트로 입력. 빠르고 자동화 유리(터미널)
    GUI (Graphical)그래픽 요소를 마우스로 클릭. 직관적(탐색기, 브라우저)
    NUI (Natural)동작·터치·제스처로 조작(멀티터치, VR 컨트롤러)
    OUI (Organic)사물·환경 자체가 인터페이스(스마트 미러, 폴더블, IoT)
    VUI (Voice)음성으로 입출력(Siri, AI 스피커)

    식별자 표기법 5종

    표기법형태예시
    헝가리안자료형 약어 prefix + 이름nCount, szName, bFlag
    카멜 케이스첫 글자 소문자, 이후 단어 첫 글자 대문자userName, getUserById
    파스칼 케이스모든 단어 첫 글자 대문자UserName, OrderService
    스네이크 케이스단어 사이를 _로 연결user_name, get_user_by_id
    케밥 케이스단어 사이를 -로 연결user-name, order-list

    헝가리안 표기법 상세

    변수 이름 앞에 자료형 약어를 prefix로 붙이는 방식.

  • n = int (nCount) / sz = 문자열(szName) / b = boolean(bFlag) / p = pointer(pNode) / f = float(fRatio)
  • 언어별 관례

  • Java: 카멜(변수·메서드), 파스칼(클래스) / Python: 스네이크(변수·함수), 파스칼(클래스) / URL·CSS: 케밥
  • 리팩토링이란?

    소프트웨어의 외부 동작은 변경하지 않으면서 내부 구조를 개선해 가독성·유지보수성·확장성을 높이는 작업. 동작이 바뀌면 리팩토링이 아니라 기능 변경이다.

    목적

  • 가독성 향상, 유지보수성 향상, 숨은 버그 발견, 설계 개선
  • 대표 기법

    기법의미
    이름 변경(Rename)변수·함수·클래스 이름을 의도가 드러나게 변경
    메서드 추출(Extract Method)긴 함수의 일부 로직을 별도 함수로 분리
    메서드 인라인(Inline Method)짧고 단순한 함수를 호출부에 펼침
    클래스 추출(Extract Class)너무 많은 책임을 가진 클래스를 분리
    매직 넘버 제거의미 없는 숫자 리터럴을 상수로 추출

    코드 스멜 (Code Smell)

    리팩토링이 필요한 신호: 중복 코드, 너무 긴 함수(Long Method), 큰 클래스(Large Class), 너무 많은 매개변수(Long Parameter List), 의미 없는 이름.

    비용 산정이란?

    개발에 필요한 노력(Man-Month)·기간·비용을 사전 추정. 하향식(전문가·델파이)과 상향식(LoC·FP·COCOMO)으로 나뉜다.

    하향식 산정 기법

  • 전문가 판단: 경험 많은 전문가의 직관에 의존
  • 델파이: 여러 전문가 의견을 익명 설문으로 수렴(전문가 판단의 편향 보완)
  • 상향식 산정 기법

    기법입력 자료 / 특징
    LoC (Lines of Code)예상 코드 라인 수(낙관치·비관치·기대치)
    기능 점수(FP)입력·출력·질의·파일·인터페이스 수에 가중치 합산(LoC와 무관)
    COCOMOLoC + 프로젝트 유형(Organic·Semidetached·Embedded)에 보정계수 적용
    Putnam개발 기간별 노력 분포(Rayleigh 곡선) 활용

    LoC 기법 공식

  • 노력(인월) = 총 라인 수 ÷ 1인당 월 생산 라인
  • 개발 기간(월) = 노력(인월) ÷ 투입 인력
  • 개발 비용 = 노력 × 1인당 월 평균 인건비
  • 예: 총 36,000라인, 개발자 6명, 1인당 월 300라인 → 노력 = 36,000÷300 = 120인월, 기간 = 120÷6 = 20개월

    릴리스 노트란?

    소프트웨어 배포 시 "이번 버전에서 무엇이 어떻게 바뀌었는지"를 전달하는 문서. 소프트웨어 패키징 단계의 핵심 산출물.

    작성 항목

    항목내용
    헤더(Header)문서명, 제품명, 버전, 릴리스 날짜, 노트 버전
    개요(Overview)제품 및 변경사항 간략 요약
    목적(Purpose)릴리스 목적, 새 기능·버그 수정 강조
    이슈 요약(Issue Summary)수정된 버그·변경 기능의 짧은 요약
    재현(Reproduction)버그 발생 환경 및 재현 절차
    수정 내용(Fixes)실제 수정·개선 사항
    사용자 영향(User Impact)변경이 사용자에게 미치는 영향
    참고(Notes)사용자·기술 관련 추가 안내
    면책 조항(Disclaimer)사용 조건 및 법적 면책
    연락처(Contact)지원 및 문의 채널