본문 바로가기

반응형

진리는어디에

(289)
[C++] 람다(lambda) 표현식 #1 들어가며 이번 포스트에서는 C++11 부터 추가된 람다 표현식에 대해 살펴 보도록하겠다. 람다 표현식(lambda expression)이란 '익명의 함수를 만드는 문법'으로써 정확하게는 익명의 함수 객체를 만드는 문법이다. 먼저 람다 표현식을 사용하여 vector를 정렬하는 간단한 아래 예제를 살펴 보자. #include #include #include int main() { std::vector v = { 1, 3, 2, 5, 4 }; std::sort(v.begin(), v.end(), [](int a, int b) -> int { return a < b; }); for (int e : v) { std::cout
[C++] default move constructor 들어가며 [이전 포스트]에서는 move에 대한 기본 개념 필요 이유, 사용 방법에 대해 살펴 보았다. 이번 포스트는 앞의 내용에 이어 복사 생성자와 move 생성자의 자동 생성 규칙에 대해 살펴 보도록 한다. 먼저 아래의 다소 복잡해 보이는 코드를 먼저 살펴 보자. class String { public: String() = default; String(const String&) { std::cout
[C++] 레퍼런스 콜랩싱(reference collapsing) 들어가며 이전 포스트 [C++] r-value 레퍼런스(reference) 완벽 가이드를 통해서 r-value 레퍼런스가 무엇인지, l-value는 l-value 레퍼런스로만 참조 될 수 있고, r-value는 r-value 레퍼런스로만 참조 될 수 있다는 것을 살펴 보았다. 이번 포스트에서는 좀 더 깊이 들어가 참조를 참조하는 타입은 C++에서 어떻게 처리되고 살펴 보도록하자. 레퍼런스 콜랩싱이라는 이름이 생소해서 그렇지 아주 간단한 내용이니까 가벼운 마음으로 읽고 넘어 가도록 한다. 참조의 참조 타입 아래의 코드 7라인은 int& 타입에 &를 추가하여(&& 처럼 붙어 있지 않고 떨어져 있다는 것에 주목) 참조를 참조하는 타입을 만들고 있다. 괴랄하게 생긴만큼 문법적으로도 맞지 않으며 컴파일 하게 되면..
[C++] move semantics 들어가며 이번 포스트에서는 C++11에 추가 된 내용 중 매우 중요하게 다루어지는 move에 대해 살펴 보도록 한다. 필자의 경우 move에서 말하는 자원의 '복사' 대신 '이동' 시킨다는 메커니즘이 머리 속에서 그려지지 않아 move를 접한 처음엔 이해하는데 많은 어려움을 겪었다. 하지만 본 포스트를 읽는 여러분에게는 필자와 같은 어려움을 겪지 않도록 최대한 쉽게 move에 대해 접근해 보도록하겠다. NOTICE : move에 대해 이해하기 위해서는 r-value에 대한 이해가 먼저 필요하다. 만일 r-value에 익숙하지 않은 분이라면 [r-value 레퍼런스(reference) 완벽 가이드]를 먼저 읽고 돌아 오도록 하자. Move semantics란? 이번 섹션은 move라고 불리는, Move s..
[C++] r-value 레퍼런스(reference) 완벽 가이드 들어가며 C++11 부터 & 연산자로 표기 되는 참조 타입에 추가하여 && 연산자로 표기 되는 r-value 레퍼런스라는 새로운 개념이 추가 되었다. 이번 포스트에서는 r-value 란 무엇인지, 무슨 이유로 추가되었는지, 어떤 경우에 유용하게 사용할 수 있을지에 대해 자세히 살펴 보도록 하겠다. r-value 란? r-value 라는 용어가 생소한 분들을 위해 r-value가 무엇인지 먼저 알아 보도록 하자. r-value를 한줄로 요약하면 '오른쪽(right)에만 올 수 있는 값'이라고 정의할 수 있다. 아직 뜬 구름 잡는 소리 처럼 들리겠지만 잠시만 인내심을 가지고 아래 예제를 살펴 보자. int main() { int v1 = 0, v2 = 0; v1 = 10; // ok 10 = v1; // e..
[C++] constexpr 조건문 들어가며 다른 프로그래밍 언어와 C++의 큰 차이점을 들자면 C++ 표준 위원회는 강박증이라고 생각될 정도로 컴파일 타임에 뭔가를 하는 것에 집착하는것 처럼 보인다. 오늘 포스트에서 다루어 볼 constexpr도 그 중의 하나로써, 이전 포스트 constexpr 상수, constexpr 함수 에서 constexpr을 이용해 컴파일 타임 상수와 컴파일 타임에 실행 되는 함수에 대해 살펴 본것에 이어 컴파일 타임에 조사 되는 if 문을 살펴 보고자 한다. if constexpr 일반적인 조건문은 실행 시간에 조건식을 조사하는 반면에 constexpr 조건문은 컴파일 시간에 조건식을 조사한다. 이 때 if constexpr의 조건식에 들어가는 조건문은 반드시 컴파일 타임에 값을 결정할 수 있어야만 한다. //..
[C++] constexpr 함수 들어가며 이전 포스트 'constexpr 상수'에서는 컴파일 타임 상수로써의 constexpr 키워드에 대해 살펴 보았다.이번 포스트에서는 컴파일 타임 함수로써의 constexpr 함수의 개념과 특징에 대해 살펴 보는 시간을 갖도록 하겠다. constexpr 함수의 개념 먼저 아래의 코드 샘플을 살펴 보자. constexpr 함수의 형식은 기존 C 또는 C++에서의 함수와 매우 비슷하다. 다만 앞에 constexpr 키워드를 붙여 주기만 하면 된다. // C/C++의 일반적인 함수 // // int add(int a, int b) // { // return a + b; // } // constexpr 키워드가 붙은 함수 constexpr int add(int a, int b) { return a + b;..
[C++] constexpr 상수 들어가며 이번 포스트에서는 C++11 부터 새로이 추가된 constexpr 키워드에 대해 살펴 보도록 하겠다. 먼저 constexpr에 대해 이해하기 위해서는 기존 C++의 const에 대해 먼저 이해 해야할 필요가 있다. 아래 예제를 살펴 보자. int main() { const int c1 = 10; c1 = 20; // error! } 위 예제는 간단하게 const 상수를 정의하고 값을 변경하고 있다. C++에서 const 한정자로 정의된 변수는 값을 바꿀수 없음을 의미하므로 위 코드를 컴파일 하게 되면 에러가 발생하게 된다. 그리고 C++11 부터 상수를 만드는 또 다른 키워드인 constexpr이 등장한다. constexpr c2 = 10; c2 = 20; // error! constexpr 역..
[C++] iomanipulator 완벽 가이드 들어가며 이번 포스트에서는 C++의 출력 포멧을 조절할 수 있는 iomanipulator에 대해 살펴 볼 것이다. 자세한 동작 원리는 나중에 연산자 오버로딩에서 깊게 살펴 보도록하고 이번 시간에는 iomanipulator의 개념과 사용 방법을 위주로 다룰 예정이다. std::dec 변수 값을 10진수로 출력 std::hex 변수 값을 16진수로 출력 std::setw 문자열 출력시 개수 지정 std::setfill 공백을 채울 문자 지정 std::left 문자열 왼쪽 정렬 iomanipulator란? C++에서 입력이나 출력의 형태를 지정하기 위해 사용하는 것을 iomanipulator라고 한다. 설명에 앞서 먼저 아래의 예제 코드를 살펴 보도록하자. 아래 코드는 간단하게 int 타입의 변수를 출력하고 ..
[C++] 표준 입출력 완벽 가이드 들어가며 이번 포스트는 C++ 기초 강좌로써 표준 입출력에 대해 살펴 보도록 하겠다. 이번 포스트는 어떻게? 왜? 라는 이해 보다는 그냥 이런것이 있구나라는 받아들이는 마음으로 가볍게 읽으면 된다. 표준 입출력? 표준 입출력은 우리가 C++ 프로그램을 만들고 실행 시켰을 때 새까만 콘솔창에 텍스트를 출력하거나 입력하는 것을 의미한다. C++에서 표준 입출력을 사용하기 위해서는 iostream, cout, cin. 이렇게 세 가지 대해 알아야 한다. 아래의 예제 코드를 살펴 보면서 이 세 가지 키워드에 대해 익숙해져 보도록 하겠다. C++ 표준 입출력 예제 코드 #include int main() { int age = 0; std::cout age; std::cout

반응형