카테고리

cpp-stl

#2. [모던 C++ STL] 타입

2 분 소요

(C++11~) nullptr_t가 추가되었습니다. (C++11~) lldiv_t, lldiv_t, imaxdiv_t, float_t, double_t가 추가되었습니다. (C++11~) LLONG_MIN, LLONG_MAX가 추가되었습니다. (C...

#3. [모던 C++ STL] 동적 메모리 관리

5 분 소요

(C++11~) get_new_handler()가 추가되었습니다. (C++11~) pointer_traits가 추가되어 포인터와 유사한 타입들을 다루는 표준화된 방법을 제공합니다. (C++11~) aligned_alloc()이 추가되어 정렬된 메모리를 ...

#4. [모던 C++ STL] 유틸리티

6 분 소요

(C++11~) tuple이 추가되어 다수의 요소를 관리할 수 있는 데이터 전달용 개체를 좀 더 간편하게 만들 수 있습니다. (C++11~) move()가 추가되어 좌측값을 우측값으로 형변환할 수 있습니다. (C++11~) move_if_noexcept...

#5. [모던 C++ STL] 컨테이너

8 분 소요

[MEC++#13] iterator 보다 const_iterator를 선호하라.(const_iterator 지원 참고) [MEC++#42] 기존 push_back()등의 삽입 대신 emplace_back()등의 삽입을 고려하라.(emplace(), emplac...

#6. [모던 C++ STL] 이터레이터

2 분 소요

(C++11~) move_iterator 어뎁터가 추가되어 이터레이터가 가리키는 요소를 이동 연산 할 수 있습니다. (C++11~) make_move_iterator가 추가되었습니다. (C++11~) next()와 prev()가 추가되었습니다. ...

#7. [모던 C++ STL] 알고리즘

5 분 소요

(C++11~) all_of(), any_of(), none_of(), find_if_not()이 추가되었습니다. (C++11~) minmax(), minmax_element()가 추가되었습니다. (C++11~) is_heap(), is_heap_unt...

#8. [모던 C++ STL] 함수자

3 분 소요

(C++11~) 기존에 제공되던 함수자 타입 특성 클래스(unary_function, binary_function등), 바인더(bind1st(), bind2nd()등), 어뎁터와 부정자(mem_fun(), mem_fun_ref(), ptr_fun(), not1(), ...

#9. [모던 C++ STL] 문자열

8 분 소요

(C++11~) u16string이 추가되어 UTF-16 인코딩 문자열을 지원합니다. (C++11~) u32string이 추가되어 UTF-32 인코딩 문자열을 지원합니다. (C++11~) isblank()가 추가되었습니다. (C++11~) ato...

#10. [모던 C++ STL] 숫자

7 분 소요

(C++11~) complex에 proj()이 추가되었습니다. (C++11~) 공통 수학 함수가 보강되었습니다. (C++11~) 부동 소수점 환경이 추가되었습니다. (C++11~) 난수 생성기가 추가되어 다양한 형태의 난수를 만들 수 있습니다. ...

#11. [모던 C++ STL] 입출력

6 분 소요

(C++11~) vscanf(), snprintf(), vsnprintf()가 추가되었습니다. (C++11~) hexfloat(), defaultfloat(), get_money(), put_money(), get_time(), put_time()이 추가되었습...

#12. [모던 C++ STL] 현지화

최대 1 분 소요

(C++11~) isblank()가 추가되었습니다. (C++11~C++17) 문자열 현지화 변환(wstring_convert, wbuffer_convert, codecvt_utf8, codecvt_utf16, codecvt_utf8_utf16, codecvt_...

#13. [모던 C++ STL] 진단

2 분 소요

(C++11~) 동적 예외 사양이 deprecate 되면서 unexpected()도 함께 deprecate 되었습니다. (C++11~) future_error, regex_error, system_error, ios_base::failure, bad_weak_...

#14. [모던 C++ STL] type_traits(C++11)

6 분 소요

(C++11~) type_traits가 추가되어 컴파일 타임 프로그래밍시 각 타입의 조건들을 검사하거나 타입 변환을 할 수 있습니다. (C++14~) is_null_pointer, is_final이 추가되었습니다. (C++17~) bool_constan...

#15. [모던 C++ STL] ratio(C++11)

1 분 소요

(C++11~) ratio가 추가되어 소수점 오차없이 유리 분수를 표현할 수 있습니다. 분자와 분모를 따로 저장하여 유리 분수를 표현하며, 유틸리티들을 이용하여 컴파일 타임 유리수(정수와 분수) 연산을 지원합니다.

#16. [모던 C++ STL] unique_ptr, make_unique(C++11, C++14)

7 분 소요

[MEC++#18] 소유권 독점 자원의 관리에는 unique_ptr를 사용하라.(unique_ptr 참고) [MEC++#22] PImpl 관용구를 사용할때에는 암시적으로 정의되는 특수 멤버 함수들을 구현 파일에서 정의하라.(unique_ptr을 이용한 PImp...

#19. [모던 C++ STL] tuple(C++11)

5 분 소요

(C++11~) tuple이 추가되어 다수의 요소를 관리할 수 있는 데이터 전달용 개체를 좀 더 간편하게 만들 수 있습니다. (C++11~) make_tuple(), tie(), forward_as_tuple()이 추가되어 tuple을 쉽게 생성할 수 있습니다...

#21. [모던 C++ STL] hash(C++11)

최대 1 분 소요

(C++11~) hash()가 추가되어 각 타입별로 데이터의 해시값(Digest)을 구할 수 있습니다.

#22. [모던 C++ STL] array(C++11)

3 분 소요

(C++11~) array가 추가되어 기존 C스타일의 배열처럼 연속된 메모리를 사용하는 컨테이너를 제공합니다. C스타일 배열처럼 컴파일 타임에 크기가 결정되어 스택에 할당되므로, 힙에 할당되는 vector 보다 성능이 좋습니다. (C++20) to_array(...

#23. [모던 C++ STL] forward_list(C++11)

2 분 소요

(C++11~) forward_list가 추가되어 단방향 리스트를 제공합니다. 기존 양방향 리스트인 list보다 요소 관리 공간을 작게 차지하며, push_front()로 요소의 앞쪽 방향으로 리스트를 구성합니다.

#26. [모던 C++ STL] condition_variable(C++11)

3 분 소요

(C++11~) condition_variable이 추가되어 쓰레드간 동기화를 위해 쓰레드를 wait()시킨뒤, 특정 조건이 되었을때 활성화 시킬 수 있습니다.

#29. [모던 C++ STL] regex_match, regex_search, regex_replace(C++11)

3 분 소요

(C++11~) regex_match()가 추가되어 문자열의 전체가 정규 표현식과 일치하는지 검사할 수 있습니다. (C++11~) regex_search()가 추가되어 문자열의 일부가 정규 표현식과 일치하는지 검사할 수 있습니다. (C++11~) reg...

#31. [모던 C++ STL] exchange(C++14)

1 분 소요

(C++14~) exchange()가 추가되어 주어진 값을 바꾸는 작업이 간편해 졌습니다. 특히 이동 생성자와 이동 대입 연산자 구현에 활용할 수 있습니다.

#32. [모던 C++ STL] 표준 사용자 정의 리터럴(C++14)

최대 1 분 소요

(C++14~) 표준 사용자 정의 리터럴이 추가되어 operator ""s, operator ""min, operator ""if, 등 문자열, 날짜 / 시간, 복소수 관련 표현이 간편해 졌습니다. (C++17~) operator ““sv가 추가되어 strin...

#33. [모던 C++ STL] optional(C++17)

2 분 소요

(C++17~) optional이 추가되어 값이 있을 수도 있고, 없을 수도 있는 데이터를 처리할 수 있어, 미확정 상태, 값을 처리하기 부적절한 상태, 함수 리턴값 성공 여부 처리를 좀더 단순하게 할 수 있습니다.

#34. [모던 C++ STL] any(C++17)

1 분 소요

(C++17~) any가 추가되어 타입의 변동 가능성이 있는 데이터를 비교적 안전하게 사용할 수 있습니다.

#35. [모던 C++ STL] variant(C++17)

3 분 소요

(C++17~) variant가 추가되어 타입이 다른 여러 데이터들을 동일한 메모리 공간에서 쉽게 관리할 수 있습니다.

#36. [모던 C++ STL] string_view(C++17)

2 분 소요

(C++17~) string_view가 추가되어 문자열을 읽기 전용으로 사용할 때 불필요한 문자열 복제가 없도록 해줍니다. (C++20~) u8string_view가 추가되었습니다.

#39. [모던 C++ STL] 파일 시스템(C++17)

2 분 소요

(C++17~) path, absolute(), relative()등이 추가되어 경로 문자열을 생성할 수 있습니다. (C++17~) current_path(), directory_iterator(), recursive_directory_iterator()등이 ...

#40. [모던 C++ STL] concepts(C++20)

3 분 소요

(C++20~) same_as, derived_from, convertible_to, integral, floating_point, assignable_from, swappable, destructible, constructible_from, default_initi...

#41. [모던 C++ STL] coroutine(C++20)

3 분 소요

(C++20~) coroutine_handle 이 추가되어 코루틴을 재개하는 코루틴 핸들을 제공합니다. (C++20~) suspend_always, suspend_never가 추가되어 코루틴에서 사용하는 대기 가능 개체를 제공합니다. (C++20~) c...

#42. [모던 C++ STL] 범위(Range)와 뷰(View)(C++20)

13 분 소요

(C++20~) 범위(Range)가 추가되어 이터레이팅할 수 있는 추상적인 요소들을 처리할 수 있습니다. (C++20~) 포인트 개체인 ranges::begin, ranges::end등이 추가되어 범위(Range)의 이터레이터를 구할 수 있습니다. (C...

#43. [모던 C++ STL] span(C++20)

3 분 소요

(C++20~) span이 추가되어 C스타일 배열, array, vector, 메모리, string 등 연속된 메모리 시퀀스를 참조할 수 있습니다.

#44. [모던 C++ STL] 포맷팅(C++20)

9 분 소요

(C++20~) format(), format_to(), format_to_n()이 추가되어 %d, %s 처럼 간편하고, << 처럼 확장성 있는 서식화 방법을 지원합니다. (C++20~) 표준 서식 지정자가 추가되어 채움, 정렬, 부호, 너비, 정밀...

맨 위로 이동 ↑

cpp

#3. [모던 C++] 사용자 정의 리터럴(C++11, C++20)

2 분 소요

(C++11~) 사용자 정의 리터럴이 추가되어 int operator ""_km(long double val);와 같이 사용자가 정의해서 사용할 수 있으며, 단위계 처리가 쉬워졌습니다. (C++20~) 사용자 정의 리터럴 인자 규칙에 char8_t이 추가되었습...

#4. [모던 C++] 개선된 네임스페이스(C++11, C++17, C++20)

1 분 소요

(C++11~) 인라인 네임스페이스가 추가되어 API 버전 구성이 편리해 졌습니다. (C++17~) 단순한 중첩 네임스페이스가 추가되어 :: 로 표현할 수 있습니다. (C++20~) 인라인 네임스페이스와 단순한 중첩 네임스페이스를 결합하여 표시할 수 있...

#6. [모던 C++] 개선된 제어문(C++11, C++17, C++20)

2 분 소요

(C++11~) 범위 기반 for()가 추가되어 컨테이너 요소의 탐색 처리가 쉬워졌습니다. (C++17~) 초기식을 포함하는 if(), switch()가 추가되어 함수 리턴값을 평가하고 소멸하는 코드가 단순해 졌습니다. (C++20~) 범위 기반 fo...

#8. [모던 C++] 개선된 형변환(C++11, C++20)

1 분 소요

(C++11~) explicit 형변환 연산자가 추가되어 명시적으로 형변환 할 수 있습니다. (C++20~) explicit(bool)이 추가되어 특정 조건일 때만 explicit로 동작하게 할 수 있습니다.

#9. [모던 C++] 개선된 예외 처리(noexcept)(C++11, C++17)

3 분 소요

[MEC++#14] 예외를 방출하지 않을 함수는 noexcept로 선언하라.(느슨한 noexcept 계약 참고) noexcept는 최적화 여지가 크다. 이동 생성자, 이동 대입 연산자, swap(), 소멸자는 noexcept로 만들어라. ...

#11. [모던 C++] 우측값과 이동 연산(C++11)

27 분 소요

[MEC++#17] 암시적으로 정의되는 특수 멤버 함수들의 자동 작성 조건을 숙지하라.(이동 연산에 따른 암시적 정의 참고) [MEC++#29] 이동 연산이 존재하지 않고, 저렴하지 않고, 적용되지 않는다고 가정하라.(암시적 이동 연산 변환 참고) ...

#12. [모던 C++] 멤버 함수 참조 지정자(C++11)

3 분 소요

(C++11~) 멤버 함수 참조 지정자가 추가되어 멤버 함수에 &, && 로 좌측값에서 호출될때와 우측값에서 호출될 때를 구분하여 함수 오버로딩을 할 수 있습니다.

#13. [모던 C++] 전달 참조와 완벽한 전달(C++11)

25 분 소요

[MEC++#23] move()와 forward()를 숙지하라.(move 원리, 상수 개체의 move(). forward() 와 완벽한 전달, forward() 원리 참고) [MEC++#24] 전달 참조와 우측값 참조를 구별하라.(전달 참조 참고) [M...

#15. [모던 C++] 개선된 공용체(C++11)

2 분 소요

(C++11~) 무제한 공용체가 추가되어 공용체 멤버에서 생성자/소멸자/가상 함수 사용 제한이 풀렸으며, 메모리 절약을 위한 코딩 자유도가 높아졌습니다.

#16. [모던 C++] 람다 표현식(C++11, C++14, C++17, C++20)

21 분 소요

[MEC++#31] 기본 람다 캡쳐 모드를 피하라.(람다 캡쳐 참고) 람다 캡쳐하는 항목을 나열하는게 직관적이다. [=]는 this를 람다 캡쳐한다. [MEC++#32] 객체를 클로저 안으로 이동시...

#17. [모던 C++] static_assert()(C++11)

최대 1 분 소요

(C++11~) static_assert()가 추가되어 컴파일 타임 진단이 가능해 졌습니다. (C++17~) static_assert()의 메시지 생략을 지원합니다.

#19. [모던 C++] 개선된 템플릿(C++11, C++14, C++17, C++20)

8 분 소요

(C++11~) extern으로 템플릿 선언을 할 수 있으며, 템플릿 인스턴스 중복 생성을 없앨 수 있습니다. (C++11~) 템플릿 오른쪽 꺽쇠 괄호 파싱을 개선하여 템플릿 인스턴스화시 >가 중첩되어 >>와 같이 되더라도 공백을 추가할 필요가...

#20. [모던 C++] 가변 템플릿과 파라메터 팩(C++11, C++17)

4 분 소요

(C++11~) 가변 템플릿과 파라메터 팩이 추가되어, 가변 인자(…)와 같이 갯수와 타입이 정해 지지 않은 템플릿 인자를 사용할 수 있습니다. (C++11~) sizeof…() 연산자가 추가되어 가변 템플릿에서 파라메터 팩의 인자수를 구할 수 있습니다. ...

#21. [모던 C++] 특성(attribute)(C++11, C++14, C++17, C++20)

5 분 소요

(C++11~) 특성(attirbute)이 추가되어 컴파일러에게 부가 정보를 전달하는 방식을 표준화 했습니다. (C++14~) [[deprecated]]가 추가되어 소멸 예정인 것을 컴파일 경고로 알려줍니다. (C++17~) [[fallthrough]]...

#23. [모던 C++] 인라인 변수(C++17)

1 분 소요

(C++17~) 인라인 변수가 추가되어 헤더 파일에 정의된 변수를 여러개의 cpp에서 #include 하더라도 중복 정의 없이 사용할 수 있습니다. 또한, 클래스 정적 멤버 변수를 선언부에서 초기화 할 수 있습니다.

#25. [모던 C++] 개선된 연산자(삼중 비교 연산자)(C++20)

10 분 소요

(C++20~) 삼중 비교 연산자가 추가되어 비교 연산자 구현이 간소화 되었습니다. (C++20~) 삼중 비교 연산자를 default로 정의할 수 있습니다. (C++20~) 비트 쉬프트 연산자의 기본 비트가 표준화되어 << 1는 곱하기 2의 ...

#26. [모던 C++] 컨셉(concept)과 요구사항(requires)(C++20)

10 분 소요

(C++20~) 컨셉(concept)과 요구사항(requires)이 추가되어 템플릿 인자나 auto에 제약 조건(constraint)을 줄 수 있습니다. (C++20~) 컨셉 설계를 활용하여 마치 인터페이스처럼 컨셉에 의한 코딩 계약을 만들 수 있습니다.

#27. [모던 C++] 모듈(module)(C++20)

8 분 소요

(C++20~) 모듈이 추가되어 전처리 사용 방식을 개선하여 컴파일 속도를 향상시키고, #include 순서에 따른 종속성 문제, 선언과 정의 분리 구성의 불편함, 기호 충돌 문제를 해결했습니다.

#29. [모던 C++] 기타(C++11, C++17, C++20)

4 분 소요

(C++11~) alignas() 와 alignof()가 추가되어 메모리 정렬 방식을 표준화 됐습니다. (C++11~) 가변 매크로가 추가되어 C언어와의 호환성이 높아졌습니다. (C++11~) 멤버의 sizeof()시 동작이 개선되어 개체를 인스턴스화 ...

맨 위로 이동 ↑

principle

맨 위로 이동 ↑

legacy-cpp-guide

#2. [레거시 C++ 가이드] 이름 짓기

최대 1 분 소요

밑줄로 시작하지 말고, 이중 밑줄을 사용하지 마라. 헝가리안 표기법을 사용하지 마라. 매크로는 대문자로 작성하라. 이름을 반복하지 마라.

#3. [레거시 C++ 가이드] 기본 타입(자료형)

3 분 소요

타입 크기에 의존하여 코딩하지 마라. OS에 따라, 컴파일러에 따라, 시스템 비트수에 따라 크기가 달라질 수 있다. 대소 비교가 필요한 경우에는 정수 타입을 사용하라. 실수 비교는 오차가 있다.

#5. [레거시 C++ 가이드] 네임스페이스(namespace)

5 분 소요

이름 충돌을 피하기 위해 복잡한 접두어를 쓰지 말고, 네임스페이스를 사용하라. using 선언과 using 지시문 사용시 유효 범위가 커지지 않도록 주의하라.(전역 공간에 using namespace를 사용하면 망한다.)

#8. [레거시 C++ 가이드] 배열(Array)

3 분 소요

속도 성능에 영향이 없다면 유지보수시 확장성을 위하여 배열보다는 vector를 사용하라. 동적 요소 할당을 지원하며, 여전히 엑세스는 빠르다. new[]-delete[] 쌍을 준수하라.

#14. [레거시 C++ 가이드] 초기화

9 분 소요

생성하면서 초기화 하라. 초기화되지 않은 변수를 사용하지 마라. 자동 제로 초기화에 의존하지 마라. 낭패볼 수 있다.

#17. [레거시 C++ 가이드] 문자열

10 분 소요

수정될 필요가 없는 문자열 데이터는 const char* 나 const wchar_t*로 관리하라.(배열이나 string, wstring을 쓰면 복제된다.) 멀티 바이트 문자열은 권장하지 않는다. 사용하지 마라. 소스 코드 저장시에는 다국어 처리에 적합...

#18. [레거시 C++ 가이드] 연산자들(Operators)과 연산자 오버로딩

20 분 소요

임시 개체가 생성되지 않도록 이항 산술 연산자(a = a + b)보다는 산술형 대입 연산자(a += b)를 사용하라. 후위형 증감 연산자는 헷갈리고, 쓸데없는 임시 개체가 생성되니 사용하지 마라. 비교 연산 오버로딩은 <을 활용해서 구현하라.

#19. [레거시 C++ 가이드] 제어문

4 분 소요

코드 분석을 위해 제어의 중첩을 최소화 하라.(조건 상태표를 활용하라.) 예외에 안전할 수 있도록 사전 조건 검사를 수행하라. goto는 코드 분석을 방해하니 사용하지 마라.

#23. [레거시 C++ 가이드] 파일 구성

5 분 소요

헤더 파일에서 다른 헤더 파일을 #include하는 것은 최소화 하라. 선언과 정의 분리, 전방 선언으로 컴파일 종속성을 최소화 하라.

맨 위로 이동 ↑

pattern

#1. [디자인 패턴-생성 패턴] Abstract Factory

5 분 소요

Abstract Factory는 특정 그룹 계열에 속한 개체들을 생성합니다. 생성할 개체들이 일련의 그룹인 경우 생성 관련 로직을 간결하게 만들 수 있습니다.

#2. [디자인 패턴-생성 패턴] Builder

4 분 소요

Builder는 여러 요소가 합성된 개체일 경우 요소를 합성하는 방법과 요소를 생성하는 방법을 분리하여 확장성을 향상시켜 줍니다.

#3. [디자인 패턴-생성 패턴] Factory Method

3 분 소요

Factory Method는 생성에 대한 구체적인 정보를 자식 클래스에서 알고 있을때 부모 클래스에서 자식 클래스에게 생성을 요청하기 위해 사용합니다.

#4. [디자인 패턴-생성 패턴] Prototype

4 분 소요

Prototype은 미리 정의된 개체로부터 복제하여 개체를 생성합니다. 속성까지 동일한 개체를 여러개 만들때 사용하면 좋습니다.

#6. [디자인 패턴-구조 패턴] Adapter

3 분 소요

Adapter는 임의의 개체(Adpatee)를 기존 인터페이스로 사용하기 위해 감쌉니다. 개체의 소스코드를 직접 수정할 수 없을때 사용합니다.

#7. [디자인 패턴-구조 패턴] Bridge

4 분 소요

Bridge는 추상과 구현을 분리하여, 종속적인 부분을 느슨하게 만들어 주거나, 구현을 다형적으로 만들 수 있게 합니다.

#8. [디자인 패턴-구조 패턴] Composite

3 분 소요

Composite은 단일 개체와 복합 개체를 추상화하여 모두 동일한 방식으로 다루게 해줍니다. 둘을 서로 구분하여 처리할 필요가 없어지기 때문에 고민할 것들이 줄어듭니다.

#9. [디자인 패턴-구조 패턴] Decorator

4 분 소요

Decorator는 개체에 동적으로 새로운 외형을 추가하거나 기능을 추가할 때 포함을 통해 처리합니다. 클래스를 직접 수정하거나 상속을 이용하여 추가하는 것보다 코드가 간결해 집니다.

#10. [디자인 패턴-구조 패턴] Facade

최대 1 분 소요

Facade는 서브시스템의 클래스들이 복잡하게 얽혀있고 사용이 어려운 경우, 단순하고 일관된 상위 수준의 통합 인터페이스를 제공합니다. 외부에서 내부 서브시스템을 몰라도 되므로, 사용하기 쉬워집니다.

#12. [디자인 패턴-구조 패턴] Proxy

3 분 소요

Proxy는 실제 개체의 동작을 대리해서 실행합니다. 최소한의 정보만을 이용하여 대리 실행하기 때문에, 생성이나 실행시 속도 부하가 있는 개체의 속도 개선을 위해 사용합니다.

#13. [디자인 패턴-행위 패턴] Chain of Responsibility

6 분 소요

Chain of Responsibility는 요청을 여러 개체에 전달하여 함께 처리할 수 있게 해줍니다. 한군데에서 모든 요청을 처리하지 않고 책임에 따라 여러 개체에 분산하므로, 해당 개체 구현시 고민할 것들이 줄어듭니다.

#14. [디자인 패턴-행위 패턴] Command

4 분 소요

Command는 기능의 요청과 실행을 분리하여, 실행 부분이 재활용될 수 있게 합니다. 동일한 기능을 메뉴, 단축키, 매크로등 여러 방법으로 실행할 수 있을때 사용하면 좋습니다.

#15. [디자인 패턴-행위 패턴] Interpreter

7 분 소요

Interpreter는 비교적 단순하게 설계된 임의의 언어를 해석하는 간단한 방법을 제공합니다. 파서를 통해 가상의 트리를 만들고 이를 이용하여 구문을 해석합니다.

#16. [디자인 패턴-행위 패턴] Iterator

3 분 소요

Iterator는 집합 개체에서 요소에 접근하는 방법을 제공합니다. 집합 개체의 내부 구현을 외부에 은닉하기 때문에 집합 개체의 구현 방식을 비교적 안전하게 변경할 수 있습니다. C++의 경우 STL의 컨테이너는 모두 이터레이터를 제공하며, begin(), end(), ++, * ...

#17. [디자인 패턴-행위 패턴] Mediator

4 분 소요

Mediator는 개체들끼리의 상호작용을 캡슐화합니다. 개체들끼리 서로 직접 참조하지 않기 때문에 결합도가 낮아져 유지보수 편의성이 향상됩니다.

#18. [디자인 패턴-행위 패턴] Memento

4 분 소요

Memento는 내부 상태를 저장해 두고 나중에 복원할 수 있게 해줍니다. Command 패턴과 함께 사용되어 Undo를 구현할 수 있습니다.

#19. [디자인 패턴-행위 패턴] Observer

3 분 소요

Observer는 특정 개체를 감시하며, 변경 발생을 통지 받는 일반적인 구조입니다.(개체지향 원칙중 헐리우드 원칙과 유사합니다.)

#20. [디자인 패턴-행위 패턴] State

7 분 소요

State는 내부 상태에 따라 다른 동작 방법을 제공합니다. 상태를 처리하는 코드들이 응집되어 상태 처리가 비교적 단순해 집니다.

#21. [디자인 패턴-행위 패턴] Strategy

3 분 소요

Strategy는 알고리즘이나 기능등의 전략을 캡슐화하고 런타임에 변경할 수 있게 만들어 줍니다. 외부에서 동작을 결정하고 변경할 수 있어 확장성이 향상됩니다.

맨 위로 이동 ↑

cpp-coding-pattern

#1. [C++ 코딩 패턴] 진단(작성중)

최대 1 분 소요

데이터 오버런(overrun) 및 언더런(underrun) 등 잘못된 힙 사용을 탐지하기 위해 탐지용 byte를 추가로 할당하는 경우(진단 참고)

맨 위로 이동 ↑

legacy-cpp-stl

#2. [레거시 C++ STL] 템플릿

5 분 소요

템플릿은 템플릿 인스턴스화 하기 전에는 코드를 생성하지 않는다. 클래스, 함수, 멤버 함수, 중첩 클래스를 템플릿으로 만들 수 있다.

#3. [레거시 C++ STL] 템플릿 특수화, 부분 특수화

6 분 소요

일반화 프로그래밍에서의 다형적 동작을 위해 템플릿 특수화, 템플릿 부분 특수화, 함수 템플릿 특수화, 함수 오버로딩을 이용하라. 함수 템플릿을 정의할때 함수 템플릿 오버로딩과 함수 템플릿 특수화의 순서를 지켜라.

#8. [레거시 C++ STL] pair

최대 1 분 소요

모던 C++ (C++11~) tuple이 추가되어 다수의 요소를 관리할 수 있는 데이터 전달용 개체를 좀 더 간편하게 만들 수 있습니다. (C++17~) 구조화된 바인딩이 추가되어 배열, pair, tuple, 클래스등의 내부 요소나 멤버 변수에 쉽게 접근...

#9. [레거시 C++ STL] 컨테이너

4 분 소요

삽입/삭제 성능, 검색 성능, 노드 구성 용량 부하를 검토하여 최적의 컨테이너를 선택하라. 컨테이너의 변경이 용이하도록 코딩하라. 컨테이너 종류나 사용하는 알고리즘에 따라 복사 생성자, 복사 대입 연산자, 비교 연산자를 구현하라.

#12. [레거시 C++ STL] vector

6 분 소요

swap()을 이용하여 vector가 할당한 메모리 영역을 해제할 수 있다. vector<bool>은 사용하지 마라.

#13. [레거시 C++ STL] 할당자(Allocator)

2 분 소요

모던 C++ (C++17~) polymorphic_allocator가 추가되어 할당시 런타임 다형성을 지원합니다. 메모리 리소스를 사용하여 메모리 풀을 손쉽게 만들 수 있습니다.

#17. [레거시 C++ STL] 문자열

6 분 소요

string과 wstring은 public Non-Virtual 소멸자이므로 상속하여 재구현 하지 마라. 수정될 필요가 없는 문자열 데이터는 const char* 나 const wchar_t*로 관리하라.(배열이나 string, wstring을 쓰면 복제된다....

#19. [레거시 C++ STL] 템플릿 메타 프로그래밍

12 분 소요

모던 C++ (C++11~) constexpr이 추가되어 컴파일 타임 프로그래밍이 강화됐습니다. (C++11~) static_assert()가 추가되어 컴파일 타임 진단이 가능해 졌습니다. (C++11~) noexcept 연산자가 추가되어 해당 함수...

맨 위로 이동 ↑

javascript

맨 위로 이동 ↑

legacy-cpp-oop

#1. [레거시 C++ 개체 지향] 생성자

13 분 소요

기본 생성자가 필요하다면 명시적으로 구현하고, 필요없다면 못쓰게 만들어라. 값 생성자에서는 필요한 인자를 모두 나열하고 초기화하라. 인자가 1개인 값 생성자(형변환 생성자)는 explicit로 암시적 형변환을 차단하라. 암시적 복사 생성자가 정상...

#2. [레거시 C++ 개체 지향] 복사 대입 연산자와 nothrow Swap

11 분 소요

멤버 변수가 1개라면, 암시적 복사 대입 연산자가 정상 동작하도록 멤버 변수 정의시 스마트 포인터(shared_ptr 등)를 사용하고, 필요없다면 못쓰게 만들어라. 멤버 변수가 2개 이상이라면, 복사 대입 연산자를 예외에 안전하도록 swap()으로 구현하고, ...

#3. [레거시 C++ 개체 지향] 소멸자

9 분 소요

획득된 자원은 꼭 소멸시켜라. 암시적 소멸자가 정상 작동하도록 멤버 변수 정의시 스마트 포인터(auto_ptr, unique_ptr, shared_ptr 등)를 사용하라. 다형 소멸이 필요하면 부모 개체에 가상 소멸자를 사용하라.(가상 소멸자가 아니면 ...

#5. [레거시 C++ 개체 지향] 개체 생성(new)과 소멸(delete)

18 분 소요

개체는 new-delete 쌍으로 생성/소멸 하라. 배열은 new[]-delete[] 쌍으로 생성/소멸하라. new[]한 것을 delete 만 하면, 메모리 릭이 발생한다. 꼭 delete[]하라. delete는 널 값이면 아무 작업 안한다. 괜히 널검...

#6. [레거시 C++ 개체 지향] 멤버 변수, 초기화 리스트

11 분 소요

멤버 변수 초기화시, 생성후 대입하지 말고 초기화 리스트를 사용하라.(초기화 리스트의 순서는 멤버 변수 선언 순서에 맞춰라.) 생성자에서 필요한 인자를 모두 나열하고 초기화하라. 메모리 패딩을 고려하여 멤버 변수 선언 순서를 정하라. 암시적 복사...

#9. [레거시 C++ 개체 지향] 상속

21 분 소요

부모 개체의 멤버 함수를 오버로딩 하지 마라. 오버로딩 함수 탐색 규칙에서 제외된다. 자식 개체를 부모 개체에 대입하지 마라. 아무런 오류 없이 복사 손실 된다. 구현 코드가 없는 단위 전략 인터페이스인 경우에만 다중 상속하라. 소멸자에서 가이드...

#12. [레거시 C++ 개체 지향] 완전한 클래스

5 분 소요

잘못 사용하기엔 어렵게, 바르게 사용하기엔 쉽게 구현하라. 단일 책임 원칙(Single Responsibility Principle)을 준수하여 사용하기 쉽게 만들어라. 암시적 정의를 차단하여 의도한 동...

맨 위로 이동 ↑

methodology

#1. 설계하라

2 분 소요

우리 팀은 프로젝트 하나가 백만라인이야~ 대단하지?

#2. 리팩토링하라

2 분 소요

소스코드에도 유통기한이 있다면 그 기간을 만년으로 하고 싶다.

#3. 작명하라

6 분 소요

프로그래밍시 작명의 기술은 너무나도 중요합니다. 가독성 향상을 통해 생산성을 극대화해주고, 동료를 배려하는 아트 코딩의 시작점입니다. 좋은 이름을 짓는다면, 코드를 읽은 동료들이 당신의 고민과 배려에 감사해 할거에요.

#4. 단위 테스트하라

3 분 소요

단위 테스트란 하나의 기능 단위를 테스트하는 것을 말합니다. 혹은 단위 기능들을 복합하여 다시 하나의 단위 테스트를 만들 수도 있습니다.

#5. 버그를 수정하지 말고 방지하라

1 분 소요

이럴수가… 한 동료가 기능을 만들어서 테스터에게 보냈는데 버그가 하루만에 10개 넘게 왔군요? 동료가 열심히 고쳐서 다시 테스터에게 보냈더니 이번엔 또다른 것 10개가 돌아왔네요. 또 동료가 열심히 고쳐서 다시 테스터에게 보냈더니 이번엔 예전에 고친 버그가 재현되네요.(테스트 자동...

#8. 테스트를 먼저 개발하라

1 분 소요

보통은 구현을 할때 정상적인 시나리오로 동작할 수 있도록 코드를 구현하고, 그뒤 테스트를 하곤 합니다.

맨 위로 이동 ↑

react

맨 위로 이동 ↑

dev-setting

#6. [개발설정] Visual Studio Code 에서 CMake 환경 구성

5 분 소요

개요 C++ 에서는 프로젝트를 구성하는 파일이 여러개 라면 Make 환경을 구축해야 해야 합니다. Makefile을 직접 작성하는 방법도 있지만, 손쉬운 유지관리를 위해 CMake를 사용하는 방법이 좋습니다. CMake를 사용하려면, CMake 설치와 Visual Studio Co...

맨 위로 이동 ↑

comment

#6. 주석의 종류

5 분 소요

C++ 에서 문법적으로는 다음의 두가지 주석이 있습니다. ```cpp //

맨 위로 이동 ↑

legacy-cpp-exception

#1. [레거시 C++ 가이드] 예외 안전 코드

3 분 소요

예외 안전(safe) 코드는 예외가 발생하지 않는 코드가 아니라, 예외가 발생해도 안전하게 복원되고 계속 동작해도 무방하게 예외 보증하는 코드다. 예외 상황을 사전에 예측하고 프로그래밍 하라. 모든 함수는 실패할 수 있다고 가정하고 프로그래밍 해라. ...

#3. [레거시 C++ 가이드] 표준 예외 개체

최대 1 분 소요

모던 C++ (C++11~) 동적 예외 사양은 deprecate 되었습니다. 예외를 나열하는 것보다 noexcept로 예외를 방출하느냐 안하느냐만 관심을 둡니다. (C++17~) 동적 예외 사양 관련해서 throw()가 deprecate 되었습니다. 이제 ...

#5. [레거시 C++ 가이드] 예외 보증

7 분 소요

예외에 안전하도록 기본 보증과 강한 보증을 하라. 기본 보증이 되도록 스마트 포인터나 Holder를 사용하라. 강한 보증이 되도록 클래스를 설계하라.(예외 안전에 좋은 클래스 설계 참고) 모듈의 경계에서 예외가 방출되지 않도록 예외를 catch(...

맨 위로 이동 ↑

win

#1. 메시지 영역

최대 1 분 소요

윈도우즈는 메시지 기반으로 프로그래밍을 하며, 다음의 메시지들이 예약된다.

#2. 메시지 전달

1 분 소요

메시지 처리를 위한 전형적인 메시지 루프는 다음과 같다.

#3. 메시지 루프

5 분 소요

일반적인 메시지 루프는 다음과 같다. 1 2 3 4 5 MSG msg; while (::GetMessage(&msg, NULL, NULL, NULL)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); }

#4. 메시지 루프 - 대화상자

2 분 소요

Modeless 대화상자를 지원하기 위해서는 대화상자에서 직접 처리하는 키보드 메시지(TAB, ESC, ENTER, ALT+니모닉 등)를 중복해서 처리하지 않도록 다음과 같이 메시지 루프를 사용해야 한다.

맨 위로 이동 ↑

typescript

맨 위로 이동 ↑