본문 바로가기

C++

(32)
[C++] 연산자 오버로딩(operator overloading) 완벽 가이드 들어가며C++은 사용자 정의 타입의 연산을 정의하는 연산자의 동작을 재정의 할 수 있는 연산자 오버로딩(operator overloading)을 제공한다. 이번 포스트는 연산자 오버로딩에 대해 자세히 살펴 보도록한다.연산자 자체에 대한 보다 자세한 사항은 [여기]를 살펴 보도록 한다.연산자 오버로딩을 설명하기 위해 아래 Point 클래스를 살펴 보자. Point 클래스는 int x, y를 멤버로 가지고, display 함수가 호출되면 x와 y 값을 출력 해주는 간단한 클래스다.class Point{ int x; int y;public: Point(int x, int y) : x(x), y(y) {} void display() const { std::cout Poi..
[C++] sizeof도 연산자인가? 들어가며sizeof는 일반적인 +, -, /, * 와 달리 함수 처럼 생긴 연산자로 유명하다.연산자에 대한 글을 작성하다 sizeof에 대한 이야기를 해야 하는데 막상 필자도 sizeof는 연산자라는게 당연하다고만 생각했지 왜라는 의문은 한번도 가지지 않았다는 것을 깨닫고 이번 기회에 이유를 찾아 정리하게 되었다.이런 개념은 몰라도 크게 지장은 없지만 면접 보거나 심심풀 주제로 좋으므로 흥미 삼아 읽어 보도록 하자.C++ 연산자란C++ 연산자(operator)란, 하나 이상의 피연산자(operand)에 대해 특정 연산을 수행하는 기호 또는 키워드를 말한다.예를 들어 :산술 연산자 : +, -, *, /비교 연산자 : ==, !=, , >논리 연산자 : &&, ||, !대입 연산자 : =와 같은 다양한 연..
[C++] 스레드 동기화 - lock_guard 들어가며 이전 포스트 '스레드 동기화 - mutex'에서는 C++ 표준 라이브러리에서 제공하는 std::mutex 객체의 lock, unlock 함수를 직접 호출하여 크리티컬 섹션에 진입할 수 있는 스레드를 직접 컨트롤 했었다. 하지만 이런 방법은 앞으로 살펴 볼 '실수'를 유발할 수 있고, 이 실수들은 데드락을 발생 시켜 프로그램을 영원히 블록 시킬수 있다. 이번 포스트에서는 std::mutex의 멤버 함수를 직접 호출할 때 야기할 수 있는 '실수'들을 살펴 보고, std::lock_guard를 사용했을 때의 이점에 대해 살펴 보도록 하겠다. std::mutex의 문제 위에서 std::mutex의 lock과 unlock 멤버 함수를 직접 호출하는 경우 프로그래머의 '실수'로 인해 프로그램이 데드락 상태..
[C++] 스레드 동기화 - mutex 들어가며 이번 포스트는 C++에서 스레드간 동기화를 위해 제공하는 std::mutex에 대해 자세히 알아 보도록 하겠다. 본 포스트에서는 mutex가 무엇인지 크리티컬 섹션이 무엇인지 같은 교과서적인 기본 내용을 다루기 보다는 C++에서 제공하는 std::mutex 의 특징과 사용법에 대해 집중하도록 한다. 스레드 동기화에 대한 원론적인 개념에 대해 궁금하신 분들은 Operating System Concepts 같은 전통적인 컴퓨터 공학 전공 서적을 살펴 보시거나 간단 하게는 나무위키의 뮤텍스 항목을 살펴 보는 것도 도움이 될 것이다. C++ 표준이 제공하는 mutex 종류 C++ 표준 라이브러리에서는 아래와 같이 총 6가지의 뮤텍스를 제공하고 있다. std::mutex(C++11) std::timed_..
[C++] static 키워드 완벽 가이드 들어가며 C++에서 static 키워드는 간단한 사용법을 가지지만 복잡한 의미를 가지고 있는 아이러니한 키워드다. 함수든 변수든 간단하게 static이라는 키워드 여섯글자만 붙여 주면 무엇이든 static 속성을 가지게할 수 있지만 사용되는 각 위치에 따라 적용 되는 의미가 다양하기 때문에 각각의 static에 대한 의미를 잘 숙지하고 사용하여야 한다. 이번 포스트에서는 static 키워드의 기본 속성과 각 사용처에 따라 static 키워드가 가지는 의미, 주의해야 할 점, 프로그램 트릭들을 살펴 보도록 한다. static 변수 이번 섹션에서는 static 변수에 대해 살펴 보자. C++에서 static 변수란 기본 변수 선언 앞에 static 키워드를 추가하여 선언된 변수다. static int var..
[C++] 제네릭 람다 표현식 들어가며 이번 포스트에서는 C++14 부터 포함된 제네릭 람다 표현식에 대해 살펴 보도록 하겠다. 제네릭 람다 표현식은 auto 키워드를 이용해 하나의 람다 표현식 코드로 다양한 타입의 인자들에 대해 대응할 수 있는 람다 표현식을 말한다. 일반 람다 표현식 vs 제네릭 람다 표현식 먼저 일반적인 람다 표현식과 그 사용을 살펴 보자. auto add = [](int a, int b) { return a + b; }; std::cout
[C++] 람다와 함수 포인터 들어가며 이전 포스트(람다(lambda) 표현식)에서는 람다 표현식을 auto 변수에 담아 마치 함수 포인터인터인것 처럼 사용했었다. auto f1 = [](int a, int b) { return a + b; }; std::cout 함수 포인터 우리는 앞서 람다 표현식은 '이름 없는 함수 객체'라고 배웠다. 그런데 어떻게 객체가 함수 포인터에 저장 될 수 있는 것일까? 이유는 컴파일러에 의해 생성되는 함수자 클래스 내부에서 함수 포인터로 암시적 형변환을 지원하고 있기 때문이다. 컴파일러가 만드는 클래스에 '함수 포인터로 변환 될 수 있는 변환 연산자 함수 제공' // int (*f)(int, int) = [](int a, int b) { return a + b; }; class __CompilerGen..
[C++] 람다(lambda) 표현식 #3 들어가며 이번 포스트에서는 람다의 다양한 로컬 변수 캡처 방법에 대해 살펴 볼 것이다. C++ 람다에 대한 추가 정보는 이전 포스트 [C++] 람다(lambda) 표현식 #1 [C++] 람다(lambda) 표현식 #2 들을 참고 하도록 하자. 디폴트 캡처 디폴트 캡쳐는 모든 지역 변수에 대해 일괄 캡쳐를 진행할 수 있는 캡쳐 연산자다. 기본적인 람다 인트로듀서(대괄호로 표현된 람다 제일 시작 부분)에 캡쳐 리스트를 적는 대신 '=' 또는 '&'를 적는다. 기호 동작 [=] 모든 지역 변수를 capture by value [&] 모든 지역 변수를 capture by reference int v1 = 10, v2 = 20; auto f1 = [=]() {}; // 모든 로컬 변수를 값으로 캡쳐 auto f2..
[C++] 람다(lambda) 표현식 #2 들어가며 이전 포스트([C++] 람다(lambda) 표현식 #1)에서는 람다 표현식의 기본적인 내용을 살펴 보았다. 이번 포스트는 이전 포스트에 이어 람다 표현식에 대해 좀 더 자세히 다뤄 보도록 하겠다. 람다 = 임시 객체? C++에서 람다의 정의를 보면 다음과 같다. "an unnamed function object" capable of capturing variables in scope. 이전 포스트에서도 이야기 했듯이 람다는 이름 없는 함수 객체의 일종이다. 정확히 번역하자면 '범위 안에 있는 변수를 캡쳐 할 수 있는 이름 없는 객체'를 람다라고 한다. 이게 무슨 이야기인지 설명하기 위에 이전 포스트의 예제를 상기해보자. int main() { std::vector v = { 1, 3, 2, 5,..
[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

반응형