전공 과목/소프트웨어 공학

Lecture 08: 설계 - 1

arsenic-dev 2024. 10. 14. 13:07

경희대학교 김정욱 교수님의 소프트웨어 공학 수업을 기반으로 정리한 글입니다.

소프트웨어 설계(Design)란? 

설계

  • 개발될 제품에 대한 의미있는 공학적 표현
  • 프로그램 구현에 들어가기 전에 소프트웨어를 구성하는 뼈대를 정의해 구현의 기반을 만드는 것

설계자는 다양한 제약 조건을 만족시킬 수 있는 최적의 설계안을 만들고, 설계를 평가할 기준도 정량적으로 명시해야 한다.

 

좋은 설계가 되기 위한 조건

  • '설계서'는 '요구분석 명세서'의 내용을 모두 포함해야 한다.
  • 유지보수가 용이하도록 추적이 가능해야 한다.
  • 변화에 쉽게 적응할 수 있어야 한다. ex) 새로운 함수와의 연동
  • 시스템 변경으로 인한 영향이 최소화되도록 국지적(한정적)이어야 한다. ex) 모듈화
  • '설계서'는 읽기 쉽고 이해하기 쉽게 작성되어야 한다.

설계만 잘 되면 구현(실체화)은 있는 그대로 하기만 하면 된다.

요구분석 vs. 설계

요구분석과 설계의 차이

요구분석

  • 사용자의 요구 사항을 토대로 '요구 분석 명세서'를 작성 (개념적, 추상적)
  • 사용자의 요구를 what 관점에서 바라봄

설계

  • 분석 단계에서 고려하지 않은 상세 내용을 반영하여 구현할 수 있는 수준으로 준비 (구체적)
  • 분석 단계에서 파악한 비기능적 요구사항(제약사항)을 구려
  • 운영체제 등의 플랫폼을 결정하여 구체적인 설계서 작성
  • How(어떻게) 관점에서 바라봄

▶ 요구분석과 설계의 차이 (정리)

설계의 종류

설계의 종류

설계의 종류

 

1. 상위 설계 (예비 설계(Preliminary Design))

집 짓기에서 전체 골조(뼈대)를 세우는 것과 유사하다.

  • 구조 설계: 시스템의 전체적인 구조
  • DB 설계: 시스템에 필요한 정보를 위한 설계
  • 인터페이스 설계: 시스템의 구조와 서브 시스템 사이의 인터페이스를 명확히 정의

2. 하위 설계

뼈대에 어떤 살을 붙일 것인가 하는 것이다.

 

각 모듈의 실제 내부 알고리즘(pseudo-code) 형태로 표현하며,

인터페이스에 대한 설명, 자료구조, 변수 등에 대한 상세한 정보를 작성한다.

설계 방식

설계 방식

▶ 프로세스 지향 설계 vs 객체 지향 설계

 

1. 프로세스 지향 설계 (Process Oriented Design, 절차 지향 설계)

업무의 처리 절차를 중심으로 설계의 구성 요소들을 구분한다.

즉, 어떠한 절차를 걸쳐서 작업을 수행하는 가, 어떠한 입출력 자료를 생성하는지에 초점을 맞춤다.

 

때문에 기능과 데이터가 노드를 이루고 이들 간의 관계를 형성한다.

 

2. 객체 지향 설계 (Object Oriented Design)

시스템의 실제 객체 요소를 중심으로 설계하다. ('객체'라는 틀로 묶어 사용, 즉 모듈화)

즉, 객체를 정의하고 이들의 상호작용의 기본이 되도록 설계한다.

 

때문에 객체들이 노드를 이루고 이들 간의 관계를 형성한다.

 

물론, 객체도 순서는 있다.

▶ 프로세스(절차) 지향 설계 vs 객체 지향 설계 예시

 

절차 지향 설계와 객체 지향 설계는 관점의 차이이다.

설계의 원리

설계의 6가지 원리 (객체지향 관점)

▶ 설계의 6가지 원리

1. 분할과 정복 (Divide and Conquer)

큰 문제를 소 단위로 나누고, 소 단위의 작업을 하나씩 처리하여 전체 일을 끝내는 방법이다.

즉, 규모가 큰 문제를 작은 규모의 모듈로 분할하는 방법이다. (모듈화)

▶ 분할과 정복

 

모듈로 나누면 모듈끼리 소통하는 방법이 필요한데,

무작정 작게만 쪼개면 많은 소통으로 인해 오히려 복잡도가 증가하고,

너무 크게 쪼개면 각각의 함수에 중복된 기능이 생겨 유지보수 때 힘들다.

 

때문에, 설계자가 어느 수준으로 쪼갤지를 잘 결정해야 한다. (복잡도 vs. 처리의 용이성)

2. 추상화 

필수 정보만 추출하여 강조하고 관련이 없는 세부 사항은 생략한다.

▶ 추상화

 

장점

  • 복잡한 현상을 간단히 이해할 수 있게 도움
  • 문제의 핵심을 쉽게 파악할 수 있고 문제의 본질을 이해하는 데에 도움

1) 과정 추상화

전체 흐름만 파악할 수 있도록 핵심만 알고리즘 형태로 작성한다.

▶ 과정 추상화

 

2) 데이터 추상화

데이터를 모아 데이터 구조 형태로 작성한다.

▶ 데이터 추상화

 

3) 제어 추상화

여러 줄의 내용을 간략하게 줄여서 표현한다. 

▶ 제어 추상화

 

※ 제어: 프로그램 내의 명령어 실행 순서

 

추상화: (a) <- (b) <- (c) (단계가 올라갈 수록 표현이 더욱 간결해짐, 즉 더 높게 추상화됨)

3. 캡슐화

기능(서비스)과 사용법만 제공하고, 내부, 즉 디테일한 부분(ex) 함수 내부)은 알 수 없게 감추는 개념이다.

즉, 핵심만 보게 하는 것이다.

▶ 캡슐화

▶ 캡슐화 용어 - 1

▶ 캡슐화 용어 - 2

 

객체: 클래스를 실체화한 것

 

장점

  • 추상화를 통해 문제를 쉽게 개념화할 수 있다.
  • 메서드의 기능만 알면 객체를 쉽게 사용할 수 있다.
  • 객체 내부의 자료구조를 변경해도, 사용자에게 영향을 주지 않아 부담 없이 자료구조를 변경할 수 있다.
  • 다른 모듈의 구현 내용은 자세히 알 필요 없이 기능만 알면 되므로 사용자가 모듈을 이해하기 쉽다.
  • 모듈 내의 알고리즘을 변경하기 쉬워서 기능 추가가 쉽다.

4. 정보은닉 

외부(다른 객체)에서 객체의 내부(데이터)를 들여다 볼 수 없는 개념이다.

때문에 한 객체 내의 데이터 값을 직접 참조하거나 접근할 수 없어서 메서드를 통해 객체에 요청하여 값을 넘겨 받아야 한다.

 

※ 캡슐화와 완전히 다른 개념이다.

▶ 접근 제어자 표기법

  • 공개(+, public): 같은 시스템에 있는 모든 클래스가 접근할 수 있음
  • 은닉(-, private): 같은 시스템 내의 다른 클래스가 직접 접근할 수 없고, 해당 클래스의 메서드를 통해서만 접근할 수 있음
  • 부분공개(#, protected): 다른 클래스가 접근할 수 없고, 해당 클래스의 메서드, 클래스를 상속받은 하위 클래스만 접근 가능

※ protected도 private처럼 메서드를 통해 다른 클래스가 접근 가능하다.

5. 상속

상위 클래스의 모든 것을 하위 클래스가 물려 받아 내 것처럼 사용하는 것을 말한다.

▶ 상속

 

※ 상속은 일반화 관계이다.

6. 다형성

어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 말한다.

▶ 다형성

 

1. 오버로딩

1) 연산자 오버로딩

연산자 중복 정의를 말한다.

ex) +는 두 숫자를 더하는 연산자로도, 문자열을 연결하는 연산자(연결자)로도 사용된다.

 

2) 메서드 오버로딩

한 클래스 내에서 이름이 같은 메서드를 중복해서 사용하는 것을 말한다.

이때 같은 메소드명에 다른 매개변수 타입이어야 한다는 조건이 있다.

▶ 메서드 오버로딩 예시

 

2. 메서드 오버라이딩

상위 클래스에서 정의한 메서드는 무시하고, 하위 클래스에서 다시 정의해 사용하는 것을 말한다.

▶ 잘못된 메서드 오버라이딩

▶ 올바른 메서드 오버라이딩

메서드 오버라이딩 예시

'전공 과목 > 소프트웨어 공학' 카테고리의 다른 글

Lecture 10: 설계 - 3  (8) 2024.10.17
Lecture 09: 설계 - 2  (4) 2024.10.17
Lecture 07: 요구분석 - 2  (7) 2024.10.09
Lecture 06: 요구분석 - 1  (11) 2024.10.09
Lecture 05: 계획 (프로젝트 관리와 계획) - 2  (5) 2024.10.05