본문 바로가기
C++

C++ 프로그램 디자인

by ChocoPeanut 2017. 7. 13.

C++ 프로그램 디자인

 

코딩에 들어가기 전에 디자인 내용을 형식화하면 각 부분을 어떻게 연결할지 결정하는 데 도움을 준다. 비슷한 부분이 많은 코드를 하나로 묶어서 코드가 지저분해 지는 것을 막을 수도 있게 된다. 또한 다른 시스템과 연동을 할 때에도 이를 염두 해 두고 코드를 짜는 것과 코드를 우선적으로 짜고 나서 연동할 때에는 크게 차이가 발생하게 된다.


C++ 언어는 너무나 많은 기능이 들어가 있다. 객체, 연산자 오버로딩, 예외 처리, 템플릿 등등 여러 다른 기능이 공존하고 있어 디자인 작업을 하는데 어려움을 겪는다. 또한 공용 코드와 재사용 코드를 설계할 수 있는 많은 기능이 있어 디자인을 하는데 신경을 많이 써야한다.


C++ 언어에서 근간이 되는 디자인 원칙은 추상화재사용이다. 추상화는 내부 구현과 외부 인터페이스를 분리하는 것을 의미한다. 추상화의 이점은 사용자가 내부 구현을 알 필요가 없다는 것이다. 인터페이스가 변하지 않는 이상 기능을 알 경우 어떻게 동작을 할 수 있는지에 대한 것은 알 필요가 없어진다. 추상화를 적용시키기 위한 가장 대표적인 방법이 클래스이다. 클래스의 정의는 인터페이스로 개방하고 상세 구현의 내용은 숨긴다. 그래서 사용자는 상세 구현을 모르더라도 인터페이스만을 사용하여 기능을 수행할 수 있게 된다.


재사용은 말 그대로 다시 사용할 코드의 재사용을 고려하는 것이다. 프로그램을 디자인할 때부터 가능한 경우 기존 코드의 재사용이 고려되어야 한다. 재사용을 위해 사용하는 좋은 도구는 바로 템플릿이다. 템플릿을 사용하게 되면 기존에 사용하는 인터페이스를 비슷한 기능을 하는 다른 인터페이스로 사용을 할 수 있게 된다. 예를 들면 체스에 사용하는 2차원 보드 게임 판을 장기나 바둑에도 사용할 수 있게 되는 원리와 같은 것이다. 이를 고려하게 되면 확장성에 있어서도 큰 효율을 가질 수 있다.


재사용을 위해 고려해야 하는 코드는 바로 과거에 직접 작성했던 코드, 동료가 작성한 코드, 재직 중인 조직 바깥에 있는 협력 업체에서 작성한 코드 등이 될 수 있다. 그리고 그것들의 형태는 독립 함수나 클래스 또는 라이브러리, 프레임워크, API 등이 될 수 있다. 사용할 코드가 어떤 기능을 제공하고 제약 사항은 무엇인지 잘 파악하는 것이 중요하다.


알고리즘이나 코드가 어떤 성능을 가지는지 설명할 때 Big-O 표기법을 사용한다. Big-O 표기법은 절대적인 성능이 아니라 상대적인 성능을 나타낸다. 작업 대상 데이터의 크기가 커질 때 소요 시가니 따라서 커지는 비율이 어떻게 달라지는지를 비교하는 것이다.


★★★

프로그램을 디자인할 때 보통 첫 번째로 하는 일은 프로그램을 일반적인 기능을 기준으로 서브시스템별로 분할하고 각 서브시스템 간의 인터페이스와 상호연동을 정의하는 것이다. 데이터를 저장하는 모델이나 가시적으로 표현을 하는 뷰, 어떤 이벤트에 맞추어 데이터를 변경하는 컨트롤러 등 같은 부분을 나누어서 정의를 하게 된다. 이 후 상위 수준에서 몇 개의 스레드를 사용할지, 스레드 간에 어떤 상호 연동을 할지를 고민한다. 예시로 UI 스레드, 오디오 재생 스레드, 네트워크 통신 스레드 등이 있을 수 있다. 다음으로는 클래스 계층에 대한 정의가 이루어진다. 추상화 베이스 클래스와 그 아래에 표현하는 다양한 클래스를 정의할 수 있다. 이 후 세부적으로 클래스 대상 식별, 데이터 구조, 알고리즘 등등을 고려하게 되고 에러 처리를 생각하게 된다.


C++객체지향 프로그래밍을 따른다. 객체지향 프로그래밍은 프로그램을 작업 단위로 쪼개는 것이 아니라 물리적 객체의 모델로 쪼갠다. 물리적 객체는 클래스, 컴포넌트, 프로퍼티, 행동이라는 용어를 통해 생각하면 쉽다.


객체 간의 관계는 크게 has-ais-a 두 가지 종류가 있다. Has-aAB를 가질 때 또는 포함할 때를 의미하는 것이다. 이런 종류의 관계는 어떤 객체는 어떤 객체가 다른 객체의 부분이 되는 것을 나타낸다. is-a 관계는 무엇은 무엇의 한 종류라는 뜻으로 사용된다. 객체지향 프로그래밍에서는 상속이라는 용어로 사용되며 공통의 부분을 가질 때 사용이 많이 된다.