[Design Pattern] 빌더 패턴 (Builder)

빌더 패턴 (Builder)?

  • 생성 패턴
  • 객체를 생성하는 과정 / 표현하는 방법을 분리
  • 생성자에 매개변수가 많다면 빌더 패턴을 고려하자.
  • 하나의 Builder로 다양한 객체를 만드는 것이 가능.

UML 

<위키백과 - 빌더 패턴 구조>


Product 클래스


Builder

다양한 파츠를 생성하기 위해 인터페이스를 제공.


ConcreteBuilder

제품의 각 구성품을 만드는 것에 관여한다.

 


Director

생성 프로세스에 관여하며, 정형화된 조립 과정으로 조립한다.



참고 사이트

 

 

[Design Pattern] 추상 팩토리 패턴 (Abstract Factory)

 

추상 팩토리 패턴 (Abstract Factory) ?

  • 생성 패턴
  • 다양한 구성 요소별로 '객체의 집합'을 생성해야 할 때 사용

 UML

<위키백과 - 추상 팩토리 패턴 UML 클래스 및 시퀀스 다이어그램>







위키백과 - 추상 팩토리 패턴

[Design Pattern] 팩토리 메소드 패턴 (Factory Method)

팩토리 메소드 패턴 (Factory Method)?

  • 생성 패턴
  • SuperClass에서 인터페이스를 제공하고 SubClass에서 결정.

 

많은 설계는 FactoryMethod를 사용하는 것으로 시작하므로 알아두어야 좋다!

예를들어 아메리카노, 라떼 커피를 제조한다고 하자.


  • 커피 SuperClass
  • 아메리카노, 라떼 SubClass

커피 클래스

GetName() 가상함수를 추가하여 Coffee 추상클래스를 만들었다.

SubClass인 아메리카노, 라떼에서 GetName()을 구현.


  • 커피 생성 클래스 SuperClass
  • 아메리카노, 라떼 생성 클래스 SubClass

이번에도 FactoryMethod()를 가상함수로 만들었고, SubClass들에서 구현을 한다. 

생성클래스답게 new로 각 클래스의 객체를 생성한다.



장단점

장점

  • 객체를 생성하는 코드와 클라이언트 코드와 분리 가능하다.
  • 생성코드가 한 곳에 있기 때문에 유지보수가 쉽다. 

단점

  • 새로운 하위 클래스를 많이 만들어야 하기 때문에 코드가 더 복잡해질 수도 있다.

[C++] explicit에 대한 이야기

explicit에 대한 이야기


Explicit란 단어의 사전적 의미는 '분명한, 명쾌한' 입니다.

단어만 봐도 느낌이 옵니다. 개발자의 의도와는 다르게 사용될 여지가 있거나, 그러면 안되는 곳에 쓰일 것 같아요.


간단한 예제입니다.



int형을 클래스 A에 대입하는 이 때 암시적 타입 변환이 이루어 집니다. 만약 생성자를 explicit으로 선언한다면


 

이렇게 명시적으로 변환 하는것만 가능하도록 합니다.


Effective C++ 책에는


필자의 경우, 암시적 타입 변환에 생성자가 사용될 여지를 남겨둘 뚜렷한 이유가 없는 한, 생성자는 explicit 선언을 우선적으로 합니다. 여러분도 주저 마시고 이런 식으로 해 보시기를 적극 추천하는 바입니다.

라고 쓰여있다.


앞으로 생성자를 만들땐 explicit을 붙이는 것을 습관화 해야겠습니다.


[STL] 시퀀스 컨테이너 , 연관 컨테이너

시퀀스 컨테이너 = list, vector, deque.


적은 자료를 보관. 


연관 컨테이너 = map, set, hash_map, hash_set.


Key값이 중복되어도 괜찮다면, 컨테이너 앞에 'multi'를 붙인다.

multi_map, multi_set, hash_multimap, hash_multiset을 사용한다.




map, set, hash_map, hash_set 뭔 차이?


map, set  = 자료를 정렬하여 저장. 따라서 데이터를 순회할때 정렬된 순서대로 순회한다.


hash_map, hash_set = 정렬 X 저장. 그래서 검색 속도가 map,set보다 빠름.


BUT!

해시 테이블은 저장한 자료가 적으면.... 메모리 낭비, 검색시 오버헤드가 생긴다.


hash_map




hash_map을 이용하여, 반복되지 않는 첫 번째 문자 찾기.




http://www.hanbit.co.kr/network/view.html?bi_id=1618

업캐스팅시 함수 호출순서




[C++] 스택(Stack), 선형큐(Queue) 구현하기

스택(Stack)




선형큐(Queue)



[C언어] 데이터 영역(Data Area), 스택 영역(Stack Area), 힙 영역(Heap Area)

데이터 영역(Data Area)


전역변수, static 변수.


프로그램 시작과 동시에 할당.

프로그램 종료되어야만 메모리에서 소멸.

전역변수가 데이터 영역에 올라가는 일은 main 함수의 호출보다 먼저 진행된다.





스택 영역(Stack Area)


지역변수, 매개변수.




힙 영역(Heap Area)


프로그래머가 관리하는 메모리 영역.

배열의 크기 선언을 반드시 상수로 사용해야 하는 이유



스택, 데이터 영역에 할당될 메모리의 크기는 런타임(run-time)이 아닌 컴파일되는 동안(컴파일 타임)에 결정되어야 한다.



힙에 메모리를 할당하는 것을 두고 '동적 할당(Dynamic Allocation)'이라 한다.

반대로 스택과 데이터 영역에 메모리를 할당하는것 '정적 할당(Static Allocation)이라 한다.




malloc 함수 & free 함수.


malloc 함수.

동적으로 메모리를 할당하는 함수이다. = 힙 영역에 메모리를 할당하는 함수.

할당한 메모리의 주소(첫번째 바이트의 주소)를 리턴한다.

만약에 메모리 부족으로 인해서 메모리 할당에 실패했다면, NULL 포인터가 리턴되므로, 리턴된 포인터가 NULL인지 아닌지 확인해야한다.










[C언어] strlen, strcpy, strncpy, strcat, strncat, strcmp, strncmp

1. strlen 함수


문자열의 길이를 반환해 주는 함수이다. NULL 문자는 문자열 길이에 포함되지 않는다.




2. strcpy 함수


문자열을 복사. BUT. 저장할 버퍼가 입력받은 문자열 길이보다 작으면 오버플로우 발생.

따라서 strncpy함수를 선호한다.


3. strncpy 함수


최대 길이 n을 넘지 않고 문자열을 복사한다.


strncpy로 NULL문자를 뺀 길이까지만 복사하고, 맨 뒤에 '\0'(NULL) 을 넣어준다.



4. strcat 함수, strncat 함수

기존에 존재하는 문자열의 뒤에다가 다른 문자열을 추가하는(덧붙이는) 함수이다.
역시나 strcat은  문자열이 저장될 배열의 공간이 추가하는 문자열의 길이에 비해 충분하지 못한 경우 오버플로우 발생.

strncat함수를 쓰자.



5. strcmp 함수, strncmp함수


문자열의 길이를 비교하는 것 X. 문자열 내용 자체를 비교 O.




위에 예제는 str1 == str2 (배열 이름 = 포인터) 이므로 포인터를 비교한 것임.

 



strcmp 함수예제


strncmp함수는 처음부터 n까지 비교하는 함수이다.



[C언어] 표준 입 출력과 버퍼(Buffer)

표준 입 출력 함수를 사용하는 경우에는 버퍼라는 것을 제공받게 된다는 특징이 있다.


버퍼 = 여분의 임시 메모리 공간.


키보드를 통해서 입력하는 데이터는 실행중인 프로그램으로 바로 읽혀지는 것이 아니라, 일단은 입력 버퍼라는 곳에 저장이 된다는 것을 알 수 있다.

그리고 나서 입력 버퍼에 존재하는 데이터가 프로그램으로 이동하는 것이다.



프로그램상에서 printf와 같은 함수 호출을 통해서 모니터에 데이터를 출력하려는 경우에도 바로 출력이 이루어지는 것이 아니라, 일단 출력 버퍼라는 곳에 저장이 되었다가 출력 스트림을 통해서 모니터로 전송된다.




버퍼링(Bufferint)을 하는 이유는?


버퍼링이란 데이터를 전송하는데 있어서 목적지로 바로 보내는 것이 아니라, 중간에 버퍼(여분의 임시 저장소)를 둬서 전송하고자 하는 데이터를 임시 저장해 두는 것을 말한다.


임시 저장된 데이터가 어느정도 채워지면 한꺼번에 전송한다. -> 성능 향상을 위해서임.



fflush 함수 ?


버퍼를 비우는 작업을 하는 함수.


fflush 함수의 인자로 전달되는 스트림의 버퍼를 비워버린다.


stdin 과 같은 입력 스트림이 전달되면 입력 버퍼 안에 존재하는 데이터들은 모두 지워진다.


stdout과 같은 출력 스트림이 전달되면 출력 버퍼 안에 존재하는 데이터들은 즉시 출력된다.


 

 fgets함수는 표준 입, 출력 함수이므로, 함수 호출 시 키보드를 통해서 입력받은 문자들은 일단 입력 버퍼에 저장이 된다. 
그 다음 실행중인 프로그램으로 문자열이 전송되는데, 입력받은 문자가 fgets 함수에서 요구하는 7문자보다 많기 때문에 입력 버퍼에 있는 데이터는 한번에 읽혀지지 않는다. 

즉 읽혀지고 남은 문자들이 여전히 버퍼에 존재하게 된다. 

 그 다음 두 번째 fgets함수가 호출될 때는 입력 버퍼에 여전히 문자가 남아 있기 때문에 키보드로부터 문자열을 입력받지 않고, 버퍼에 남아 있는 문자들을 읽어들이게 된다. 따라서 우리가 원하는 실행결과를 얻지 못하게 된다.