C 언어 - const 키워드

컴퓨터/C

728x90
반응형

키워드 const - 상수화 시키다 / 고정시키다.

프로그래밍을 하면 프로그래머는 다양하게 프로그램 안의 데이터를 사용하고 변환시킬 수 있습니다. 

프로그램의 양이 방대해질수록 프로그래머가 제어해야 될 데이터들을 엄청나게 많아집니다.

만약 원을 계산하기 위한 다양한 프로그램을 만든다고 가정을 하면, 원주율(파이) 값을 많이 사용을 할 것입니다.

이런 원주율 값을 프로그래머가 사용을 하려면 크게 2가지 방법이 있을 것입니다.

  • 매번 소스코드에 상수 3.141592의 상수를 입력한다
  • 변수를 하나 선언하고 3.14 1592를 저장하여 변수명으로 사용한다.

자주 사용하게 된다면 직접 3.14 1592라고 치는 것보다 변수를 선언에서 사용하는 게 효율적일 겁니다.

하지만 우리가 변수를 사용하게 된다면 고의든 실수든 이 값을 변경할 수 있는 가능성이 있습니다. 원주율(파이)의 값은 불변하는 절대적인 값인데 말이죠.

이런 상황을 프로그램의 설계부터 방지하기 위해 사용하는 것이 바로 const키워드입니다.  

어떠한 변수를 사용할 때 const키워드를 사용함으로써 그 변수의 값을 변화시키지 못하도록 하는 것이죠.

3.141592; // 일반 상수의 표현
double PI = 3.141592; // 변수를 이용한 표현
const double PI = 3.141592; //const 키워드를 이용한 변수의 상수화

실제로 이 const 키워드를 통해 어떤 식으로 제어가 되는지 알아보도록 하겠습니다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	printf("그냥 상수를 출력해 보도록 하겠습니다 : %lf", 3.141592);
	double PI = 3.141592;
	printf("그냥 변수 안의 값 출력해 보도록 하겠습니다 : %lf", PI);
	PI = 4;
	printf("이런경우 값의 변경이 가능합니다. : %lf", PI);

	const double PI_const = 3.141592; //const를 쓸 경우 반듯이 선언과 동시에 초기화를 해야된다
	printf("const 키워드를 사용한 출력 : %lf", PI_const);
	// PI_const = 5; error 발생! (이미 const를 통해 고정되어 불변의 값이 됨) 
}
  • const를 사용하여 어떠한 변수의 값을 고정하려면 선언과 동시에 초기화를 해야 됩니다.
    • 당연히 불변의 값으로 사용하기 때문입니다.

포인터와 const 키워드

포인터 변수는 일반 변수들과는 달리 2가지 기능을 하고 있습니다.

  • 포인터 변수 안에 다른 변수의 메모리 주소를 저장한다.
  • 저장된 메모리 주소 안의 데이터를 제어한다.

이런 특성 때문에 포인터 변수에 2가지 기능에 각각 선언하여 아래와 같은 기능으로 할 수 있습니다.

  • 포인터 변수 안에 저장된 메모리 주소를 불변으로 설정
  • 지정된 메모리 안의 데이터를 불변으로 설정.

다양한 곳에서 많이 활용되고 있으니 이 개념을 정확하게 이해하고 넘어가길 권장합니다.

 

사용 형식 예시

const int* const a;

const int* a;

      int* const a;
  • 첫 번째 
    • 좌우에 const 키워드를 사용해서 포인터의 2가지 기능을 제한한다는 의미입니다.
      • 저장된 메모리 주소 불변
      • 저장된 메모리 주소 안의 데이터 불변
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int a = 100;
	int b = 10;
	const int* const p = &a;

	//저장된 메모리 주소 변경 불가능 !
	// p = &b; // error 발생
	
	//저장된 메모리 주소 안의 데이터 변경 불가능 !
	// *p = 10; // error 발생
}
  • 두 번째 (자료형 앞에 const)
    • 포인터에 저장된 메모리 주소 안의 데이터 불변
    • 포인터에 저장될 메모리 주소는 변경 가능 
    • 이런 경우는 포인터를 통해 다른 메모리 주소의 값을 보는 것만 가능합니다!
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int a = 100;
	int b = 10;
	const int* p = &a;

	printf("포인터변수 p를 통에 저장된 메모리 주소 안의 데이터 : %d\n", *p);
	p = &b;
	printf("포인터변수 p를 통에 저장된 메모리 주소 안의 데이터 : %d\n", *p);

	//저장된 메모리 주소 안의 데이터 변경 불가능 !
	// *p = 10; // error 발생
}

  • 세 번째 (변수명 앞에 const)
    • 포인터에 저장된 메모리 주소는 불변
    • 포인터에 저장된 메모리 주소 안의 데이터는 변경 가능
    • 이런 경우는 바라볼 수 있는 메모리 주소의 위치를 제한합니다!.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int a = 100;
	int b = 10;
	int* const p = &a;

	printf("변수 a의 값: %d\n", a);
	*p = 10;
	printf("변수 a의 값: %d\n", a);

	//저장된 메모리 주소 안의 데이터 변경 불가능 !
	// *p = 10; // error 발생
}

이런 식으로 const 키워드를 사용함으로 특정 변수들의 특성들을 제한할 수 있습니다. 

const를 사용하여 먼저 변수의 기능들을 제한하여 사용한다면 프로그래밍을 하면서 불필요한 에러의 발생 등을 좀 더 효율적으로 제어가 가능하게 됩니다.

728x90
반응형

'컴퓨터 > C' 카테고리의 다른 글

C 언어 - struct(구조체)  (0) 2021.06.22
C 언어 -포인터와 배열  (0) 2021.06.21
C 언어 - 형변환(Casting)  (0) 2021.06.17
C 언어 - 오버플로우와 언더플로우  (0) 2021.06.16
C 언어 - 다차원 배열  (0) 2021.06.14

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :