2021년 1월 12일 화요일

C++에서 Lvalue와 Rvalue

표준 C언어의 관점에서 Lvalue와 Rvalue는 Left Value와 Right Value를 의미한다.

대입 연산자(=)를 기준으로 왼쪽에만 쓸 수 있는 값(variable)을 Lvalue라 하고, 오른쪽에만 쓸 수 있는 값(보통 상수) Rvalue라 한다.


하지만 C++ 표준에서는 Left/Right를 의미하지 않고, Lvalue/Rvalue를 그 자체로 보는 것이 맞다.


C++에서 Lvalue와 Rvalue의 의미는 다음과 같다.

  • Lvalue
    단일 표현식 이후에도 없어지지 않고 지속되는 객체
  • Rvalue
    표현식이 종료된 이후에는 더 이상 존재하지 않는 임시적인 값

  • 예시
    int x = 3;
    const int y = x;
    int z = x + y;
    int *p = &x;
    cout << string("one");
    ++x; // 증가된 x 자신을 리턴
    x++; // 증가된 복사본을 리턴


Lvalue 참조자 &와 Rvalue 참조자 &&
  • Lvalue 참조자 &
    Lvalue만 참조할 수 있음
  • Rvalue 참조자 &
    Rvalue만 참조할 수 있음

  • 예시
    int x = 10;
    int& a = x;
    //int& b = 10; => error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'
    int&& c = 5;
    //int&& d = a; => error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'ini'


 

 

 
 
 

C++ Type Casting 연산

C언어의 형변환(Type Casting)의 경우, 타입 체크를하지 않아서 버그를 유발할 수 있어
컴파일 단계에서 Warning이 뜨거나 에러가 발생하는 경우가 많고, 
실제로 원치 않는 데이터 유실이 발생할 수도 있다.

C++에서는 4가지 Type Cast Operation을 제공한다.

  • static_cast
    • 컴파일 단계에서 타입체크를 수행한다.
    • child class의 포인터를 parent class로 캐스팅한다.
    • parent class의 포인터를 child class로 캐스팅한다. (child class만의 variable/method 사용 불가)
    • 기본적 타입들에 대한 변환에 사용
    • runtime check를 하지 않는다.

  • const_cast
    • 컴파일 단계에서 타입체크를 수행한다.
    • 타입에 const, volatile 키워드를 붙이거나 땔때 사용한다.

  • dynamic_cast
    • runtime 시에 동작한다.
    • 객체를 상속 관계 속에서 캐스팅 하는 등 객체의 포인터에만 사용한다.
    • virtual method를 가지는 클래스에서 사용하며, 그렇지 않은 경우는 static_cast를 사용하면 된다.
    • 만약 주어진 포인터가 캐스팅하기에 적절하지 않으면 NULL을 리턴한다.
    • dynamic_cast의 종류
      • upcast
        child class를 parent class로 캐스팅
      • donwcast
        parent class를 child class로 캐스팅
      • crosscast
        다중 상속 시 사용

  • reinterpret_cast
    • 포인터를 어떤 타입으로든 캐스팅할 수 있다.
    • 강력하지만 위험, C언어의 형변환과 가장 유사해 보인다.

C언어의 형변환(Type Cast)

  • 암묵적 형변환
    상황에 따라 자동적으로 이루어지는 형변환을 암묵적 형변환이라 한다.
    ex)
    • int n = 0;
      n = 123.123123;
      // n은 123이 된다.
    • char a = 10;
      short b = 20;
      c = a + b;
      // c는 char+short => 하지만 int로 변환된다.
    • double n = 10 + 20.123;
      // 10.0 + 20.123 = 30.123 으로, 10이 double 타입으로 형변환된다.

  • 명시적 형변환
    명시적 형변환은 변수의 타입을 강제적으로 명시하여 변환하는 방법이다.
    ex)
    • double f=0;
      f = (double)10 / 8;
      // 10.0 / 8 = 1.25

스프린트 정리

스프린트 :  스프린트는 프로토타입을 제작하고 고객과 함께 아이디어를 테스트하여 중요한 문제들에 대한 답을 찾는 독특한 5일 짜리 과정이다. 스트린트는 업무 전략, 혁신 행동과학, 디자인 그 외 여러 분야의 최고 히트작을 어떤 팀에서라도 사용할 수 있...