left-value와 right-value

By | 2010/07/12

  C 언어를 공부하면서 헷갈린다고 하는 것 중 하나가 이름의 이중성입니다.

  1. int a = 1;
  2. int b = 2;
  3. int c = a + b;

  위의 코드에서 첫 번째 줄과 두 번째 줄의 의미는 a와 b 변수에 각각 1과 2를 할당합니다. 그런데 세 번째 줄에서 a와 b는 사용되고 있습니다.

  이를 유식한 말로 left value이니 right value이니 얘기를 하였습니다. 그래서 단순히 할당과 사용에서 둘의 차이가 난다는 정도로만 이해했습니다. 그렇기에 그 후 몇 번이고 이 단어를 쓸 일이 있었지만 제대로 얘기를 할 수 없었습니다.

 

  nVec님추천해주신 강의 자료를 읽으면서 그 부분이 다시 나왔고 이번 기회에 정리해보고자 하여 글을 적게 되었습니다.

이름이 가지고 있는 의미는 두 가지이다. 우선 메모리 주소에 이름을 붙인 것으로, 이름 지어진 메모리 주소를 뜻한다. 하지만 그 이름으로 그 이름이 지칭하는 메모리 주소에 있는 값을 뜻하기도 한다. 이렇게 이름이 뜻하는 두 개의 값을 이름의 "L-value"(left-value)와 "R-value"(right value)라고 부른다. 이름이 x := E의 꼴에서 왼쪽에 나타났을 때와 오른쪽 식 E안에 나타났을 때 그 의미하는 바가 다르기 때문이다. 왼쪽에 나타났다면 이름은 메모리 주소를 뜻한다. 오른쪽에 나타났을 때는 그 메모리 주소에 보관된 값을 뜻한다.

출처 : SNU 4190.310 Programming Languages Lecture Notes, Kwangkeun Yi

 

  위에서 보여준 코드 예제를 보고 얘기하면 다음과 같이 되는 것입니다.

  예를 들어 a의 주소는 100번지, b의 주소는 200번지, c의 주소는 300번지라고 합시다. 첫 번째와 두 번째 줄에서 a와 b는 실제로는 주소 100번지와 200번지를 뜻합니다. 그렇게 해야 그 주소를 확인하여 1의 값을 주소 100번지에, 2의 값을 주소 200번지에 할당할 수 있는 것입니다.

  하지만 세 번째 줄의 경우에 a와 b는 주소를 뜻하지 않습니다. 100번지, 200번지가 아닌 100번지에 적혀진 값과 200번지에 적혀진 값을 뜻합니다. 따라서 세 번째 줄에서 a와 b는 자신이 가리키고 있는 번지의 값인 1과 2가 되는 것입니다. 그렇지만 c는 여기서 위와 마찬가지로 주소 300번지를 뜻합니다.

 

  라고 이해를 하였지만 아직도 명확하게 맞다! 라고 얘기를 하기 어렵네요. 무언가 부족하다는 느낌이 강렬합니다.^^;; 그래도 이 정도면 L-value와 R-value에 대해 이해를 하였다고 생각합니다.

  재미있는 것은 이러한 이중성을 가지고 있음에도 이제는 익숙해져서 일까요? 전혀 어색하거나 읽기 어렵다는 느낌이 들지 않습니다. 강의 자료에서도 각각을 구분한다면 프로그래머가 불편해할 것이라고 얘기합니다.^^;;

2 thoughts on “left-value와 right-value

  1. nvec

    그런 자잘한 구분과 세세한 항목을 감춰주는 것을 abstraction이라고 하는 거겠죠.

    진정 잘 이해하고 있으려면 추상화 아래 가라앉은 부분까지 알고 있어야 한다고 생각합니다.

    Reply
    1. NoSyu

      네.. 그래서 그것이 중요하다고 생각합니다.
      하지만 연구하는 입장에서는 제대로 알고 있어야 하는데 그 부분에 있어 소홀히 하지 않았나 하는 생각이 듭니다.OTL

      Reply

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.