c++ 8

[C++] 컴포짓 패턴 (Composite pattern)

객체의 포함관계를 나타내는 패턴입니다. 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다. https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%8F%AC%EC%A7%80%ED%8A%B8_%ED%8C%A8%ED%84%B4 위의 코드를 구현해 보겠습니다. 간단히 아래와 같이 마우스 우클릭 메뉴라고 상상해보시면 됩니다. Component는 Composite와 Leaf를 동일한 목적으로 사용하기 위해 만든 공통의 조상 클래스 입니다. Leaf 클래스는 는 하위 메뉴가 없는 선택 가능한 메뉴로 operation() 을 수행합니다. Composite 클래스는 add()와 remove()로 하위 메뉴를 추가..

Pattern/C++ 2021.04.07

[C++] 템플릿 메소드 패턴 (Template method pattern)

동작 상의 알고리즘의 프로그램 뼈대를 정의하는 행위 디자인 패턴이다. 알고리즘의 구조를 변경하지 않고 알고리즘의 특정 단계들을 다시 정의할 수 있게 해준다. - https://ko.wikipedia.org/wiki/%ED%85%9C%ED%94%8C%EB%A6%BF_%EB%A9%94%EC%86%8C%EB%93%9C_%ED%8C%A8%ED%84%B4 동작 상 흐름의 뼈대가 되는 부분은 변하지 않게 정의하고, 변하는 부분만 파생 클래스에서 재정의할 수 있도록 만든 패턴입니다. 부모 클래스에서는 뼈대가 되는 부분은 private이나 protected로 정의하여 외부에서 건들지 못하게 하고, 변해야 하는 부분은 public으로 정의하여 파생 클래스에서 재정의할 수 있도록 합니다. 이런 동작을 통해 코드의 중복을 ..

Pattern/C++ 2021.03.21

[C++] 프로토타입 패턴 (Prototype pattern)

객체를 복사하여 새로운 객체를 만들 때 사용하는 패턴입니다. 객체를 새로 생성할 때, 객체의 타입을 프로토타입인 인스턴스로부터 결정되도록 하며, 인스턴스는 새 객체를 만들기 위해 자신을 복제(clone)하는 패턴. https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85_%ED%8C%A8%ED%84%B4 객체를 생성할 때 런타임 시 new를 사용하지 않고 clone하기 때문에 내부의 변수(속성, attribute)들이 그대로 복제됩니다. new를 사용하면 내부의 변수들은 초기화된 상태로 새 객체가 생성됩니다. 이를 위해 부모클래스에서 virtual 함수로 Clone()을 정의해 주어야 합니다. #include using nam..

Pattern/C++ 2021.03.21

[C++] interface와 결합(Coupling)

interface는 객체 지향 프로그래밍에 있어서 중요한 개념입니다. 객체 지향 프로그래밍에서 중요시하는 여러 아이템이 있지만 그 중 하나가 코드 수정을 최소화하는 것입니다. 이를 위해 강한 결합 (객체 간 직접 참조)을 최소화하고 약한 결합을 지향합니다. 객체가 추가되거나 삭제되어도 이를 이용하는 소스에 변화가 발생하지 않도록 하자는 것입니다. 아래의 예시 코드가 강한 결합의 예입니다. 원래 Bus만 운전하던 Driver가 있습니다. 그런데 Truck이 새로 생겼습니다. 이 Driver는 Truck을 운전하기 위해 본인의 클래스에 go(Truck) 에 대한 함수를 추가해야만 했습니다. #include using namespace std; class Bus { public: void accelerator..

Pattern/C++ 2021.03.20

[C++] 추상 클래스 (abstract class)

함수의 구현부가 없이 =0 으로 종결한 함수를 순수 가상 함수(pure virtual function) 이라고 부릅니다. 그리고 이러한 함수를 하나라도 가진 클래스를 추상 클래스(abstract class) 라고 부릅니다. class Color { public: virtual void code() = 0; }; 추상 클래스는 객체를 생성할 수 없습니다. 단, 포인터 변수는 생성할 수 있습니다. Color color; // 실패 Color* color; // 성공 추상 클래스를 사용하는 이유는 파생 클래스에게 이 함수는 반드시 구현해야 내 카테고리에 속할 수 있다를 알리기 위함입니다. 만약, 파생 클래스가 해당 함수의 실체를 (override하여) 구현하지 않으면 해당 파생 클래스 또한 추상 클래스가 됩니..

Pattern/C++ 2021.03.20

[C++] Upcasting, Downcasting, Virtual, Override

자식 클래스의 참조 또는 포인터를 부모 클래스의 참조, 포인터로 변환하는 것을 Upcasting이라 합니다. 반대로 부모 클래스의 참조, 포인터를 명시적인 형변환을 통해 자식 클래스로 변환하는 것을 Downcasting이라 합니다. Bus 클래스가 Car 클래스를 상속할 때, 각각 아래의 경우를 나타냅니다. class Car {} class Bus : public Car {} int main() { Bus bus; Car* car = &bus; // Upcasting Car car; Bus* bus = (Bus*)&car; // Downcasting } 아래의 코드를 한 번 실행해 보겠습니다. #include using namespace std; class Car { int speed; public: v..

Pattern/C++ 2021.03.20

Visual Studio 설치

C++을 컴파일하기 위해서는 Visual Studio가 필요합니다. 요즘은 Visual Studio Code에서도 플러그인을 사용하여 가능한 것 같습니다만 정석대로 가보겠습니다. 개인이 아닌 경우 무료 사용이 불가하기 때문에 사업을 위해 구매하시거나 Visual Studio Code로 설치하시는 것을 추천 드립니다. (아니면 리눅스 환경으로...) 아래 페이지에서 커뮤니티 버전을 다운로드 받아 설치합니다. - visualstudio.microsoft.com/ko/downloads/ 저는 .NET과 C++ 두 가지를 선택하고, 설치를 누릅니다. 넷플릭스에서 드라마 두 편 정도 보고오니 다시 시작하라고 하네요. 다시 시작하고 옵니다. Visual Studio 2019를 실행하면 이런걸 묻는데 저는 나중에 로..