3 minute read

‘전문가를 위한 C++ - Marc Gregoire 지음, 남기혁 옮김’ 책을 참고하여 작성한 포스트입니다.


프로그램 설계의 정의

  1. 요구사항 분석
  2. 기능 요구사항(functional requirement)
    • 작성할 코드가 정확히 할 일을 표현, 달성하는 방법은 생략
  3. 비기능 요구사항(non-functional requirement)
    • 최종시스템의 동작이 아닌 속성을 표현
    • 보안이 뛰어나다던지, 확장성이 높다던지

프로그램 설계(소프트웨어 설계)란 요구사항들을 모두 만족하는 프로그램을 구현하기 위한 명세서(specification)다.

설계과정의 핵심은 프로그램 작성 전에 먼저 생각해보는데 있다.

프로그램 설계의 중요성

  • 코드 작성 전 공식적인 설계 단계를 거치면 프로그램의 전반적인 구조를 제대로 구성할 수 있다.
  • 설계를 통해 큰 그림을 그리지 않으면 사소한 구현 세부사항에 빠져 전체 구조와 목적을 놓치기 쉽다.

C++에 적합한 설계 방법

  • C++ 언어의 특성
    1. C++에서 제공하는 기능은 방대하다
    2. C++는 객체지향 언어다
      • 설계 단계에서 클래스 계층, 인터페이스, 객체간 상호 작용 등을 결정해주어야 함
    3. 코드의 범용성과 재사용성을 높이는 기능들이 있음
    4. 유용한 표준 라이브러리
    5. 디자인 패턴(설계 패턴) 적용하기 좋음
  • 어떤 방식으로 구성해 나갈 지 결정하고 나면, 그 결정을 내린 이유를 문서에 적어 두면 좋다. 추가로 생각해 보았지만 채택하지 않은 설계도 이유와 함께 문서에 남기면 좋다.

C++ 설계에 관련된 두 가지 원칙

핵심은 추상화재사용 이다.

추상화(abstraction)

  • 내부 구현과 외부 인터페이스을 명확히 분리시키는 것

추상화의 장점

  • 인터페이스만 그대로 유지된다면 내부 구현이 바뀌더라도 사용자는 문서에 공개된 인터페이스만 잘 따르면 되고, 내부 구현을 몰라도 쉽게 사용이 가능하다.

추상화를 적용하여 설계하기

  • 다른 프로그래머 뿐 아니라 자신도 내부 구현을 몰라도 되게 구상해야 한다.
  • 인터페이스를 외부에 공개하고, 구현에 대한 세부사항은 숨겨 준다.

재사용(reuse)

  • 공개된 기존 코드들을 재사용 하는 것은 당연한 것이다.
  • 불필요하게 중복 구현하지 말자!!

재사용 가능한 코드 마늗ㄹ기

  • 나 뿐아니라 다른 프로그래머들도 사용 가능하도록 너무 특화된 형태가 아닌 범용성 있는 프로그램 설계가 좋다.
  • C++ 에서는 범용성 있는 코드 제작을 위해 템플릿(template)을 제공한다. (템플릿 관련은 12장)

설계 재사용

  • 패턴(pattern)은 기존에 개발된 프로그램 설계 테크닉이다.
  • 설계 기법(design technique)설계 패턴(design pattern, 디자인 패턴)을 잘 활용하자. ( 32장과 33장 )


코드 재사용

코드 재사용이란 단순히 기존 코드를 복사하는 것을 의미하는 게 아니다. 프로젝트에 맞게 자유자재로 활용할 수 있어야 한다. 그러려면 재사용 가능한 코드의 형태와 장단점을 명확히 이해해야 한다.

용어 정리

  • 재사용 가능한 코드
    • 예전에 내가 작성한 코드
    • 동료가 작성한 코드
    • 현재 조직 내나 외의 서드파티에서 작성한 코드
  • 재사용할 코드의 형태
    • 독립 함수 또는 클래스
      • 자신 또는 동료가 작성한 코드가 대부분 이런 형태
    • 라이브러리
      • 특정 작업 처리하는 데 필욯나 코드를 한데 묶은 것
    • 프레임워크
      • 설계할 프로그램의 기반이 되는 코드를 모아둔 것
    • 애플리케이션
  • 프로그램은 라이브러리를 활용하고, 프레임워크에 맞게 작성한다.
  • 즉, 라이브러리는 특정 기능을 제공하고, 프레임워크는 프로그램의 설계와 구조에 대한 토대를 제공한다.

API(Application Programming Interface)

  • 라이브러리를 외부에 제공하기 위한 인터페이스.

코드 재사용의 판단 기준

코드 재사용 장점

  • 필요한 코드 작성 방법을 모르거나 작성에 걸리는 시간을 가늠하기 힘들 때 좋음
  • 재사용할 코드는 다시 설계할 필요가 없으므로 전체 설계가 한결 간결해진다.
  • 대부분 전문가들에 의해 충분한 테스트와 검증을 거친 코드들이므로 디버깅하지 않아도 되고, 안전하고, 예외도 다 대비되어 있고, 다양한 플랫폼에 적용 가능하며, 훨씬 뛰어나다.
  • 라이브러리가 지속적으로 개선된다.

코드 재사용 단점

  • 다른 사람이 작성한 라이브러리를 사용하기 위해 해당 라이브러리 및 사용법을 이해하는 과정에서 시간이 소요된다.
  • 원하는 바를 완전히 구현하지 못할 수 있고, 성능도 좋지 않을 수 있다.
  • 라이브러리의 소스 코드에 접근할 수 없는 경우 유지 보수를 할 수 없는 문제가 발생할 수 있다.
  • 라이선스 문제도 있다.
  • 버전이 업그레이드 되는 경우 문제 발생 가능

판단 기준 정리

  • 주어진 목적과 상황에 맞게 장단점을 고려하여 선택해야 함.


코드 재사용 전략

기능과 제약사항 파악

  • 라이브러리를 재사용 하는 경우, 어떤 함수가 제공되는지 파악한다.
  • 프레임워크를 재사용한다면 코드 작성 방식부터 익히고, 어떤 클래스를 상속해야 할 지 , 직접 작성할 부분은 무엇인지 파악해야 한다.

라이브러리 선정 시 명심할 점

  • 멀티스레드 프로그램에서 사용해도 안전한 지
  • 특별히 컴파일러에 설정해야 할 사항이 있는 지
  • 의존하는 다른 라이브러리가 있는 지

라이브러리에 따라 확인해야 하는 구체적 특성

  • 초기화나 종료 시 반드시 수행할 작업이 있는 지
  • 클래스 상속 시 어떤 생성자를 호출해야 하고, 어떤 가상 메서드를 오버라이드 해야 하는 지
  • 함수가 메모리 포인터를 리턴할 때 그 메모리 해제를 호출한 쪽과 라이브러리 중 어디서 해야 하는 지
  • 함수에서 리턴하는 값이나 레퍼런스들
  • 함수에서 던지는 예외들
  • 라이브러리 호출 시 어떤 에러 조건을 확인해야 하는 지

학습 비용(learning cost) 파악하기

  • 라이브러리에 익히는 시간이다.

성능 파악하기

  • 재사용하려는 코드의 성능이 어느 수준까지 보장되는지
  • 대부분 프로그램 실행 시간의 90% 는 프로그램 코드의 10%가 차지한다.
  • 따라서 나머지 코드 90%에 성능 분석 시간을 들이지 말고 10%에 집중해야 한다.
  • 문서를 너무 믿지 말고, 직접 성능 테스트 해보기

플랫폼 제약사항 파악하기

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

기술 지원 및 도움을 받을 수 있는 곳 파악하기

프로토타입

  • 라이브러리나 프레임워크 처음 사용 시 간단히 프로토타입을 구현해 보면 좋다.
  • 최종 결과물과 거리가 멀어도 시간 낭비가 아니다.
  • 이를 통해 기능을 파악하면 좋다.

오픈소스 라이브러리

  • 오픈 소스(open source)란 누구나 코드를 들여다 볼 수 있는 것.
  • 라이브러리에만 적용되는 건 아니다.
  • 라이선스에 주의해야 한다.

c++ 표준 라이브러리

  • 표준 라이브러리에 관한 자세한 내용은 나중에 16장 ~ 25장에 걸쳐 설명

Leave a comment