분류 전체보기 50

[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

[Visual Studio] PlantUML 설치 및 사용

한때 Star UML을 사용하여 UML을 그리고는 했습니다. 그러다가 점차 귀찮아져서 파워포인트로 대충 그리기 시작했었습니다. 최근에는 Visual Studio에 확장 프로그램 형태로 PlantUML을 사용할 수 있다는 것을 발견하고 애용하고 있습니다. 1. Ctrl + Alt + X 를 누른 후 plantuml을 검색하여 설치합니다. 2. Ctrl + N 을 눌러 새 파일을 열고 간단하에 내용을 작성한 후 Alt + D 키를 누릅니다. @startuml a -> b @enduml 네 다 됐습니다. 정말 간단하게 사용할 수 있습니다. PlantUML이 좋은 점은 이런 간단한 사용법 외에도 가이드가 한국어로도 잘 되어있다는 점입니다. - plantuml.com/ko/ 가이드 페이지의 상단을 보시면 시퀀스 ..

Utility 2021.03.31

[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

Node.js 설치 및 Helloworld 실행

1. Node.js 홈페이지에서 본인의 사양에 맞는 버전을 다운로드 받아 설치합니다. nodejs.org/en/download/ 저는 아래 옵션을 선택하여 이것저것 자동으로 설치해 보았습니다. Command 창에서 node 를 실행해서 잘 설치가 된 것을 확인합니다. 2. 프로젝트 생성 프로젝트를 생성할 디렉토리로 이동 후 npm init 을 입력합니다. 프로젝트 세팅에 대한 내용들입니다. 우선 연습용에서는 크게 연연하지 않고 엔터키로 계속 넘어갑니다. > npm install 이 내용들은 해당 디렉토리에 package.json 파일로 저장됩니다. 다음은 npm install express 를 입력합니다. express는 간단하게 서버를 구현할 때 사용하는 Node.js 용 웹 프레임워크입니다. > np..

Node.js 2021.03.21

Ubuntu 20.04 에 Samba 설치하여 Windows에서 연결하기

Windows에서 탐색기를 통해 Linux 서버에 연결하기 위해 Samba를 사용합니다. Samba는 SMB(Server Message Block) 네트워크 프로토콜을 이용하여 Windows와 연결, 파일을 주고받거나 print 서비스를 가능케 하는 오픈 소스 소프트웨어 입니다. Windows에서 SFTP를 사용하여 Linux와 파일을 주고받을 수도 있지만 samba만큼 편하지는 않기 때문에 samba를 설치해 보겠습니다. 1. samba 설치 $ sudo apt-get install samba $ sudo smbpasswd -a 2. 사용자 추가 기존에 사용자 추가했던 아이디 중 권한을 부여할 아이디를 넣습니다. 비밀번호를 설정합니다. $ sudo smbpasswd -a 3. smb.conf 설정 $ ..

환경설정/Ubuntu 2021.03.20

[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