들어가며
필자는 20대 초반이며
이제 막 대학에 입학하는 입장인지라,
대학 생활이나 OT, MT 등등 기대하고 있었는데
MT는 커녕 empty에 가까운 것 같다.
진짜 나한테 왜 그래 어흐흑.
const 참조자의 뇌절
전 글에서 const 참조자에 대해 이야기한 바가 있다.
이와 관련하여 추가적으로 보충할 내용이 남아있다.
그럼 어쨌거나 저쨌거나 다음 코드를 보고
논리적으로 무엇이 잘못 되었는지 확인하라.
const int num = 20;
int& ref = num;
ref += 10;
cout << num << endl;
'아ㅋㅋ 개쉽누ㅋㅋ, const로 num을 상수화 했는데 참조자 ref로 num값을 바꿨잖슴ㅋㅋ'
그렇다.
const 선언을 통해 변수 num을 상수화 하였는데,
참조자 ref를 통해 값을 변경하고 있기 때문에 오류가 발생한다.
상수화 되었다면 어떠한 경로를 통하더라도 값의 변경을 허용해서는 안 된다.
당연하게도 C++은 그러한 변경을 허용하지 않기 때문에
바로 위 코드 중에서 다음의 문장이 컴파일 에러를 발생시킨다,
int& ref = num;
따라서 변수 num과 같이 상수화된 변수에 대한 참조자 선언은 다음과 같다.
const int num = 20;
const int& ref = num;
이렇게 선언이 되면 ref를 통한 값의 변경이 불가능하기 때문에
상수화에 대한 논리적인 문제점은 발생하지 않는다.
const 참조자의 그랜절
const 참조자는 1절, 2절, 뇌절을 넘어 그랜절까지 박아버렸다.
이번에는 또 뭔가 싶은가?
바로 const 참조자는 다음과 같이 상수 참조가 가능하다는 것이다.
'야발, 그런게 어딨어;;'
지금까지 참조자는 변수를 대상으로 초기화한다고
실컷 설명했으면서 이제와서 뭔 소린가 싶은가?
미친 얘기 같지만 전부 사실이다.
당장이야 받아들이기 어려운 소리이지 않은가?
그러니 흥성대원군마냥 대뇌에서부터 쇄국정책을 펼치지 말았으면 한다.
일단 다음 코드를 보도록 하라.
int num = 20 + 30;
여기서 20과 30과 같이 프로그램 상에서 표현되는 숫자들을
우리는 '리터럴(Literal)'이라고 한다는 것을 알고 있다.
그리고 이들, 리터럴은 다음의 특징을 가진다.
리터럴은 임시적으로 존재하는 값이다.
다음 행으로 넘어가면 존재하지 않는 상수다.
무슨 뜻인지 이해가 되는가?
덧셈 연산을 위해서는 20과 30은 모두 메모리 공간에 저장되어야 한다.
하지만 저장되었다고 해서 재참조가 가능한 값은 아니라는 말이다.
즉, 다음 행으로 넘어가면 소멸된다는 것이다.
그런데, 이러한 상수를 참조한다는 것이 이번 문단의 핵심이다.
다음과 같은 형태의 코드로 말이다.
const int& ref = 30;
앞서 리터럴은 다음 행으로 넘어가면 소멸한다고 했다.
그러니 위 코드도 리터럴 30이 메모리 공간에 계속 존재할 때 성립하는 문장이다.
그래서 C++에서는 위의 문장이 성립할 수 있도록,
const 참조자를 이용해서 상수를 참조할 때 '임시 변수' 라는 것을 만든다.
그리고 이 변수(메모리 공간)에 상수 30을 저장하고,
참조자가 이를 참조하게끔 한다.
'뭔 희안한 임시 변수라는 듣보 개념까지 끌어와다가 상수 참조를 한다고? 굳이? ???'
본인도 그렇게 생각했던 찰나의 순간이 있었다.
다음의 코드를 보기 전까지는 말이다.
int Adder(const int& num1, const int& num2)
{
return num1 + num2;
}
위와 같이 정의된 함수에 인자의 전달을 목적으로
변수를 선언한다는 것은 매우 번거롭고 귀찮은 일이지 않은가?
그러나 '임시 변수'의 생성을 통해 const 참조자의 상수 참조를 허용함으로써,
위의 함수는 다음과 같이 매우 단순하게 호출이 가능해진다.
cout << Adder(3, 4) << endl;
어떤 상황에서 사용해야지만 시의적절하게 사용했다고 소문이날 지는 모르겠지만
우선 이러한 형태의 함수 호출이 가능하다는 것을 알아두면
요긴하게 사용될 것 같다.
마치며
드디어 길고 긴 참조자에 대한 챕터가 끝이 났다.
처음 접하는 내용이고, 여러가지 개념이 섞여있다보니
호흡이 길어져서 점점 지루해졌지만
나름 열심히 글을 썼다.
그건 그렇고 밖으로 좀 나가보고 싶다.
며칠째 강제 히키코모리 생활인지 모른다.
아무튼 다음 글에서는 'new'와 'delete'를 소개할 예정이다.