분류 전체보기 298

SQL의 분류 DML/DDL/DCL/TCL

SQL 명령어를 주로 DML, DDL로 분류하는 경우가 많아서 어떤 것들이 이러한 명령어인지 잘 알고 있어야 합니다. 이 밖게 DCL, TCL로 분류를 하는데 이것 또한 알아 두어야 겠습니다. 분류 명령어 설명 DML : Data Manipulation Language SELECT, INSERT, UPDATE, DELETE 테이블의 데이터를 다루는 명령어 데이터 조회, 입력, 수정, 삭제 DDL : Data Definition Language CREATE, ALTER, DROP, RENAME, TRUNCATE 테이블을 조작하는 명령어 테이블 생성, 변경, 삭제, 이름변경, 초기화 DCL : Data Control Language GRANT, REVOKE 권한 부여/제거 TCL : Transaction C..

구글이 목표를 달성하는 방식 OKR

OKR에 대해서 먼저 설명하고 서평을 시작할게요. O 와 KR을 합쳐서 OKR이라고 부르고 있고요. O은 목표(Objective)이고 KR은 핵심 결과들(Key Results)의 축약이고요. O(목표)는 아침에 사람들이 신이 나서 침대에서 뛰어나올 정도로 가슴이 뛰게해야 해요. KR(핵심 결과들)은 목표가 무엇인지 잘 알려주고 달성 정도를 알 수 있도록 수치로 표현되어야 합니다. 사용량, 수익률, 구매율, 재방문율 등과 같은 수치입니다. KR은 하나의 O를 위해 3~4개 정도 설정하는 것이 좋으며 성공 확률이 50%정도로 생각 될 정도로 도전적이어야 합니다. 우선 책 제목과 책의 목차를 보고 구글이 어떻게 인류 기업이 될 수 있었는지에 대한 내용이 있을 것으로 기대 했습니다. 그런데, 책을 별치고 읽은지..

독서 리뷰 2020.03.23

다시 미분 적분

다시 미분 적분(프로그래머, 수학의 뇌를 깨워라!) 대학생 시절 미적분학 그리고 공업수학 이후 거의 20년 만에 미분 적분 책을 접하게 되네요. 요즘 아들이 중학생이어서 수학을 가르쳐 줄일이 많아 졌고 앞으로도 좀더 아는 척 하려면 미적분 정도는 알아야 되겠다는 생각이 들었지요. 그리고 프로그래머로서 미적분을 잘 모르면 안되겠다는 생각도 들었고요. 이책은 정말이지 차근 차근 단계 단계 설명이 잘되어 있어서 소설책 읽듣이 재미 있게 따라 갈 수 있었어요. 공식 전개에도 생략이 거의 없었고 단순 암기가 아니라 하나 하나 증명하고 그 원리가 어떻게 되는지 설명해 주었어요. 앞 부분에 설명 했던 내용이 뒤에 쓰이기 마련인데 이때면 어김 없이 친절히 몇 페이지에서 설명한 어떤 것인지에 친절히 알려 주면서 설명해 ..

독서 리뷰 2020.03.18

개발자의 글쓰기

개발자가 글쓰는 거의 모든 경우에 대해서 다루고 있는 책입니다. 개발자는 머니 머니해도 가장 많이 쓰는 글이 코딩이겠죠. 그래서 인지 코딩 글쓰기를 초반에 많이 다뤄요. 특히 와 닿았던 내용은 코딩 할때 단어 하나 하나의 의미를 정확히 이해하고 적절한 변수/함수/클래스 등의 이름을 지어주어야 겠죠. 역시 코딩에 있어서 가장 중요한 것은 가독성을 좋게 할 수 있는 훌륭한 작명입니다. Clean Code에서는 훌륭한 작명의 가장 중요한 요소를 기술적 소양 즉 교양을 꼽고 있죠. 이 책에서도 비슷하게 설명하고 있어요. 책에서 소개한 네이밍 특징들 관련 글인데 재미있게 보았습니다. https://brunch.co.kr/@goodvc78/12 오픈소스의 네이밍 특징들 소스코드 (변수, 함수, 클래스)네이밍 데이터..

독서 리뷰 2020.03.12

방문자 패턴(Visitor Pattern)

방문자 패턴은 어떤 객체의 계층 각각마다 서로 다른 작업을 수행해야 할때 사용하면 좋습니다. 기존 코드의 수정 없이 새로운 방문자를 추가하는 것만으로도 기능을 확장 할 수 있습니다. 기능 확장면에서 OCP 충실히 따를 수 있습니다. 다음과 같이 DoubleExpression과 AdditionExpression 수식이 있고 각 수식마다 새로운 동작을 추가해야 할때를 생각해봅시다. struct Expression { }; struct DoubleExpression : Expression { double value; explicit DoubleExpression(const double value) : value{value} {} }; struct AdditionExpression : Expression { E..

템플릿 메서드 패턴(Template method Pattern)

전략 패턴과 템플릿 메서드 패턴은 매우 유사합니다. 전략 패턴이 구성을 이용하지만 템플릿 메서드 패턴은 상속을 이용합니다. 핵심 원리는 알고리즘과 상세 구현을 분리하여 구현하는 것입니다. 게임 시뮬레이션 보드 게임류는 게임 시작, 턴 플레이, 승자 결정이 되고 게임 종료됩니다. class Game { public: explicit Game(int number_of_players) : number_of_players(number_of_players) {} // 게임의 알고리즘 void run() { start(); while (!have_winner()) take_turn(); cout

전략 패턴(Strategy Pattern)

구성(Composition)을 이용하여 알고리즘과 상세 구현을 분리하여 구현하는 것입니다. 런타임에 변경 가능한 동적형태와 템플릿으로 컴파일 타임에 결정되는 정적 형태가 있습니다. 전략 패턴은 알고리즘의 골격만을 정의하고 세부 구현은 구성(Composition)으로서 특정 전략을 선택적으로 채워 넣을 수 있게 하는 것입니다. 앞으로 단순한 텍스트 목록을 두 가지 포맷(HtmlList, MarkdownList)으로 전략적으로 선별하여 렌더링 하는 것을 구현합니다. 동적 전략 구성(Composition)을 이용하며 런타임에 전략을 동적으로 결정합니다. 전략 패턴의 골격을 위한 ListStrategy 클래스를 구현합니다. struct ListStrategy { virtual void add_list_item(..

상태 패턴(State Pattern)

"상태가 동작을 제어하고, 상태는 바뀔 수 있다."는 매우 단순한 아이디어 입니다. 졸음(상태) – 커피(트리거) → 정신이 듦(상태) 상태 패턴의 구현에는 기본적으로 다음의 두 가지 방법이 있습니다. 동작을 가지는 실제 클래스로 상태를 정의합니다. 그리고 그 동작들은 상태가 이전될 때 클래스의 변화에 따라 변경됩니다. 상태와 상태 전이를 단순히 enum 타입처럼 식별자의 나열로 정의합니다. 실제 상태 변화는 상태 머신 이라는 특별한 컴포넌트를 두어 수행합니다. 상태 기반 상태 전이 가장 간단한 예로 전등을 생각해봅시다. 꺼짐과 켜짐 상태가 있으며 어떤 상태로든 전이 할 수 있습니다. 상태를 enum이 아니라 클래스로 정의합니다. LightSwitch는 State와 상태를 전이할 수 있는 수단을 가지며 ..

관찰자 패턴(Observer Pattern)

SNS에서 Follow하여 구독하거나 구독 취소를 하는 것이 옵저버 패턴과 동일한 행위입니다. 옵저버 패턴은 실제 세상에서도 그 예가 많 듯이 어플리케이션 구현시에도 자주 필요하며 즐겨 사용되는 디자인 패턴입니다. Person 클래스의 변경 사항을 모니터링하는 Person Observer의 구현을 살펴 보겠습니다. age에 쓰기 작업이 있을때마다 콘솔 메시지를 출력하는 구현입니다. 이 구현은 전형적인 옵저버 패턴의 형태입니다. (책에서 과제로 남겼던, std::any를 이용하여 제너릭으로 구현하였습니다) templatestruct Observer { virtual void field_changed(T& source, const string& property_name, const any new_value)..

Null 객체

인터페이스를 마음대로 선택하여 사용할 수 없는 경우가 있습니다. 예를들어 어떤 모듈의 특정 기능을 사용할 경우 원하지 이 모듈이 인터페이스에 내장되어 있을 수 있습니다. 이럴때 Null 객체를 이용합니다. 시나리오 다음과 같은 인터페이스를 가진 Logger 라이브러리를 사용한다고 가정합니다. struct Logger { virtual void info(const string& s) = 0; }; Logger를 상속받은 ConsoleLogger를 구현합니다. struct ConsoleLogger : Logger { void info(const string& s) override { cout