개발 이야기 안하는 개발자

전문가를 위한 C++20 _ 2 (전문가다운 C++ 소프트웨어 설계 방법) 본문

Book/전문가를 위한 C++20

전문가를 위한 C++20 _ 2 (전문가다운 C++ 소프트웨어 설계 방법)

07e 2024. 3. 22. 13:31
반응형

4. 전문가 답게 C++ 프로그램 설계하기

 

프로그램 설계 정의

프로그램에 기능을 추가하는 작업에 들어가기전에 가장 먼저 할일은 요구사항 분석이다.

이해 당사자와 함께 논의해서 핵심 기능 요구 사항 문서를 정리하는 것이다.

최종 시스템의 동작이 아닌 속성을 표현하는 비기능 요구사항 문서도 나올 수 있다. (보안성, 확장성 등등)

여기에서 나온 표현도 모두 적는다.

 

요구사항을 모두 수집했다면 프로그램 설계를 진행한다.

설계 문서는 대체로 서브시스템(시스템에서 작업이 처리되는 위치)사이의 상호작용과 클래스 계층을 보여주는 다이어그램이나 표로 구성된다.

 

설계를 진행함에 있어 예상치 못한 문제나 변화에 유연하게 대처하도록 구성된 소프트웨어 공학 프로세스도 많다.

그 대표적인 예로 스크럼이라는 애자일 소프트웨어 개발 방법론이 있다.

스크럼에서는 스프린트라는 순환 주기에 따라 개발 과정을 반복하고, 각 스프린트마다 설계가 변경될 수 있고, 새로운 요구사항이 추가될 수 있다.

 

프로그램 설계의 중요성

설계를 하지 않고 바로 코딩에 들어가면 문제가 많이 발생한다. 따라서 정확한 설계를 작성해야 한다.

 

C++에 적합한 설계 방법

C++의 특성들을 고려해서 고민해야 한다.

- 제공하는 기능이 방대하다.

- 객체 지향 언어이다.

- 코드의 범용성과 재사용성을 높이는 데 필요한 기능을 다양하게 제공한다.

- 여러가지 유용한 표준 라이브러리를 제공한다.

- 다양한 설계패턴을 곧바로 적용하기 좋다.

 

C++ 설계의 두 가지 원칙

- 추상화

  예시로 유저가 TV를 보기위해선 TV의 내부를 알 필요가 없다. 단순히 리모콘만 조정할 줄 알면 된다.

  추상화 원칙도 내부 구현 방식은 몰라도 코드를 사용할 수 있어야 한다.

- 재사용

  같은 로직을 새롭게 만드는 시간은 낭비이다. 이미 기존에 만든 로직을 다시 재활용 할수 있도록 염두하면서 개발한다.

  C++에서는 탬플릿이라는 기능을 제공한다.

 

코드 재사용 전략

재사용할 코드에 대해 주의사항이 있다.

- 기능과 제약사항을 파악해야 한다. (사용방법에 대해 오류가 있어서 문제를 야기할 수 있다)

- 학습 비용 파악하기 (라이브러리를 사용하기 위해 익히는 데 걸리는 시간이 낭비라면 기존 라이브러리를 사용하는 것이 낫다)

- 성능 파악하기 (코드가 어느 수준까지 성능이 보장되는지 파악해야 한다_빅오 표기법 참고)

- 플랫폼 제약사항 파악하기

- 라이선스와 기술 지원 파악하기

 

 



 

5. 객체 지향 설계

 

객체지향 철학

객체지향 접근 방식은 모델링하려는 현실 세계의 대상이라는 관점에서 접근한다.

프로그램을 작업(태스크)단위가 아니라 실제 대상에 대한 모델단위로 구성한다.

 

클래스

어떠한 대상에 대한 설명을 담고있는 단위

 

객체(오브젝트)

구체적으로 특정 물건을 가르킬때를 의미한다.

객체는 어떤 클래스에 속하는 구체적인 예(인스턴스)라고도 볼수 있따.

 

컴포넌트

복잡한 대상의 작은 부품들

클래스와 본질은 같으며 클래스보다 좀더 작고 구체적이다.

 

속성(프로퍼티)

객체는 속성으로 구분된다.

객체가 가지고 있는 특징들 하나 하나가 속성으로 볼 수 있다.

 

동작(행위)

객체가 직접 하거나 그 객체로 할 수 있는 일을 표현한다. (클래스에서는 메소드)

 

클래스 관계 Has-A 관계

A가 B를 가진다 또는 A에 B가 있다라고 표현된다. (비행기에는 날개가 있다_비행기 클래스엔 날개 클래스가 포함됨)

 

클래스 관계 Is-A 관계

A가 B를 상속한다. A는 B의 일종이다.(원숭이는 동물이다_원숭이는 동물이 갖춰야할 조건을 모두 가지고 있다)

 

다형성

일정한 속성과 메서드를 표준으로 정해두면 그 형식에 맞는 객체라면 어느 것이든 바꿔서 적용할 수 있다는 개념이다.

(모든 동물들은 먹는 행위가 가능하다_원숭이도 가능. 사람도 가능. 등등 )

 

다중 상속

C++는 다중상속을 지원한다. (그림 버튼 클래스 - 버튼 상속, 그림 상속)

단점 - 시각적으로 복잡하다 / 구조의 명확성이 깨질 수 있다 / 구현하기 어렵다.

 

 



 

 

 

6. 재사용을 고려한 설계

 

- 용도나 분야가 약간 달라도 충분히 사용할 수 있도록 범용성을 갖춰야 한다.

- 사용하기 쉽게 만들어야 한다.

 

추상화

- 인터페이스와 구현을 분리하기

- 불투명 클래스 (클래스 내부 데이터 멤버를 직접 접근하지 못하게 하거나 간접적_게터세터로 접근하게 하기)

- 코드를 적절하게 구성하기(클래스 계층 구조와 템플릿 사용 여부, 서브 시스템을나누는 방식)

- 작성한 코드에 진입하는 역할을 하는 인터페이스를 설계해야한다.

 

<<프로그램을 서브시스템 단위로 논리적으로 나누기

결합도가 낮게 만든다. (독립적으로 재사용할 수 있는 컴포넌트로 만든다)

 

<<클래스 계층을 사용해서 논리적으로 나누기

 

<<집계 방식으로 논리적 개념 나누기

집계란 has-a 관계를 말한다. 

 

<<사용자 인터페이스에 대한 종속성 제거하기

 

<<커스터마이즈 지원하기 

 

SOLID 원칙

SRP (단일책임 원칙) - 컴포넌트마다 한가지 책임을 잘 정의하고 관련없는 기능을 합치지 않는다.

OCP (개방/폐쇄 원칙) - 클래스는 (상속을 통해) 확장에는 개방적이고, 수정에는 폐쇄적이어야 한다.

LSP (리스코프 치환 원칙) - 어떤 객체의 인스턴스를 그 객체의 서브타입 인스턴스로 치환(대체)할 수 있어야 한다.

ISP (인터페이스 분리 원칙) - 인터페이스는 깔끔하고 간결해야 한다.

DIP (의존성 역전 원칙) - 인터페이스로 의존 관계를 역전시킨다.

반응형