728x90

c++ 100

24.08.30 CS, C++

CS상태(State) 패턴상태 패턴은 객체가 특정 상태에 따라 행위를 달리하는 상황에서, 상태를 조건문으로 검사해서 행위를 달리하는 것이 아닌, 상태를 객체화하여 행동을 할 수 있도록 위임하는 패턴을 말한다.객체 지향 프로그래밍에서의 클래스는 꼭 사물/생물 만을 표현하는 고체 형태의 데이터만 표현 할 수 있는게 아니다. 경우에 따라 무형태의 행위/동작도 클래스로 묶어 표현할 수 있다.그래서 상태를 클래스로 표현하면 클래스를 교체해서 상태의 변화를 표현할 수 있고, 객체 내부 상태 변경에 따라 객체의 행동을 상태에 특화된 행동들로 분리해 낼 수 있으며, 새로운 행동을 추가하더라도 다른 행동에 영향을 주지 않는다.여기서 상태란 객체가 가질 수 있는 어떤 조건이나 상황을 의미한다.이처럼 객체가 특정 상태에 따..

24.08.29 CS, C++

CS템플릿 메소드(Template Method)템플릿 메서드 패턴은 여러 클래스에서 공통으로 사용하는 메서드를 템플릿화 하여 상위 클래스에서 정의하고, 하위 클래스마다 세부 동작을 다르게 구현하는 패턴이다.즉, 변하지 않는 기능(템플릿)은 상위 클래스에 만들어두고 자주 변경되며 확장할 기능은 하위 클래스에서 만들도록 하여, 상위의 메소드 실행 동작 순서는 고정하면서 세부 실행 내용은 다양화 될 수 있는 경우에 사용된다.템플릿 메소드 패턴은 상속이라는 기술을 극대화하여, 알고리즘의 뼈대를 맞추는 것에 초점을 둔다. 이미 수많은 프레임워크에서 많은 부분에 템플릿 메소드 패턴 코드가 우리도 모르게 적용되어 있다.템플릿 메서드 패턴 구조AbstractClass(추상 클래스)템플릿 메소드를 구현하고, 템플릿 메소..

24.08.28 CS, C++

CS전략(Strategy) 패턴전략 패턴은 실행(런타임) 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 하는 행위 디자인 패턴이다. 여기서 전략이란 일종의 알고리즘이 될 수도 있으며, 기능이나 동작이 될 수도 있는 특정한 목표를 수행하기 위한 행동 계획을 말한다.즉, 어떤 일을 수행하는 알고리즘이 여러가지 일때, 동작들을 미리 전략으로 정의함으로써 손쉽게 전략을 교체할 수 있는, 알고리즘 변형이 빈번하게 필요한 경우에 적합한 패턴이다.전략 패턴 구조전략 알고리즘 객체들알고리즘, 행위, 동작을 객체로 정의한 구현체전략 인터페이스모든 전략 구현체에 대한 공용 인터페이스컨텍스트(Context)알고리즘을 실행할 때마다 해당 알고리즘과 연결된 전략 객체의 메소드를 호출한다.클라이언트특..

언어/C++ 2024.08.28

24.08.27 CS, C++

CS객체 지향 설계의 5가지 원칙 - S.O.L.I.DSOLID 원칙이란 객체 지향 설계에서 지켜줘야 할 5개의 소프트웨어 개발 원칙을 말한다.SRP(Single Responsibility Principle) 단일 책임 원칙OCP(Open Closed Principle) 개방 폐쇄 원칙LSP(Listov Substitution Principle) 리스코프 치환 원칙ISP(Interface Segregation Principle) 인터페이스 분리 원칙DIP(Dependency Inversion Principle) 의존 역전 원칙SOLID 설계 원칙은 OOP의 4가지 특징(추상화, 상속, 다형성, 캡슐화)와 더불어, 객체 지향 프로그래밍의 단골 질문 중 하나이다.좋은 소프트웨어란 변화에 대응을 잘 하는 것을..

24.08.26 CS, C++

24.0CSISP(인터페이스 분리 원칙)ISP 원칙이란 범용적인 인터페이스 보다는 클라이언트(사용자)가 실제로 사용하는 Interface를 만들어야 한다는 의미로, 인터페이스를 사용에 맞게 끔 각기 분리해야 한다는 설계 원칙이라고 보면 된다.만약 인터페이스의 추상 메서드들을 범용적으로 이것저것 구현한다면, 그 인터페이스를 상속받은 클래스는 자신이 사용하지 않는 인터페이스마저 억지로 구현해야 하는 상황이 올 수도 있다. 또한 사용하지도 않는 인터페이스의 추상 메소드가 변경된다면 클래스에서도 수정이 필요하게 된다.즉, 인터페이스 분리 원칙이란 인터페이스를 잘게 분리함으로써, 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공하는 것이다.인터페이스 분리 원칙은 마치 단일 책임 원칙과 비슷하게 보이는데, S..

24.08.22 CS, C++

CS상속과 합성프로그래밍을 할 때 가장 신경 써야 할 것 중 하나가 바로 코드 중복을 제거하여 재사용 함으로써 변경, 확장을 용이하게 만드는 것이다.상속과 합성은 객체지향 프로그램에서 가장 널리 사용되는 코드 재사용 기법이다.상속(Inheritance) 합성(Composition)부모 클래스와 자식 클래스 사이의 의존성은 컴파일 타임에 해결두 객체 사이의 의존성은 런타임에 해결is-a 관계has-a 관계부모 클래스의 구현에 의존 결합도가 높다구현에 의존하지 않는다.내부에 포함되는 객체의 구현이 아닌 인터페이스에 의존한다. 클래스 사이의 정적인 관계객체 사이의 동적인 관계부모 클래스 안에 구현된 코드 자체를 물려 받아 재사용포함되는 객체의 퍼블릭 인터페이스를 재사용상속(Inheritance) 이란상속은 객..

Set / Unordered Set

Set정의set은 균형 이진 트리(일반적으로 레드-블랙 트리)로 구현된 정렬된 집합이다.특징정렬된 순서 : 원소들이 자동으로 정렬된 상태로 저장된다.탐색 시간 : 삽입, 삭제 검색 연산의 평균 시간 복잡도는 O(log n)이다.순회 : 원소들을 순회할 때 항상 정렬된 순서로 순회한다.사용 예데이터가 항상 정렬된 상태로 필요할 때특정 범위의 원소들을 빠르게 찾을 때게임 내 순위 리스트게임 내에서 플레이어 점수 또는 순위 리스트를 관리할 때, 점수를 정렬된 상태로 유지해야 할 때 사용된다.자동으로 정렬된 상태로 저장되기 때문에, 순위를 빠르게 검색하거나 특정 범위의 순위를 쉽게 추출할 수 있다.퀘스트 트래킹플레이어가 완료한 퀘스트를 추적하고, 완료한 순서대로 정렬하여 저장할 대 유용하다.완료한 퀘스트를 정렬..

언어/C++ 2024.06.18

STL 컨테이너

C++STL 컨테이너벡터(Vector)동적 배열(크기 조절 가능), 배열과 같이 연속된 자료구조이므로 캐시 친화적이다. 임의 접근 반복자(random access iterator)를 사용하므로 배열의 원소에 즉시 접근 가능하다.emplace를 하면 복제 과정 없이 바로 원소를 삽입할 수 있어서 push_back보다 비용이 절감된다. 반복자 무효화가 발생할 수 있다.반복자 무효화컨테이너의 메모리가 재할당 될 때(vector resize, push_back)나 요소 삭제를 하는 등의 동작에서 발생할 수 있다.만약 STL의 erase를 사용한다면 erase한 원소 포함해서 뒤의 원소를 가리키는 모든 반복자가 무효화된다. 이는 삭제 후 뒤에 있는 요소를 모두 땡겨줘야 하기 때문이다.단, erase 함수는 다음 ..

언어/C++ 2024.06.16

24.06.13 C++

C++RAII와 동적메모리 자원 관리RAII(Resource Acuquisition Is Intialization)는 C++에서 강조되는 디자인 테크닉 중 하나이다.C++ 프로그래밍에서 자원의 획득과 해제를 객체의 생명 주기와 결합하여 자동으로 관리하는 기법이다.이 기법은 메모리, 파일 핸들, 소켓 등 다양한 자원을 효율적으로 관리하고, 자원 누수(Resource Leak)를 방지하는 데 매우 유용하다.기본 개념RAII의 핵심 아이디어는 객체가 생성될 때 자원을 획득하고, 객체가 소멸될 때 자원을 해제하는 것이다.이 방식은 C++ 소멸자(destructor) 호출 메커니즘을 활용하여 자원을 자동으로 정리해준다.장점자동 자원 해제객체의 생명 주기가 끝날 때 자동으로 자원을 해제하여 자원 누수를 방지한다.예..

포인터 변수와 참조, Malloc과 New

포인터 변수와 참조, Malloc과 New참조자(reference)실체가 있어야 하며 선언 즉시 할당되어야 한다. 즉 NULL, nullptr로 할당 불가능하다.레퍼런스는 초기화리스트를 사용하여 먼저 초기화해야하는데(modern c++의 초기화리스트와는 다르다. 생성자의 초기화리스트를 의미한다.) 이는 생성자 내부에서의 초기화는 먼저 null로 생성한 뒤 값을 넣는 방식이기 때문이다. 또한 한번 할당하면 다른 곳에 재할당 불가능하다.포인터(Pointer) 타입 변수주소값을 저장할수 있는 타입의 변수이다.실체가 없이 NULL이 가능하며, 언제든 할당할 수 있다. 또한 동적 메모리 할당에 사용된다.Malloc과 New의 차이Malloc : 단순한 메모리 할당, 할당 시 메모리의 사이즈를 입력해서 할당받는다...

언어/C++ 2024.06.12
728x90