요즘은 사내에서 C++ 교육을 듣고 있다.
SW 입문교육이라고 해서 만만하게 보고 입과했는데, 이건 입문이 아니다.
최소 중급은 되어야 수업을 따라갈 수 있을 것 같다.
결론은 지금 수업을 하나도 못따라가서 죽겠다.
맨날 죽어라고 새벽까지 해도 힘들다.
회사에서 맨날 무시당하면서 자존감도 깎이고, 점차 해도 안된다는 패배감이 자꾸 고개를 든다.
조금만... 조금만 더 버텨보자. 언제까지일지 모르겠지만, 그래도 버텨보자.
그렇다고 정말로 죽을 수는 없으니까..
여기에는 배운 것들 중 아주 일부인 UML에 따른 코드와 이곳에 사용된 디자인패턴과 기술 등을 분석하려고 한다.
간단히 말하면 그냥 구조도에 따른 구현 순서별 코드 분석이다.
더해서, 나는 평생 C++를 해보지 않았다. 대학교1학년2학기빼고
그래서 이 구조도대로 내부 함수를 전부 구현하는 것이 아니라 그저 호출 로그 정도만 구현하고,
제일 핵심은 구조도 대로 구성을 할 수 있는가에 초점을 맞췄다.
자, 시작한다.
먼저 UML 구조도는 아래와 같다.
일단 이 구조도를 하나씩 뜯어서 각각이 어떤 것을 의미하는지부터 해석해보자.
여기서 점선과 빈 삼각형으로 이루어진 화살표는 구현을 의미한다.
따라서 BaseManager가 인터페이스이고, CommunicationManager는 BaseManager가 구현되어 있는 구현 클래스이다.
이 부분은 조금 중요하다.
채워진 마름보는 Compositon(합성) 관계를 의미한다.
따라서 위 그림은 CommunicaitonManager가 하나만 존재하고,
CommunicationInterface는 하나 이상 여러 개 존재가 가능하다는 뜻이다.
그리고 Composition(합성) 관계는 강하게 소유하는 것이다.
다시 정리하면 CommunicationManager는 하나 이상의 CommunicationInterface 객체를 강하게 소유하기에
이에 따라 CommunicationManager가 소멸되면 그에 연결된 CommunicationInterface 객체들도 함께 소멸된다.
즉, 생명주기가 CommunicationManager에게 종속되며, 부분이 전체에 종속되는 전체-부분 관계를 나타낸다.
Compositon과 대비되는 Aggregation도 있는데, 이런 UML과 관련된 내용은 별도로 다루도록 하겠다.언제가 될지는 모르지만 일단 미뤄!
다음은 MessageParser와 CommunicationManager 간의 관계이다.
이 관계는 Association(연관) 관계이다.
C++ 클래스 간의 가장 기본적이고 널리 사용되는 관계라고 한다.
CommunicationManager가 MessageParser를 참조하거나 사용하는 관계이다.
즉, CommunicationManager 안에서 MessageParser 객체를 멤버 변수로 가지고 있거나,
함수 인자로 받아서 호출한다는 의미이다.
자 그러면 일단 이 구조도를 이해하기 위해 필요한 기호는 다 알아봤다.
이번에는 실제 구현과 함께 코드를 보면서 이해해보자.
그리고 그 코드에 사용된 C++ 문법도 같이 정리해보려고 한다.
구현 순서는 아래와 같다.
(1) 인터페이스: 추상 설계
├── BaseManager ✅
├── MessageParser ✅
└── CommunicationInterface ✅
(2) 인터페이스 구현체: 구체적 동작
├── RaderMessageParser ✅
├── MissileMessageParser ✅
├── ATSMessageParser ✅
├── TCP ✅
└── UDP ✅
(3) 조립자 / 중심 클래스
└── CommunicationManager ✅
(4) main() 테스트
1️⃣ BaseManager, MessageParser, CommunicationInterface 기초 뼈대, 구현 클래스들이 이걸 기반으로 작성되기 때문에 제일 먼저 필요
2️⃣ TCP, UDP, RaderMessageParser 등 위 인터페이스를 상속받아 구현해야 하므로 그다음
3️⃣ CommunicationManager 내부에서 위 구현체들을 멤버로 조합해서 사용하므로 맨 마지막
4️⃣ main() 모든 클래스 조합 테스트, 실제 객체 생성과 흐름을 시뮬레이션
[인터페이스 정의]
↓
[구현체: TCP, UDP, Parser들]
↓
[조립 클래스: CommunicationManager]
↓
[실행 진입점: main()]
여기까지 구조도와 구조도를 바탕으로 한 구현 순서를 알아보았다.
다음 게시물부터는 작성한 코드를 정말 한줄 한줄 분석하고, 문법에 대해서도 설명하고 다음으로 넘어가며 설명하겠다. 타고 타고 뎁스를 내려가면서 설명하고 다시 나와서 다음으로 넘어갈꺼라 굉장히 오래 걸리리라 생각한다.
아니 근데 여기까지 정리하는 것도 되게 오래 걸렸는데, 정리하고 보니꺼 얼마 되지도 않네.되게 억울하네...