목록Tutorials (196)
KoreanFoodie's Study
C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 생성자를 private 하게 만든다고? 스마트 포인터에 배우다 보면, make_shared 와 new 를 이용해 스마트 포인터를 만드는 방식에 대해 배우게 된다. 이때, 효율성을 위해 make_shared 를 new 보다 선호하라는 말을 듣게 되는데, 그 이유는 명확하다(힙 할당이 2번 대신 1번 이루어지며, 같은 메모리 조각에 놓이는 데다가, new 에서 예외가 발생했을 때의 메모리 누수도 막을 수 있으니까). 그런데... 그럼에도 불구하고 new 를 사용해야 하는 경우를 보면, 크게 2가지 이유가 나온다. 커스텀 삭제자를 사용하는 경우 생성자가 private 인 경우 100번 양보해서, 1번은 그렇다 쳐도, 2번은 직관적으로 와닿지가 ..
C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 RTTI RTTI 는 간단히 말해, 실시간 타입 정보라는 뜻이다. RTTI 라는 단어를 평소에는 잘 들어볼 일이 없다가, dynamic_cast 를 사용하기 위해 비주얼 스튜디오 옵션을 뒤적이던 중 해당 항목을 발견했다. 알다시피, C++ 는 리플렉션 기능을 제공하지 않는다. C# 에서는 리플렉션을 제공하는데, 해당 기능은 런타임에서 클래스 타입, 메소드, 프로퍼티 등의 메타 정보를 제공해 준다. 비주얼 스튜디오에서는 해당 기능을 끄고 킬 수 있게 만들어 놓았다. 간단히 말해, 해당 기능을 키게 되면 런타임에서 타입에 대한 정보를 얻을 수 있다. RTTI 는 가상 함수가 있는 클래스에 대해서만 동작하며, 이는 클래스의 타입 관련 정보가 v..
C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 파생 클래스에서의 기반 클래스 생성자 호출 사실 파생 클래스가 생성될 때, 기반 클래스 생성자가 호출된다는 건, C++ 을 조금이라도 해 본 사람은 누구나 알고 있는 사실이다. 또한 함수의 생성자/소멸자의 호출 순서가 다음과 같다는 것도, 익히 알려진 사실이다. 즉, A 클래스가 기반 클래스이고, B 클래스가 파생 클래스라고 가정했을 때 B 클래스 변수를 선언하면 호출 순서가 다음과 같이 나올 것이다 : A 클래스 생성자 B 클래스 생성자 B 클래스 소멸자 A 클래스 소멸자 하지만 한 가지 기억해야 할 것은, 파생 클래스를 만들 때 호출되는 기반 클래스 생성자는 '인자가 없는 기반 클래스의 생성자' 이다. 즉, 인자를 받는 형식의 기반 클..
C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 우측값과 좌측값 우리는 C++03 까지, 우리는 우측값과 좌측값 두 가지의 개념을 사용하여 코딩을 했었다. 간단히 말하자면, 좌측값은 '식의 좌측에 있는 변수'를, 우측값은 '식의 우측에 있는 값'을 의미했다. // a 는 좌측값, 5 는 우측값이다 int a = 5; 흔히들 좌측값을 '이름이 있는 녀석'으로 인식하기도 했다. 엄밀히 말하면 틀린 말은 아니다. 그런데 move semantics 가 도입되기 시작하면서, C++11 부터 대격변이 시작되는데... 여기서 많은 사람들이 좌측값과 우측값에 대한 개념을 헷갈려하기 시작한다(필자 포함). move semantics 가 뭔지 잘 모르겠다면, 이전 글(기초, 응용, 심화)을 꼭 읽고 오자..
C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 const_cast 많은 사람들이 알고 있듯이, C++ 에서 제공하는 casting 의 종류는 크게 4 가지이다. 각 용도를 간단히 적어보면 다음과 같다 : static_cast : '일반적인' C 스타일의 캐스팅. 보통 업캐스팅(파생 클래스의 포인터를 기반 클래스의 포인터로 가리킴) 시 사용한다. dynamic_cast : 상속 관계에 있는 클래스들 사이의 캐스팅. 보통 다운 캐스팅(기반 클래스의 포인터를 파생 클래스의 포인터로 가리킴) 시 사용한다. 만약 실패하면 nullptr 를 리턴한다. 참고로, dynamic_cast 는 polymorphic 한 클래스만 가능한데, 간단히 말하면 virtual 함수가 포함된 클래스이어야 dynam..
약 두 달간 읽으며 정리하고 요약한 Effective C++ 와 Effective Modern C++ 게시글들에 대한 리스트 요약글입니다. 개발하실때 참고하시길 바라며, 직접 사서 읽어보시길 강추드립니다! 1장 형식 연역 항목 1: 템플릿 형식 연역 규칙을 숙지하라 항목 2: auto의 형식 연역 규칙을 숙지하라 항목 3: decltype의 작동 방식을 숙지하라 항목 4: 연역된 형식을 파악하는 방법을 알아두라 2장 auto 항목 5: 명시적 형식 선언보다는 auto를 선호하라 항목 6: auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용하라 3장 현대적 C++에 적응하기 항목 7: 객체 생성 시 괄호(())와 중괄호({})를 구분하라 항목 8: 0과 NULL보다 nullptr를 선..
약 두 달간 읽으며 정리하고 요약한 Effective C++ 와 Effective Modern C++ 게시글들에 대한 리스트 요약글입니다. 개발하실때 참고하시길 바라며, 직접 사서 읽어보시길 강추드립니다! Chapter 1 C++에 왔으면 C++의 법을 따릅시다 항목 1: C++를 언어들의 연합체로 바라보는 안목은 필수 항목 2: #define을 쓰려거든 const, enum, inline을 떠올리자 항목 3: 낌새만 보이면 const를 들이대 보자! 항목 4: 객체를 사용하기 전에 반드시 그 객체를 초기화하자 Chapter 2 생성자, 소멸자 및 대입 연산자 항목 5: C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 항목 6: 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 ..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 42 : 삽입 대신 생성 삽입을 고려하라 핵심 : 1. 이론적으로, 생성 삽입 함수들은 종종 해당 삽입 버전보다 더 효율적이어야 하며, 덜 효율적인 경우는 절대로 없어야 한다. 2. 실질적으로, (1) 추가할 값이 컨테이너에 배정되는 것이 컨테이너에 배정되는 것이 아니라 컨테이너 안에서 생성되고, (2) 인수 형식(들)이 컨테이너가 담는 형식과 다르고, (3) 그 값이 중복된 값이어도 컨테이너가 거부하지 않는다면, 생성 삽입 함수가 삽입 함수보다 빠를 가능성이 아주 크다. 3. 생성 삽입 함수는 삽입 함수라면 거부당했을 형식 변환들을 ..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 41 : 이동이 저렴하고 항상 복사되는 복사 가능 매개변수에 대해서는 값 전달을 고려하라 핵심 : 1. 이동이 저렴하고 항상 복사되는 복사 가능 매개변수에 대해서는 값 전달이 참조 전달만큼이나 효율적이고, 구현하기가 더 쉽고, 산출되는 목적 코드의 크기도 더 작다. 2. 왼값 인수의 경우 값 전달(즉, 복사 생성) 다음의 이동 배정은 참조 전달 다음의 복사 배정보다 훨씬 비쌀 가능성이 있다. 3. 값 전달에서는 잘림 문제가 발생할 수 있으므로, 일반적으로 기반 클래스 매개변수 형식에 대해서는 값 전달이 적합하지 않다. Widget 클래..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 40 : 동시성에는 std::atomic 을 사용하고, volatile 은 특별한 메모리에 사용하라. 핵심 : 1. std::atomic 은 뮤텍스 보호 없이 여러 스레드가 접근하는 자료를 위한 것으로, 동시적 소프트웨어의 작성을 위한 도구이다. 2. volatile 은 읽기와 기록을 최적화로 제거하지 말아야 하는 메모리를 위한 것으로, 특별한 메모리를 다룰 때 필요한 도구이다. std::atomic 은 보통 뮤텍스보다 더 효율적인 기계어 명령들로 구현된다. std::atomic 을 사용하는 다음 예제 코드를 보자. std::atomi..