Prosto

const(상수화) 키워드의 이해 (예제) - c언어 본문

Programing/C Programing

const(상수화) 키워드의 이해 (예제) - c언어

Prosto 2016. 12. 1. 20:17


'const, 변경할 수 없게 상수처럼 만들어라.'


이번 시간에는 const(상수화)에 대하여 알아보도록 하겠습니다.

const는 실제 문제를 내놓기도 애매하니

예제 두 가지를 가지고 const에 대하여 배워보도록 하겠습니다.



const, 들어보셨을 수도 있고, 처음 보셨을 수도 있습니다.

그럼 이 const 키워드는 어떤 때 사용하고, 왜 사용하는지 알아볼까요?


일단, 상수화라고 하니 상수란 무엇인지 알아봅시다.


간단한 정의지만,

우리는 프로그래밍을 배우며 사용하고 있으니, 프로그래밍으로 살펴볼까요?



C언어에서

int num;

이라고 선언하면 무슨 말인가요?


이름이 num인 int형인 변수를 선언한 거죠?

여기서는 보면 우리가 num을 변수라고 부릅니다.

num=5; num=10; num=200;

 이렇게 일정 범위 내에서 여러 가지 값으로 변화가 가능한 게 바로 변수입니다.


그렇다면 상수는 무엇일까요?

그냥 5, 10, 12 등이 바로 상수입니다.

우리가 5를 앞으로 20으로 쓰고싶다고

5 = 20;이라고 할 수 없죠?

 이렇듯 항상 같은 값을 가지는 게 바로 상수입니다.

(문자 a, b, c / 실수 1.2, 22.22 등도 마찬가지겠죠?)


그럼 변수와 상수가 확실하게 구분됐나요?


이제 const(상수화)의 뜻을 살펴볼까요?

 const(상수화)의 의미는 이미 정해진 상수 외에 우리가 새롭게 상수를 만들어주는 작업을 말합니다.



예를 들어 설명해볼까요?

숫자 10(십)을 의미하는 상수는 무엇이 있나요?

라고 이야기한다면 10..밖에 없죠?(여러 언어, 숫자 말고요.)

우리는 이 10 외에도 10이라는 의미를 갖도록 할 수 있습니다.

int max = 10;

이런것도 max는 10이라는 의미를 갖죠?

하지만 중간에 max = 5;라고 한다면요?

그러면 max는 10이 아니게 됩니다.

그렇다면 상수라고 볼 수는 없겠죠?(바로 변수죠)

우리가 "10은 앞으로 5다."라고 바꿀 수 없는 것처럼 바뀌면 안 되니까요.


방금 max처럼 우리는 프로그래밍 중 필요에 따라 숫자 10의 의미를 갖지만 다른 이름으로 사용하고 싶을 떄가 있습니다.


그런 때 바로 상수화를 하는 겁니다.

const int max = 10;

이라고하면 max는 앞으로 쭉 10과 같습니다.


상수화시켰으니 변수처럼 변경도 불가능하겠죠?

const int max = 10;

max = 5;

이런 게 불가능합니다.


+이러한 기능을 하는, 선행처리기 중 정의(define)가 있죠?

  #define max 10


+const는 실제로 사용할 때는 define과는 다른 용도로 많이 사용되지만요.

(어떤 값을 상수화시켜 다른 사람이 임의로 변경을 못 하도록 만드는 데 아주 유용하겠죠?)



자, 이정도 이야기했으면 변수와 상수, 상수화에 대하여 틀이 잡혔으리라 생각됩니다.

예를 들어 설명하는 중 사용방법도 함께 봤네요.




실제 예제 소스를 보도록 합시다.


먼저, const가 들어간 소스와 실행결과를 볼까요?(예제1)

일반 변수 num1과 상수화한 변수 num2

printf로 출력해보니 둘 다 같은 결과가 나왔다는 것을 확인하실 수 있습니다.

사용하는데는 아무 문제 없죠?


그럼, 약간 더 추가해 볼까요?

자, 컴파일이 에러를 띄우고 있습니다.

num1++;은 아무렇지 않지만,

num2++;는 변경할 수 없다고 에러(빨간 줄)가 나오죠?


이렇게 값을 읽을 수는 있지만, 변경하거나 쓸 수는 없는 게 바로

const 키워드를 붙여 상수로 만들어버렸다는 거죠.

(아까 이야기했던 10은 10밖에 없다같이. num2는 25밖에 없다로..

참조는 가능하지만 변경이 불가능하다는 게 포인트입니다.)


const 키워드 사용 시 어떻게 사용하면 되고 어떤 기능을 하는지 잘 아셨으리라 생각합니다.



이번에는 다른 예제를 통해 실제로 사용할 땐 어떤 상황에서 왜 사용되는지 알아보도록 하죠!(예제2)

(포인터와 함수를 이용한 예제입니다.)


PlusFive함수에서 포인터를 받아

해당 포인터가 가리키는 대상 변수 값을 5 증가시켜주고있죠?


바로 실행 결과를 보겠습니다.

이렇게 의도한 대로 잘 실행되고 있죠?


이제 이런 함수를 사용할 때, const를 어떻게, 왜 사용하는지 볼까요?

이렇게 함수 진행 중

포인터로 받은 변수였지만,

착각하고 일반 변수처럼 사용했을 수도 있겠죠?

(가리키는 주소에 담긴 값이 아닌 주소 값이 바뀌겠구요.)


그러면 실제로 컴파일, 실행은 되겠지만,

의도한 결과는 나오지 않죠?

(이 출력 결과와 다르게 5, 5가 나오는 것도 확인되고요.)


void PlusFive(int* p) 함수에서

void PlusFive(int* const p)로,

이렇게 const 키워드를 넣으면

p의 값을 바꾸지 못 하도록 설정할 수 있습니다.(상수화)


빨간 줄이 나오며 변경할 수 없다고 하죠?


const 키워드를 넣어 상수화를 시키면

이렇게 실수를 방지할 수 있습니다.

(변경이 아닌 오로지 참조만 하도록 하는거죠.)


이렇게 실수를 정정하여

포인터 값(주소)을 바꾸는 게 아닌

포인터가 가리키는 값(main 함수의 int num;)을 변경하게 됐죠?



하나 더 볼까요?

void PlusFive(int* p) 함수에서

void PlusFive(const int* p)로,

이렇게 const 키워드를 넣으면

*p의 값을 바꿀 수 없게 됩니다.

(그럼 실수로 p = p + 5; 주소 값 수정은 가능한 상태죠.)


이렇게 포인터 값에 사용하는 경우

const 위치에 따라 주소 값을 바꿀 수 없도록 하거나, 주소가 가리키는 값을 바꿀 수 없도록

상수화 시킬 수 있습니다.


실제로 주소 변경은 가능했지만,

가리키는 값 변경은 불가능하다고 빨간 줄이 생겼죠?

(이렇게 const 키워드는 맞는 위치에 넣어줘야 합니다.)



실제로 사용할 때, 포인터 뿐만 아니고 함수에서 값을 받을 때는 const로 받기도 합니다.

값을 참조만 하고 변경하지 않는다면,

const로 받아준다면 의도하지 않은 변경을 방지할 수 있겠죠?



예제1번 예제2번 모두 실제로 코딩하여 실행해보시길 바랍니다.

const(상수화) 관련 문제는 제시하지 않았지만 예제를 통해 const에 대하여 이해하고

다른 문제를 풀 때 적용해보면 좋은 공부가 될 것 같습니다.



질문은 댓글이나 메일로 따로 연락주시면 시간되는 때 답변드리겠습니다. ( 연락 )

Comments