[25년 03차 / 문제풀이] 소프트웨어 설계
개념
☐ 소프트웨어 개발의 설계 단계
● 상위 설계
- 아키텍처 설계, 예비 설계
- 설계 대상 : 시스템의 전체적인 구조
- 세부 목록 : 구조, DB, 인터페이스
● 하위 설계
- 모듈 설계, 상세 설계
- 설계 대상 : 시스템의 내부 구조 및 행위
- 세부 목록 : 컴포넌트, 자료 구조, 알고리즘
☐ 상향식 설계(Top-down design), 하향식 설계(Bottom-up design)
● 상향식 설계(Top-down design)
- 상향식 설계의 개념 : 상위 모듈에서 하위 모듈 방향으로 통합하면서 테스트하는 기법
- 상향식 설계의 예시 : 구조적 설계, 절차지향 설계 (C언어)
- 상향식 설계의 절차
+ 주요 제어 모듈은 작성된 프로그램을 사용하고, 주요 제어 모듈의 종속 모듈들은 스텁으로 대체
+ 깊이 우선 or 넓이 우선 등의 통합 방식에 따라 하위 모듈인 스텁들이 한 번에 하나씩 실제 모듈로 교체됨
+ 모듈이 통합될 때마다 테스트 실시
+ 새로운 오류가 발생하지 않음을 보증하기 위해 회귀 테스트 실시
- 상향식 설계의 특징
+ 시스템의 큰 구조를 계획하고, 그 구조에서 하위 모듈들을 세분화하여 구체적인 동작 방식을 정의, 이때 각 모듈의 입출력, 기능, 인터페이스 등을 상세하게 정의하고, 이후 모듈들 간의 연결을 고려하여 전체 시스템 통합
+ 깊이 우선 통합법, 넓이 우선 통합법 사용
+ 최하위 수준에서 각각의 모듈들을 설계하고 이러한 모듈이 완성되면 이들을 결합하여 검사함
- 상향식 설계의 장점
+ 테스트 초기부터 사용자에게 시스템 구조를 보여줄 수 있음
- 상향식 설계의 단점
+ 상위 모듈에서는 fc를 사용하기 어려움
+ 인터페이스가 이미 성립되어 있지 않으면 기능 추가가 어려움
● 하향식 설계(Bottom-up design)
- 하향식 설계의 개념 : 하위 모듈에서 상위 모듈 방향으로 통합하면서 테스트하는 방법
- 하향식 설계의 예시 : 객체지향 설계
- 하향식 설계의 절차
+ 하위 모듈을 클러스터로 결합
+ 상위 모듈에서 데이터의 입출력을 확인하기 위해 모듈인 드라이버 작성
+ 통합된 클러스터 단위로 테스터
+ 테스트가 완료되면 클러스터는 프로그램 구조의 상위로 이동하여 결합하고, 드라이버는 실제 모듈로 대체
- 하향식 설계의 특징
+ 먼저 세부적인 기능을 가진 모듈을 구현하고, 이 모듈들을 조합하여 큰 구조를 형성, 이때 각 모듈은 독립적으로 테스트할 수 있도록 설계되며 이후 모듈들을 조합하여 전체 시스템을 완성
+ 가장 하위 단계의 모듈부터 통합 및 테스트가 수행되므로 스텁은 필요하지 않음
+ 하나의 주요 제어 모듈과 관련된 종속 모듈의 그룹인 클러스터가 필요
+ 하향식 설계에서 레벨이 낮은 데이터 구조의 세부 사항은 설계 초기 단계에서 필요
- 하향식 설계의 장점
+ 통합 검사 시 인터페이스가 이미 정의되어 있어 통합이 간단함
☐ 효과적인 모듈 설계 방안
● 결합도는 줄이고 응집도는 높여서 모듈의 독립성과 재사용성을 높임
● 복잡도와 중복성을 줄이고 일관성을 유지시킴
● 유지보수 용이
● 모듈의 제어 영역 안에서 그 모듈의 영향 영역을 유지시킴
● 모듈의 기능은 예측이 가능해야 하며, 지나치게 제한적이어서는 안 됨
● 모듈의 크기는 시스템의 전반적인 기능과 구조를 이해하기 쉬운 크기로 분해
● 효과적인 제어를 위해 모듈 간의 계층적 관계를 정의하는 자료가 제시되어야 함
☐ 객체지향 설계 원칙(SOLID 원칙)
● 단일 책임 원칙(SRP, Single Responsibility Principle)
- 객체는 단 하나의 책임만 가져야 한다는 원칙
● 개방-폐쇄 원칙(OCP, Open-Closed Principle)
- 기존의 코드는 변경하지 않고 기능을 추가할 수 있도록 설계해야 한다는 원칙
● 리스코프 치환 원칙(LSP, Liskov Substitution Principle)
- 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 한다는 설계 원칙
- 서브타입(상속받은 하위 클래스)은 어디에서나 자신의 기반 타입(상위 클래스)으로 교체할 수 있어야 함을 의미하는 원칙
● 인터페이스 분리 원칙(ISP, Interface Segregation Principle)
- 자신이 사용하지 않는 인터페이스와 의존 관계를 맺거나 영향을 받지 않아야 한다는 원칙
● 의존 역전 원칙(DIP, Dependency Inversion Principle)
- 각 객체들 간의 의존 관계가 성립될 때, 추상성이 낮은 클래스보다 추상성이 높은 클래스와 의존 관계를 맺어야 한다는 원칙
문제
☐ 소프트웨어 개발의 설계 단계
2020년-3차 12번. 소프트웨어의 상위 설계에 속하지 않는 것은?
① 아키텍처 설계
② 모듈 설계
③ 인터페이스 정의
④ 사용자 인터페이스 설계
정답 : 2
입력 답 : 4
☐ 상향식 설계(Top-down design), 하향식 설계(Bottom-up design)
2022년-1차 5번. 설계 기법 중 하향식 설계 방법과 상향식 설계 방법에 대한 비교 설명으로 가장 옳지 않은 것은?
① 하향식 설계에서는 통합 검사 시 인터페이스가 이미 정의되어 있어 통합이 간단하다.
② 하향식 설계에서 레벨이 낮은 데이터 구조의 세부 사항은 설계 초기 단계에서 필요하다.
③ 상향식 설계는 최하위 수준에서 각각의 모듈들을 설계하고 이러한 모듈이 완성되면 이들을 결합하여 검사한다.
④ 상향식 설계에서는 인터페이스가 이미 성립되어 있지 않더라도 기능 추가가 쉽다.
정답 : 4
입력 답 : 2
☐ 효과적인 모듈 설계 방안
2024년-2차 7번. 바람직한 소프트웨어 설계 지침이 아닌 것은?
① 결합도를 최소화하고 응집도를 최대화한다.
② 복잡도와 중복성을 줄이고 일관성을 유지시킨다.
③ 하나의 입구와 하나의 출구를 갖도록 해야 한다.
④ 모듈의 크기를 가능한 작게 구성하여 병행성 수준을 높여야 한다.
정답 : 4
입력 답 : 3
2024년-2차 33번. 효과적인 모듈 설계를 위한 유의사항으로 거리가 먼 것은?
① 모듈 간의 결합도를 약하게 하면 모듈 독립성이 향상된다.
② 하나의 입구와 하나의 출구를 갖도록 해야 한다.
③ 모듈의 기능은 예측이 가능해야 하며 지나치게 제한적이어서는 안된다.
④ 일관성을 줄이고 중복성을 유지시킨다.
정답 : 4
입력 답 : 2
☐ 객체지향 설계 원칙(SOLID 원칙)
2020년-2회 17번. 객체지향 설계 원칙 중 서브타입(상속받은 하위 클래스)은 어디에서나 자신의 기반타입(상위클래스)으로 교체할 수 있어야 함을 의미하는 원칙은?
① ISP(Interface Segregation Principle)
② DIP(Dependency Inversion Principle)
③ LSP(Liskov Substitution Principle)
④ SRP(Single Responsibility Principle)
정답 : 3
입력 답 : 2
2024년-2차 8번. 객체지향 설계 원칙에 대한 설명 중 틀린 것은?
① OCP : 기존의 코드를 변경하지 않고 기능을 추가할 수 있도록 설계해야 한다는 원칙
② LSP : 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 한다는 설계 우너칙
③ DIP : 각 객체들 간의 의존 관계가 성립될 때, 추상성이 낮은 클래스보다 추상성이 높은 클래스와 의존 관계를 맺어야 한다는 원칙
④ ISP : 객체는 단 하나의 책임만 가져야 한다는 원칙
정답 : 4
입력 답 : 3