[전문가를 위한 C++] 전문가답게 C++ 프로그램 설계하기
‘전문가를 위한 C++ - Marc Gregoire 지음, 남기혁 옮김’ 책을 참고하여 작성한 포스트입니다.
프로그램 설계의 정의
- 요구사항 분석
- 기능 요구사항(functional requirement)
- 작성할 코드가 정확히 할 일을 표현, 달성하는 방법은 생략
- 비기능 요구사항(non-functional requirement)
- 최종시스템의 동작이 아닌 속성을 표현
- 보안이 뛰어나다던지, 확장성이 높다던지
프로그램 설계(소프트웨어 설계)란 요구사항들을 모두 만족하는 프로그램을 구현하기 위한 명세서(specification)다.
설계과정의 핵심은 프로그램 작성 전에 먼저 생각해보는데 있다.
프로그램 설계의 중요성
- 코드 작성 전 공식적인 설계 단계를 거치면 프로그램의 전반적인 구조를 제대로 구성할 수 있다.
- 설계를 통해 큰 그림을 그리지 않으면 사소한 구현 세부사항에 빠져 전체 구조와 목적을 놓치기 쉽다.
C++에 적합한 설계 방법
- C++ 언어의 특성
- C++에서 제공하는 기능은 방대하다
- C++는 객체지향 언어다
- 설계 단계에서 클래스 계층, 인터페이스, 객체간 상호 작용 등을 결정해주어야 함
- 코드의 범용성과 재사용성을 높이는 기능들이 있음
- 유용한 표준 라이브러리
- 디자인 패턴(설계 패턴) 적용하기 좋음
- 어떤 방식으로 구성해 나갈 지 결정하고 나면, 그 결정을 내린 이유를 문서에 적어 두면 좋다. 추가로 생각해 보았지만 채택하지 않은 설계도 이유와 함께 문서에 남기면 좋다.
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