설계(Design)란?
- 프로그램 구현에 들어가기 전에 소프트웨어의 뼈대를 세우는 것
VS 요구분석
- 요구분석
- 사용자의 요구 사항을 분석하여 "요구분석명세서" 작성 (추상적, 개념적)
- What 관점으로 사용자의 요구를 바라봄 - 설계
- 분석 단계에서 고려하지 않은 상세 내용을 반영하여 구현할 수 있는 수준으로 준비 (구체적)
- How 관점에서 바라봄
- 운영체제 등의 플랫폼을 결정 -> 구체적인 설계서 작성
(설계서는 요구분석명세서의 모든 내용을 포함해야 함)
설계의 종류
상위 설계 ( 예비설계(Preliminary Design) )
- 프로그램 구현에 들어가기 전에 소프트웨어의 뼈대를 세우는 것
하위 설계 ( 내부 )
- 각 모듈의 실제 내부를 알고리즘 (pseudo-code) 형태로 표현
- 인터페이스에 대한 설명, 자료구조, 변수 등에 대한 상세한 설명 포함
설계 방식

프로세스 지향 설계 (Process Oriented Design)
- 절차 지향 설계
- 어떤 절차를 걸쳐서 작업을 수행하는가, 어떤 입출력 자료를 생성하는 가의 초점
- 기능과 데이터를 노드로 하고 이들의 관계를 형성
객체 지향 설계 (Object Oriented Design)
- 시스템을 객체 요소를 중심으로 설계
- 객체라는 틀로 묶어 사용 (모듈화)
- 객체들간의 상호작용에 초점을 둠
- 객체를 노드로하여 이들의 관계 형성
설계의 원리
- 분할과 정복
- 추상화
- 캡슐화
- 정보 은닉
- 상속
- 다형성
분할과 정복 (Divide and Conquer)

- 규모가 큰 문제를 소 단위의 모듈로 나누고 소 단위의 모듈을 하나씩 해결하여 전체의 문제를 해결하는 것
- 모듈간의 소통하는 방법이 필요함
- 너무 작게 쪼개면 소통이 많아져 오히려 복잡도가 증가할 수 있음
- 너무 크게 쪼개면 기능간의 구분이 이루어지지 않고 모듈간의 중복된 기능이 생겨 처리의 용이성이 줄어들 수 있음
-> 유지 보수할 때 힘듦 - 관련있는 것끼리는 묶고 관련 없는 것끼리는 떨어뜨려 놓아야 함
추상화 (Abstraction)
- 필수 정보(ex.함수 이름)만 추출하여 관련이 없는 세부 사항을 생략함으로써 본질적인 문제에 집중할 수 있음
(어떻게 구현하는지는 관심 없음 -> 세부사항은 구현때 집중) - 장점
- 복잡한 현상을 간단히 이해할 수 있음
- 문제의 핵심을 쉽게 판단할 수 있고 문제의 본질을 이해하는 데 도움이 됨 - 추상화 유형
- 과정 추상화
- 데이터 추상화
- 제어 추상화
과정 추상화
- 상세 부분은 생략하고, 전체 흐름을 알 수 있는 알고리즘 형태로 작성
데이터 추상화

- 데이터의 속성이나 용도를 정의하지 않고, 데이터 구조를 대표할 수 있는 표현으로 대체하는 방법
- ex. C++의 클래스
- 사용자는 함수의 작동원리를 몰라도 됨, 기능만 알면 됨
제어 추상화

- 프로그래밍 언어에서 쓰는 제어구조를 추상화 하는 것
- 어셈블리 언어는 기계 언어보다 한 단계 높게 추상화 된 것,
고급 언어는 어셈블리 언어보다 한 단계 높게 추상화 된 것 - 추상화 될수록 표현이 간결
캡슐화

- 사용자에게 해당 클래스의 기능과 사용법만 설명하고 내부는 감추는 개념 (블랙박스)
장점
- 추상화를 통해 문제를 쉽게 개념화할 수 있음
- 내부의 자료 구조를 변경해도 사용자에게 영향을 주지 않으므로 부담 없이 자료구조를 변경할 수 있음
- 기능만 알면 되므로 사용자가 쉽게 사용할 수 있음
- 알고리즘을 변경하기 쉬워 기능 추가가 쉬움
정보은닉 (private)
- 캡슐화랑 아예 다른 개념임
( 캡슐화는 public, private 상관없이 핵심만 보게 하는 것 ) - 모듈 내부에 자료를 감추어서 다른 모듈에서 접근하거나 변경하지 못하도록 막는 것
- 외부(다른 모듈)에서 내부(데이터)를 들여다볼 수 없는 개념
- 대화를 하듯이 메서드를 통해 데이터를 요청해야함
(참고) 접근제어자 표기법 (Java, C++, UML)
- 공개 (+, public)
- 같은 시스템의 모든 클래스가 접근할 수 있음 - 은닉 (-, private)
- 같은 시스템의 다른 클래스가 접근할 수 없고, 해당 클래스의 메소드를 통해서만 접근할 수 있음 - 부분공개 (#, protected)
- 같은 시스템의 다른 클래스가 접근할 수 없고, 해당 클래스의 메소드와 클래스를 상속받은 하위 클래스만 접근할 수 있음
상속 (Inheritance)

- 상위 클래스의 모든 것을 하위 클래스가 상속받아 내 것처럼 사용
다형성
- 어떤 객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가질 수 있음
- 종류
- 오버로딩
- 메서드 오버라이딩
오버로딩
- 연산자 오버로딩
3+5에서의 +는 두 숫자를 더하는 연산자
Go+stop에서의 +는 두 문자열을 연결하는 연산자
-> + 연산자가 서로 다른 용도로 사용 (연산자 중복 정의)

- 메서드 오버로딩
- 한 클래스 내에서 이름이 같은 함수 중복 사용
- 조건 : 같은 메소드명, 다른 매개변수 타입
메서드 오버라이딩

- 상위 클래스에서 정의했던 메서드를 다시 하위 클래스에서 정의하여 사용
- 리스코프 교체 원칙을 위배해서는 안됨
- 리스코프 교체 원칙 : 자식 객체는 부모 객체의 특성을 가지며, 그 특성을 토대로 확장
'소프트웨어공학' 카테고리의 다른 글
| 설계(Part3) - 정적모델링 (2) | 2024.10.21 |
|---|---|
| 설계 (Part2) UML 모델링 (0) | 2024.10.21 |
| 요구분석 (Part2) (0) | 2024.10.21 |
| 계획(프로젝트 계획과 관리) (part 2) (0) | 2024.10.20 |
| 계획 (프로젝트 관리와 계획) Part 1 (1) | 2024.10.20 |