본문 바로가기
반응형

C++93

C++ - 의존 역전 원칙 (DIP, Dependency Inversion Principle) C, C++ 전체 링크 Architecture & Design Pattern 전체 링크 참고 - 팩토리 메서드 패턴 의존 역전 원칙 (DIP, Dependency Inversion Principle) - 구체화에 의존하지 말고 추상화에 의존해야 한다. - 상위 모듈은 하위 모듈에 의존해서는 안 되며, 모든 모듈은 추상화된 것에 의존해야 한다. - 이 원칙으로 하위 모듈의 변경이 상위 모듈에 영향을 주지 않고, 상위 모듈이 하위 모듈에 종속되지 않도록 한다. - 예를 들어, DB 연결과 같은 하위 모듈에 대한 의존성을 해결하기 위해 인터페이스를 제공하고, 상위 모듈은 해당 인터페이스를 구현하게 하여 실제 코드가 변경되더라도 상위 모듈에 영향을 미치지 않게 된다. 먼저 아래의 의존 역전 원칙 위반 사례를 보.. 2024. 2. 12.
C++ - 데코레이터 패턴 (Decorator Pattern) C, C++ 전체 링크 Architecture & Design Pattern 전체 링크 참고 - 클래스 다이어그램 그리기 - 스마트 포인터 : unique_ptr - 템플릿으로 클래스 상속하기 데코레이터 (Decorator Pattern) - 구조 패턴 - 기존 객체의 동작을 수정하지 않고, 그 객체의 기능을 확장하거나 수정하는 패턴 - 런타임에 동적으로 객체의 기능을 추가하거나 수정할 수 있다. 구현 - Component : 데코레이터와 구체적인 컴포넌트를 동일한 타입으로 처리하는 추상 클래스 / 인터페이스 - ConcreteComponent : 기본 동작을 구현하는 컴포넌트 - Decorator : 컴포넌트를 상속하고, 동적으로 기능을 추가, 변경하는 메서드를 가지는 추상 클래스 / 인터페이스 - C.. 2024. 2. 10.
C++ - 복합체, 컴포지트 패턴 (Composite Pattern) C, C++ 전체 링크 Architecture & Design Pattern 전체 링크 참고 - 반복자, 이터레이터 패턴 (Iterator Pattern) - 스마트 포인터 : unique_ptr 복합체, 컴포지트 패턴 (Composite Pattern) - 구조 패턴 - 객체들을 트리 구조로 구성하여 부분-전체 계층 구조(part-whole hierarchy)를 표현하는 패턴 - 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체(composite)를 똑같은 방식으로 다룰 수 있다. 구현 - Component (구성 요소) : 인터페이스 또는 추상 클래스를 정의, 복합 객체와 개별 객체에 공통된 동작을 정의 - Leaf (원소) : Component를 구현, 단일 객체, 메서드를 구현 - Com.. 2024. 2. 9.
C++ - 반복자, 이터레이터 패턴 (Iterator Pattern) C, C++ 전체 링크 Architecture & Design Pattern 전체 링크 참고 - 연산자 오버로딩을 이용하여 구조체 출력하기 - 클래스 다이어그램 그리기 - 스마트 포인터 : unique_ptr 반복자, 이터레이터 패턴 (Iterator Pattern) - 행동 패턴 - 객체의 컬렉션을 순회하고 요소에 접근할 수 있는 방법을 제공하는 패턴 - 컬렉션의 요소에 대한 구체적인 구현을 노출시키지 않고 컬렉션을 순회 구현 - Iterator (반복자) : 컬렉션의 요소를 순회하고 접근하는 인터페이스, next()와 hasNext()를 제공 - ConcreteIterator : Iterator 인터페이스를 구현하여 실제 컬렉션에 대한 순회 및 접근 동작 구현 - Aggregate (집합체) : 어떤.. 2024. 2. 4.
C++ - 옵저버 패턴 (Observer Pattern) C, C++ 전체 링크 Architecture & Design Pattern 전체 링크 옵저버 패턴 (Observer Pattern) - 행동 패턴 - 객체 간의 일대다 종속성을 정의하는 패턴 - 객체의 상태가 변경될 때, 해당 객체에 종속된 다른 객체들이 자동으로 알림을 받아 갱신하도록 한다. 구현 - 주제(Subject) 객체는 옵저버들을 관리하고 상태의 변경을 감지하고, 옵저버들에게 알림을 보낸다. - 옵저버(Observer) 객체는 주제의 상태 변경을 감지하고 처리한다. - 주제와 옵저버 클래스를 추상화하여 각각의 기본 동작을 정의하고 구체적인 클래스를 구현한다. 장점 - OCP(개방-폐쇄 원칙), 기존 코드를 변경하지 않고 새로운 주제나 옵저버를 추가할 수 있다. - 주제와 옵저버의 관계가 느슨.. 2024. 1. 30.
C++ - 전략, 스트래티지 패턴 (Strategy Pattern) C, C++ 전체 링크 Architecture & Design Pattern 전체 링크 참고 - 클래스 다이어그램 그리기 - 인터페이스 vs 추상 클래스 (Java, C++ 비교) - 스마트 포인터 : unique_ptr 전략, 스트래티지 패턴 (Strategy Pattern) - 행동 패턴 - 알고리즘을 캡슐화하여 동적으로 교체할 수 있도록 하는 패턴 - 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다. 구현 - 전략 패턴에서 사용할 각 알고리즘에 대한 인터페이스를 정의 (전략 인터페이스, Strategy Interface) - 정의된 인터페이스를 구현하여 알고리즘을 구체화하는 전략 클래스 작성 (구체적인 전략, Concrete Strategies) - 컨텍스트 클래스에 전략 객체.. 2024. 1. 29.
C++ - 싱글턴 패턴 (Singleton Pattern) C, C++ 전체 링크 Architecture & Design Pattern 전체 링크 참고 - call_once로 함수를 한 번만 호출하기 - atomic으로 원자적 연산 처리하기 (vs mutex) 싱글턴 패턴 (Singleton Pattern) - 생성 패턴 - 특정 클래스에 대해 객체 인스턴스가 하나만 만들어지도록 하고, 전역 접근을 제공하는 패턴 - 전역 변수에 객체를 대입하면 Application이 시작되고 종료되기까지 자원을 차지하지만, 싱글턴 패턴은 필요할 때만 객체를 만들 수 있다. - 실제로 객체가 필요하면 인스턴스를 직접 만들지 않고, 인스턴스를 요청하도록 구현한다. (getInstance) 구현 - 다른 객체에서 new 연산자를 사용하지 못하도록 생성자를 private으로 정의 - .. 2024. 1. 26.
C++ - atomic으로 원자적 연산 처리하기 (vs mutex) C, C++ 전체 링크 원자성 (Atomicity) - 연산이 도중에 중단되지 않고 전체가 완료되거나 전혀 수행되지 않는 것 - 원자성이 지켜져야 멀티스레드 환경에서 데이터의 일관성을 유지하고 동시성 문제를 해결할 수 있다. 다음 코드를 실행해 보자. #include #include using namespace std; int counter; void incrementCounter() { for (int i = 0; i < 1000000; i++) counter++; } int main() { thread t1(incrementCounter); thread t2(incrementCounter); t1.join(); t2.join(); cout 2024. 1. 26.
C++ - call_once로 함수를 한 번만 호출하기 C, C++ 전체 링크 test 함수는 처음 호출 되는 경우에만 init을 수행한다. #include using namespace std; bool first; void test() { if (first == false) { first = true; cout 2024. 1. 24.
반응형