Outdated/Column 11

[Design Pattern] 브릿지 패턴(bridge pattern)

목차브릿지 패턴Pimpl 관용구정리하며참고자료 1. 브릿지 패턴개요브릿지 패턴(bridge pattern)은 구현부에서 추상층을 분리해 각자 독립적으로 변형과 확장이 가능하도록 하는 패턴이다. 브릿지 패턴을 적용하면 두 계층 모두 추상화된 상위 타입을 가지게 되고, 의존성은 상위 타입 간에만 이뤄지게 된다. 이를 통해 실제 의존성이 발생하더라도 서로의 구체 타입은 알 수 없도록 한다. 이렇게 되면 두 계층의 결합도가 약화되어, 양쪽 모두가 독립적으로 변경과 확장이 가능한 상태가 된다. 따라서 컴포넌트 간 다양한 조합이 가능할 때 효과적이다. 구조구조는 다음과 같다. 실제 구현은 모두 인터페이스에 위임(delegation)하는 형태가 된다. 2. Pimpl 관례Pointer to Implementation..

Outdated/Column 2020.04.11

[Design Pattern] 팩토리 패턴(factory pattern)

목차생성자 다시보기팩토리정리하며참고자료 1. 생성자 다시보기생성자의 첫 번째 단점생성자에게는 두 가지 단점이 있다. 첫 번째는 메소드 이름이 항상 타입과 같은 이름을 가져 이름에 추가적인 정보를 표시할 수가 없다는 것이다. 다음의 예시를 보자. 좌표점을 나타내기 위해 Point 클래스를 설계하였고, 직교 좌표계와 극 좌표계를 모두 지원하려고 한다. class Point{ float x, y; float distance, radian; public: // 직교 좌표계를 위한 생성자 Point(float x, float y) : x{ x }, y{ y } { // ... } // 극 좌표계를 위한 생성자 Point(float distance, float radian) : distance{ distance }..

Outdated/Column 2020.03.24

[Design Pattern] 프로토타입 패턴(prototype pattern)

목차프로토타입 패턴이란?복사 연산 이용하기직렬화팩토리 패턴과의 결합정리하며참고자료 1. 프로토타입 패턴이란?객체를 생성할 때 종종 다른 객체의 값을 복사하여 사용할 때가 있다. 특히, 객체의 멤버 중 공통된 부분이 있다면 이것을 일일이 초기화 하기 보다는 어떤 객체를 잘 설정해놓고 복사하는 편이 효율적이다. 프로토타입 패턴(prototype pattern)은 그 이름에서 유추할 수 있듯 어떤 객체에 대한 프로토타입을 만들어 놓고 그것을 복사하는 패턴이다. C++로 프로토타입을 구현하는 방법에는 2가지가 있다. 하나는 복사 연산을 이용하는 것이고, 다른 하나는 직렬화를 사용하는 것이다.2. 복사 연산 이용하기복사 연산을 이용한 프로토타입 패턴 구현은 아래와 같이 될 것이다. class Undergradua..

Outdated/Column 2020.03.22

[OOP] 객체 간 관계, 클래스 간 관계

목차1. 들어가며2. 클래스 간 관계3. 객체 간 관계4. 참고자료1. 들어가며프로그램을 개발할 때 우리는 단일 객체만을 사용하지 않는다. 여러 클래스와 여러 객체를 생성하고 사용하게 된다. 이렇게 만든 클래스, 객체 사이에는 여러 관계가 생기게 되는데, 이 관계를 잘 이용하면 유연하고, 강건한 프로그램을 만들 수 있게 된다. 이번 게시글에서는 이런 관계를 알아보도록 하겠다.2. 클래스 간 관계클래스 간의 관계는 정적이다. 다시 말해 코드를 작성할 때, 관계가 맺어지고, 실행 중에 변화하지 않는다. 클래스 간 관계는 크게 상속과 구체화가 있다. 클래스 간의 관계를 잘 형성해주면 강건한 일반화 프로그래밍을 할 수 있다. 상속상속(inheritance)은 객체지향 프로그래밍의 특징인 다형성(polymorph..

Outdated/Column 2020.02.27

[OOP] 객체지향 설계 원칙 - SOLID

목차1. SOLID 원칙이란?2. 단일 책임 원칙3. 개방 폐쇄 원칙4. 리스코프 치환 원칙5. 인터페이스 분리 원칙6. 의존성 역전 원칙 7. 마치며8. 참고자료 1. SOLID 원칙이란?좋은 설계란 무엇일까? 본인은 시스템에 예상하지 못한 변경사항이 발생하더라도 유연하게 대처할 수 있는 시스템 구조를 만드는 것이라고 생각한다. 다시 말해 시스템에 새로운 요구사항이나 변경사항이 있을 때, 영향을 받는 범위가 적은 구조를 만드는 것이다. 하지만 좋은 설계를 한다는 것은 말만큼 쉽지 않다. 다행히도 이미 여러 선배 개발자분들에 의해서 여러가지 설계 기법과 원칙이 소개되었다. SOLID 원칙은 그 중 하나다. SOLID 원칙은 소프트웨어를 설계함에 있어 이해하기 쉽고, 유연하고, 유지보수가 편하도록 도와주는..

Outdated/Column 2020.02.27

[Computer Column] 위상정렬(topological sort)

위상정렬이란? DAG(Directed Acyclic Graph), 즉 사이클이 없는 유향 그래프에서 꼭짓점들(vertex)을 방향에 거스르지 않고 정렬하는 알고리듬이다. 대학의 선수과목 구조와 같이 순서가 있는 작업들을 나열할 때 이용한다. 위상정렬을 구현하는 방법에는 두 가지가 있는데 하나는 DFS를 이용하는 것이고 다른 하나는 진입차수(indegree)를 이용하는 것이다. 동작 방식 DFS를 이용하는 방식 그래프에서 방문하지 않은 노드면 DFS를 한다. DFS가 끝나면 해당 노드를 스택에 넣는다. 스택에서 하나씩 꺼내면 위상 정렬된 노드들을 얻을 수 있다. 진입차수를 이용하는 방식 진입차수가 0인 노드를 큐에 넣는다. 해당 노드의 자식 노드들의 진입차수를 1 줄인다. 그래프의 모든 노드가 큐에 넣어질..

Outdated/Column 2019.06.21

[Computer Column] 다익스트라 알고리즘(dijkstra algorithm)

다익스트라 알고리즘이란? 다익스트라 알고리즘은 음의 가중치가 없는 그래프에서 한 정점에서 다른 모든 정점까지의 최단 경로를 구하는 알고리즘이다. 가능한 적은 비용으로 가장 빠르게 해답에 도달하는 경로를 찾아내는 대부분의 문제에 적용된다. 의사 코드 def dijkstra(graph, edge, dist, start_vtx): # dist는 시작지점부터 다른 모든 노드들까지의 거리가 저장된 배열이다. # 시작지점을 제외한 나머지 부분은 무한대로 정의한다. dist = [INF for i in range(graph.size)] dist[start_vtx] = 0 # 방문한 노드들을 담는 집합이다. visited = set() while (모든 노드들을 순회할 때까지): shortest_vtx = 방문하지 않..

Outdated/Column 2019.05.16

[Computer Column] Git Flow

Git Flow란?Vincent Driessen의 브랜칭 모델을 위한 고수준 저장소 작업을 제공하는 Git의 확장 프로그램이다. Git Flow의 설치는 여기에서 확인할 수 있고, GUI 도구인 SourceTree도 지원한다.출처 : https://nvie.com/posts/a-successful-git-branching-model/왜 사용하는가?DVCS(destributed version control system)와 CVCS(centralized version control system)를 비교할 때, 가장 도드라지는 특징은 버전 관리 이력을 누가 가지고 있느냐일 것이다. DVCS는 그 이름답게 모든 유저가 버전 관리 이력을 가진다. 문제는 그렇다보니 브랜치가 체계적으로 관리가 되지 않아, 버전 관리..

Outdated/Column 2019.03.20

[Computer Column] Git - 2

이전 글에서 우리는 Git을 시작하고 간단한 수정을 통해 변경사항을 어떻게 기록하는지 살펴보고, 원격 저장소에도 해당 변경사항을 업로드하였다. 이번에는 다른 컴퓨터에서 동일한 저장소를 이용하는 법을 보려고 한다.원격 저장소에서 프로젝트 가져오기이전 글에서 Git을 시작하는 방법이 두 가지라고 얘기했던 것을 기억하는가? 첫 번째 방법은 본인의 로컬 컴퓨터에서 시작하는 것이었고, 두 번째는 Git 서버에 저장되어 있는 프로젝트를 본인의 컴퓨터로 가져오는 것이었다. 두 번째는 과연 어떻게 하는 것일까?git clone "Your URL" # 원격 저장소의 링크를 붙여넣는다. 필자는 폴더를 하나 만들어 다른 컴퓨터에서 사용한다고 가정하겠다.원격 저장소와 동일해진 것을 확인할 수 있다. info.txt을 열어 다..

Outdated/Column 2019.03.17

[Computer Column] Git - 1

Git은 작은 프로젝트부터 큰 프로젝트까지 효율적이고 빠르게 모든 것을 관리하기 위해 고안된 분산형 버전 관리 시스템이다. 자유 그리고 오픈 소스이며 Linux 운영체제의 아버지인 리누스 토발즈에 의해 개발됐다.(버전 관리 시스템이 무엇인지 모른다면?) 이번 글에서는 Git의 사용법에 대해서 알아보도록 하자. Git을 편하게 이용할 수 있는 좋은 GUI들이 많지만 여기서는 커맨드를 사용하도록 하겠다. 독자는 Git이 설치되어 있어야 하고, Github 계정이 있어야 한다. Git은 여기서 설치할 수 있고, Github 계정은 여기서 생성할 수 있다.Git 설정모든 프로그램은 사용하기 전에 적절하게 설정해줘야 한다. Git도 마찬가지이다. git config를 이용해 여러가지를 설정해줄 수 있지만, 여기서..

Outdated/Column 2019.03.17