티스토리 뷰

본 포스팅은 Effective Modern C++ (3rd edition)에 대한 내용을 정리하기 위한 시리즈입니다. 이번 포스팅에서는 소개 부분의 간단히 정리되어 있는 C++ 문법과 idiom에 대한 용어만 짧막하게 정리하였습니다.

 

 

 

용어 정리


l-value와 r-value

  • l-value는 등호의 좌변에 올 수 있는 값을 뜻하는 'left value'에서 비롯된 것입니다. 하지만 C++에서는 LVALUE가 아니면서도 등호의 좌변에 올 수 있는 값이 존재합니다. r-value는 l-value가 아닌 값들입니다. 일반적으로 value에 주소 연산자(&)를 취할 수 있다면 l-value이고 그렇지 않다면 r-value입니다.

 

함수 객체, 클로저

  • 함수 객체(function object)라는 용어는 operator() 멤버 함수를 지원하는 형식의 객체를 뜻합니다. 즉, 함수처럼 행동하는 객체라고 할 수 있습니다. 이것은 일반적으로 좁은 의미에서의 함수 객체이며, 더 넓은 의미의 함수 객체에는 "함수명(파라미터...)" 형태를 이용해서 실행할 수 있는 모듯 것을 지칭합니다. 이 때, 넓은 의미에서의 함수 객체는 좁은 의미의 함수 객체를 포함하여 보통의 함수 및 C 스타일의 함수 포인터도 포함됩니다.
  • 여기에 멤버 함수 포인터를 추가해서 이를 더욱 일반화하면 소위 "호출 가능 객체(callable object)" 가 됩니다. 일반적으로는 이러한 세세한 구분을 무시하고 함수 객체와 호출 가능 객체라는 것이 그냥 C++에서 일정한 함수 호출 구문을 이용해서 실행할 수 있는 무엇이라고만 생각해도 무방합니다.
  • 람다 표현식(lambda expression)을 통해 만들어진 함수 객체를 "클로저(closure)"라고 합니다. 람다와 클로저를 구분해야 하는 경우는 드물므로 일반적으로 람다라고 칭하는 경우가 많습니다. (비슷한 예로 함수 템플릿과 템플릿 함수, 클래스 템플릿과 템플릿 클래스가 있습니다)

 

선언과 정의

  • 이름과 형식(type)을 현재 범위(scope)에 도입하기만 하고 그 세부사항(저장 장소나 구현 방법 등)은 지정하지 않는 것을 "선언(declaration)"이라고 합니다. 저장 장소나 구현 방법 등의 세부사항을 지정하는 것을 "정의(definition)"이라고 합니다. 정의는 선언의 의미를 포함합니다.

 

함수 서명

  • 함수의 서명(signature, 시그니처라고도 부름)은 함수의 선언 중 매개변수 형식들과 반환 형식을 지정한 부분이라고 정의합니다. 함수 이름과 매개변수 이름은 서명에 포함되지 않습니다. 이러한 정의는 공식적인 서명의 정의 - 함수의 반환 형식이 포함되지 않는 경우가 있음 - 와는 조금 다를 수 있습니다.

 

미정의 행동

  • 미정의 행동(undefined behavior)는 그 연산의 실행시점(runtime)에서 행동을 예측할 수 없는 것을 의미합니다.
  • 미정의 행동을 가진 연산의 예로는 다음과 같습니다:
    • std::vector의 범위를 벗어나는 색인을 지정하는 것
    • 초기화되지 않은 반복자를 역참조(dereferencing)하는 것
    • 둘 이상의 쓰레드들이 같은 메모리 장소에 쓰기 위해 동시에 접근하는 상황에 맞딱뜨리는 것

 

원시 포인터와 스마트 포인터

  • 원시 포인터(raw pointer)는 new가 돌려주는 포인터 같은 내장(built-in) 포인터를 원시 포인터라고 합니다. 그렇지 않은 포인터를 스마트 포인터(smart pointer)라고 합니다. 스마트 포인터는 대개 역참조 연산자(->, *)에 대한 연산자 오버로딩이 되어 있지만, std::weak_ptr는 예외입니다.

 

 

 

레퍼런스


[Effective Modern C++ - C++11과 C++14를 효과적으로 사용하는 42가지 방법]

댓글