본문 바로가기

프로그래밍/C언어

[C언어] const 키워드

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


 const란, constant의 약자로 "변함없는"이란 뜻으로 변수 앞에 붙이면 값과 주소를 변경할 수 없도록 만들어 준다. 변수를 상수로 만드는 것이다.




일반적으로 변수를 사용하는 방식




 변수 앞에 const가 선언되면서 int _Max는 값과 주소가 변하면 안 되는 변수가 되었다. 이러한 특징 때문에 const형 변수는 하루 24시간, 1년 365일이렇게 값이 변하지 않는 변수로 많이 사용된다. 하지만 const 키워드를 포인터 변수에 사용할 경우 사용법이 달라진다.



【 포인터 변수에 const 키워드 사용 】


포인터 변수에 const 키워드를 붙이는 방법은 두 가지가 있다.


EX) const int* _Max = &Value;     const가 앞에 붙는 경우

      int* const _Max = &Value;     const가 뒤에 붙는 경우


 const가 앞에 붙는 경우에는 포인터 변수 안에 값을 변경할 수 없고, const가 뒤에 붙는 경우에는 포인터 변수의 주소값을 변경할 수 없다.



   



 const 키워드의 위치에 따라 에러 발생의 원인이 다르다. 그렇다면 포인터 변수의 주소값과 실제 값을 변경할 수 없도록 하려면 어떻게 해야 할까? const 키워드를 앞뒤로 붙여주면 된다.




어떤 값을 변경하더라도 에러가 발생한다.



【 구조체 멤버 변수의 const 사용 】


 구조체 멤버 변수에 const 키워드가 붙는다면 구조체 변수를 생성할 때 초기화를 해주어야 한다.  초기화 시켜 주지 않으면 에러가 발생하기 때문에 const 멤버 변수가 있다면 무조건 초기화를 시켜줘야 한다.



 구조체 stData의 멤버 변수로 있는 const int iData를 초기화해주기 위해서는 해당 구조체 변수를 생성할 때 중괄호를 사용하여 초기화 시켜줘야 한다. 하지만 구조체를 사용할 때 위 그림과 같이 사용하는 경우는 거의 없고, 다수의 멤버 변수를 가지고 있게 된다.



위와 같은 경우 어떻게 초기화 시켜줄까?





 위처럼 초기화 시킬 수 있지만 가독성이 떨어지고 구조체를 선언할 때마다 const 변수를 신경 써서 초기화 시켜줘야 한다.





생성자에서 초기화해준다면 선언할 때마다 일일이 초기화해주지 않아도 된다. 구조체의 const 멤버 변수의 초기화에 대하여 설명하긴 했지만 실제로 이런 식으로 사용하는 경우는 거의 없다. 구조체 안에 const 변수를 선언해서 사용하는 것은 번거롭고 효율도 좋지 않기 때문에 되도록이면 사용하지 않는 것이 좋다. 



【 클래스 멤버 변수의 const 사용 】



 클래스의 const 멤버 변수도 구조체 멤버 변수와 똑같이 초기화 주면 된다. 대신 클래스는 중괄호를 이용한 초기화는 불가능하다. 흔히 초기화를 생성자 안에서 해주는 경우가 많은데 그것은 초기화가 아닌 값의 대입이기 때문에 const 변수는 에러가 발생한다.




const는 함수 뒤에 붙여 사용할 수도 있다. 함수 뒤에 const가 붙는다는 것은 클래스 멤버 변수를 "이 함수 안에서 변경할 수 없다"라고 명시하는 것이다.





 const 키워드를 붙여 선언한 함수 안에서는 클래스 멤버 변수에 값을 변경하면 에러가 발생하는 것을 볼 수 있다. GetData 함수는 stData 클래스에 선언되어 있기 때문에 stData 클래스에 선언된 멤버 변수만 해당되며 다른 클래스 멤버 변수나 그 외 변수들은 값을 변경할 수 있다.





또, const 함수 안에서 호출되는 함수 역시 const 함수가 아니면 에러가 발생하는데, const가 아닌 멤버 함수에서 멤버 변수를 수정할 수 있기 때문이다. 대부분의 const 함수는 클래스 멤버 변수의 값을 리턴하는 용도로 많이 사용된다.





【 함수 const 매개변수 】


const가 함수 뒤에 붙는 경우도 있지만 함수 매개변수에 사용하는 경우도 있다.는 것이다.




 함수 내 매개변수를 const로 상수화 시킨 것이다. 위 함수와 같이 값이 변하면 안 되는 매개변수에 const를 사용하면 실수로 발생하는 버그를 줄일 수 있다. const가 필요하다고 생각되는 곳이 있다면 사용하여 값을 보호하는 것이 좋다.