본문 바로가기
프로그래밍/키워드 정리

[C++] 복습용 키워드 정리 - 3

by Sik.K 2023. 3. 12.

<상수 - const>

 

상수는 변하지 않는 값을 의미한다. int a = 10에서 10은 a는 변수, 10은 상수이다.

 

따라서 변수값에 const를 붙이면 이 변수는 변하지 않는 값을 사용한다는 의미가 된다. 때문에 const를 붙인 변수는 선언과 동시에 초기화를 해주어야 한다.  함수에서 매개 변수로 특정 변수를 받아올 때, 값의 수정을 원치 않으면 const를 붙여 상수화 해주면 매개 변수로 값을 받아와도 이 값은 변하지 않게 된다.

 

이 상수는 포인터 변수에 사용을 할 때 사용법이 조금 달라진다. int* a라는 포인터 변수는 &Value라는 값을 가지고 있다. 이 포인터 변수가 만약 const int* a가 된다면 a가 가지고 있는 주소가 참조하는 값에 대한 상수화가 되기 때문에 값을 변경할 수 없다. 하지만 포인터 변수 a에 대한 상수화가 아니기 때문에 a가 가지는 주소는 얼마든지 바꿀 수 있다.

 

하지만 int* const a의 경우에는 a라는 변수 자체에 대한 상수화가 되기 때문에 포인터 변수 a가 담고 있는 주소를 변경할 수 없게 된다.

 

만약 포인터 변수와 해당 변수가 참조하는 값 모두 상수화를 하고 싶다면 const int* const a와 같은 방식으로 사용하여야 한다.

 

<포인터>

 

*의 기호를 가진다.

 

c의 특징은 포인터이다. 포인터 변수는 일반적인 값이 아닌 주소값을 가지는 변수다. 따라서 int* a = b의 경우 a가 가지는 값은 b라는 변수의 메모리 주소값을 가진다.

 

때문에 만약 *a = 10으로 주게 된다면 a 변수는 자신이 가지고 있는 메모리 주소인 변수 b에 접근을 하여 값을 수정하는 것이므로 b의 값도 똑같이 바뀌게 된다.

 

포인터 변수의 특징은 주소를 가지기 때문에 동적할당에 사용하기도 한다. 초기에 포인터 변수를 선언하였을 때, 해당 변수에는 아무 값도 없다. 런타임 도중, 특정 상황에서 동적할당을 하여 포인터 변수를 사용하는 경우가 있는데 c++에서는 다음과 같이 사용된다.

 

가령 Time이란 클래스가 있다고 가정을 하자.

 

Time* time = new Time();

 

이런 방식으로 사용하여 변수에 런타임 도중 공간을 지정하여 값을 할당할 수 있다.

 

<레퍼런스 - 참조자>

 

&의 기호를 가진다.

 

선언과 동시에 초기화가 되어야 하며, 상수에 대한 참조는 할 수 없기 때문에 const를 붙여야 가능하다. 쉽게 설명하면 별명을 붙이는 것과 같다.

 

int a = 10;

int& b = a;

 

이 경우에 a의 메모리 공간에는 b라는 별명이 붙은 것이 되어 변수 b를 이용해서도 a의 값을 변경하는 것이 가능하다. call by reference의 방식을 이용할 때 매개변수로 참조자를 붙여 사용한다.

댓글