티스토리 뷰
🟩 오늘의 목표
- 코드의 작성(선언→정의)과 실행(Main→호출) 흐름의 차이를 이해한다.
- 클래스 캡슐화와 템플릿을 활용해 메모리를 직접 관리하는 인벤토리를 설계한다.
- STL의 구성 요소를 이해하고, 컨테이너와 알고리즘을 활용하여 생산성을 높인다.
- 객체지향 프로그래밍 기반의 설계를 수행하고 응집도, 결합도, SOLID 원칙을 익힌다.
🟧 1. 코드의 작성 vs 실행 흐름 (Process)
🟦 작성 순서 (Top-Down)
- 선언 > 정의 > 실행: 코드는 위에서 아래로 읽히기 때문에 컴파일러가 알 수 있도록 선언을 먼저 하고 정의를 채운 뒤 Main에서 사용함.
🟦 실행 순서 (Jumping)
- Main 함수 중심: 프로그램은 Main에서 시작하며, 함수를 호출하면 실행 흐름이 정의부로 **점프(Jump)**했다가 실행이 끝나면 다시 Main으로 복귀함.
- 생명 주기: Main이 종료되기 직전, 스택에 있던 객체들의 소멸자가 호출되며 마무리됨.
🟧 2. 클래스 설계와 메모리 관리
🟦 정보 은닉과 다형성
- 캡슐화: private으로 데이터를 보호하고, public Getter를 통해 안전하게 접근함.
- 생성자 오버로딩: 이름은 같지만 매개변수가 다른 함수를 여러 개 만들어 다양한 방식으로 객체를 생성함.
🟦 템플릿과 동적 할당
- 범용성: template<typename T>를 사용해 타입에 독립적인 "빵틀" 구조를 설계함.
- 동적 관리: new로 힙(Heap) 영역에 메모리를 직접 할당하며, 배열 할당 시에는 반드시 **delete []**를 호출해야 메모리 누수를 막을 수 있음.
🟦 메모리 구조 (Stack vs Heap)
- 스택(Stack): 함수 종료 시 자동으로 삭제되어 관리가 편리함.
- 힙(Heap): 개발자가 직접 관리하는 영역으로, new와 delete의 짝을 맞추는 것이 핵심임.
🟧 3. STL(Standard Template Library)의 활용
🟦 컨테이너 (Container)
- 벡터(vector): 크기가 자동 조정되는 동적 배열. 임의 접근이 빠르며 맨 뒤 삽입/삭제가 효율적임.
- 맵(map): 키-값(Key-Value) 쌍으로 저장하며 키를 기준으로 자동 정렬되는 연관 컨테이너임.
🟦 알고리즘과 반복자
- sort/find: 컨테이너의 내부 구현을 몰라도 사용할 수 있는 범용 함수임.
- 반복자(Iterator): 컨테이너와 알고리즘 사이를 잇는 다리 역할로, 일관된 방식으로 요소를 순회하게 함.
🟧 4. 객체지향 설계 핵심 (Cohesion & Coupling)
🟦 응집도 (Cohesion)
- 모듈 내부 요소들이 얼마나 밀접한지 나타내며, 높은 응집도가 좋은 설계임. (예: 피자 클래스에는 피자 관련 기능만 넣기)
🟦 결합도 (Coupling)
- 모듈 간의 의존성을 나타내며, 낮은 결합도가 좋은 설계임. 인터페이스를 활용해 특정 클래스에 직접 의존하지 않게 설계해야 함.
🟧 5. SOLID 설계 원칙
- SRP (단일 책임): 클래스는 하나의 책임만 가져야 함.
- OCP (개방 폐쇄): 확장에는 열려 있고 수정에는 닫혀 있어야 함.
- LSP (리스코프 치환): 자식 클래스는 부모 클래스의 역할을 완전히 대체할 수 있어야 함.
- ISP (인터페이스 분리): 사용하지 않는 메서드에 의존하지 않도록 인터페이스를 세분화함.
- DIP (의존 역전): 구체적인 구현이 아닌 '추상화(인터페이스)'에 의존해야 함.
🟫 오늘 느낀 점
- C++의 실행 원리와 메모리 관리의 기초를 다진 후, 이를 자동화한 STL과 객체지향의 정수인 SOLID 원칙을 연결하며 견고한 코드를 짜는 법을 체감함.