본문 바로가기

전체 글

(91)
DIP 원칙 의존성 역전 원칙(Dependency Inversion Principle, DIP) (C++ 소프트웨어 디자인 책 정리)가장 유연한 시스템은 소스 코드 의존성이 구체화(concretion)가 아닌 추상화만 참조하는 시스템이다. 이 원칙은 의존성을 위해 구체 타입이나 구현 상세 대신 추상화에 의존할 것을 조언한다.상속 계통에 대해서는 아무 말도 하지 않고 일반적인 추상화만 언급한다. 지금부터 자동 입출금기(ATM)의 논리를 구현한다고 생각해보자. ATM은 인출, 입금, 송금 등 여러가지 연산을 제공한다. 이 모든 연산은 실제 돈을 다루므로 완전히 완료하거나 오류가 있으면  중단하고 모든 변경을 되돌려야 한다. 이런 행위를 일반적으로 transaction 이라고 한다.결과적으로 Transaction이라는 추..
LSP 원칙 리스코프 치환 원칙 (C++ 소프트웨어 디자인 책 정리)하위 타입(subtype) 요구 사항: ψ(x) 를 T 타입 객체 x에 대해 증명할 수 있는 특성이라 하자. 이 때 S가 T의 하위 타입이라면 ψ(y)는 S 타입 객체 y에 대해 참이어야한다. LSP는 세 번쨰 SOLID원칙이며 행위적 서브타이핑, 즉 추상화로 기대하는 행위와 관련이 있다.이 원칙은 흔히 IS-A 관계라고 하는 것을 공식화 한다. 이 관계, 즉 추상화의 기대를 하위타입에서 반드시 따라야 한다.Struct X{ virtual ~X() = default; // 사전 조건: 함수는 0보다 큰 모든 'i'를 받아들인다 virtual void f( int i) const { assert(i > 0); // ... }};..
OCP 원칙 개방-폐쇄 원칙(Open-Close Principle OCP)(C++ 소프트웨어 디자인 책 정리)(클래스, 모듈, 함수 등) 소프트웨어 산출물은 확장에는 열려 있지만 수정에는 닫혀 있어야 한다. OCP는 소프트웨어를 확장할 수 있어야 한다고 말한다(확장에 열려 있음). 하지만 확장이 쉬워야 하고, 최선의 경우 새 코드를 추가하는 것만으로 확장 가능해야 한다. 즉, 기존 코드를 수정할 필요가 없어야 한다(수정에 닫혀 있음). 위 원칙을 설명하기 앞서 다른 원칙에서 설명을 했던 Document 클래스를 살펴보자.class Document{ public: // ... virtual ~Document() = default; virtual void exportToJSON( /*...*/ ) const ..
ISP 원칙 인터페이스 분리 원칙 (Interface Segregation Principle ISP)(C++ 소프트웨어 디자인 책 정리)사용하지 않는 메서드에 클라이언트가 의존하도록 강요해서는 안 된다. 앞서 SRP 법칙의 document  예제를 다시 보자.이번에는  document 클래스의 개별 함수가 아닌 전체 인터페이스에 집중한다.class Document{ public: // ... virtual ~Document() = default; virtual void exportToJSON( /*...*/ ) const = 0; virtual void serialize( ByteStream bs, /*...*/) const = 0; //...}; Document에는  JSON 내보내기와 직렬화를 모두..
SRP 원칙 단일 책임 원칙 (Single-Responsibility Principle SRP)(C++ 소프트웨어 디자인 책 정리) 클래스를 변경하는 이유는 단 하나여야 한다.모든 것은 오직 한가지 일만 해야 한다. 설명이 모호한데, 이 법칙의 아이디어는 항상 같다. 즉, 진정 함께 속하는 것만 하나로 묶고 엄격히 속하지 않는 것은 모두 분리한다.바꿔말하면, 여러가지 이유로 변경하는 것을 분리한다.이렇게 함으로써 코드의 서로 다른 관심사 사이에 인위적인 결합을 낮추고 소프트웨어가 변경에 . 더 잘 적응할 수 있게 돕는다.최선의 경우 소프트웨어의 특정 측면을 정확히 한 곳에서 변경할 수 있다. 인위적인 결합 예코드 예제로 관심사 분리를 설명해 보자. 아래 Document 추상 클래스 보면,class Document{ ..
클래스(class) - 생성자, 소멸자 생성자 c++에서 클래스를 통해 객체를 생성할 때 자동으로 실행되는 생성자(constructor)라는 특별한 멤버 함수를 통해 객체를 초기화 한다. 한 클래스에서 여러 개의 생성자를 둘 수 있으나, 이중 하나만 실행된다. 생성자의 특징은 다음과 같다. 1. 생성자 함수는 오직 한 번만 실행된다. 2. 생성자 함수의 이름은 클래스 이름과 동일하게 작성한다. 3. 생성자 함수의 원형에 리턴타입을 선언하지 않는다. 4. 생성자는 중복이 가능하다. 5. 클래스에서 생성자를 만들지 않았을 경우 컴파일러가 기본 생성자를 만들어 삽입하고, 자신이 삽입한 기본 생성자를 호출한다. 코드 구현 class Person { private: LQueue_Struct questionQueue; PERSON_CONDITION co..
클래스(Class) - 객체 생성 c++에서 클래스란 객체를 정의하는 틀 혹은 설계도로서, 클래스에 멤버 변수와 멤버 함수를 선언한다. 클래스와 객체의 관계는 붕어빵 틀과 붕어빵의 관계와 비슷하다. 붕어빵 틀은 c++클래스에, 붕어빵은 c++ 객체에 비유된다. c++객체는 c++ 클래스라는 틀에서 찍어내어, 멤버 변수 메모리와 멤버 함수 코드를 실제 가지고 c++프로그램이 실행 되는 동안 실존하는 실체 혹은 인스턴스 이다. 위 그림과 같이 Person이라는 클라스가 있다. 클라스를 이용해 Jitae 객체와 Hyojin 객체를 만들 수 있다. 클래스의 멤버 변수를 보면 노란색 박스와 초록색 박스로 나누어져 있다. 노란색 박스는 사람한테 물어보지 않고 겉모습만 봐도 알 수 있지만, 초록색 박스의 경우 말해주지 않는 이상은 알 수 없다. C+..
cin, cout and namespace cpp 프로그래밍 정리. std::cout cout은 c++의 표준 출력 스트림 객체이다. 프로그램에서 출력할 데이터를 자신과 연결된 스크린에 대신 출력해준다. c언어에서의 printf와 비슷한 기능이다. std::cout을 쓰기 위해서는