본문 바로가기

지식창고/프로그래밍

Const 키워드

반응형

일단 const 키워드의 사용 범위는 c와 c++에서도 사용되기 때문에 c란과 c++란의 설명은 동일함.

 

const는 사용되는 대상에 따라 의미가 약간씩 다르다. 각각의 의미와 사용방법, 사용하는 이유, 특성 등에 대해 설명하여보겠습니다.

 

우선적으로 말해보자면 가장 대표적으로 사용하는 이유는 바로 값을 함부로 변경하지 못하게 함에 있어서라고 표현할 수 있습니다.

 

(1). 일반적인 C언어 자료형의 변수

 : const int num = 10;  (int const num = 10; 둘 다 같은 표현으로 사용됨.)

Int형 변수 num을 선언과 동시에 5로 초기화 하고, 변수 num의 값을 변경하지 못하게 해라라는 뜻.

일반 변수 뿐만 아닌 배열에도 동일하게 사용이 가능함

Ex). const int arr[5] = {1, 2, 3, 4, 5}; 

(int const arr[5] ={1, 2, 3, 4, 5}; 둘 다 같은 표현으로 사용됨.))

:마찬가지로 형태만 배열로 변경 되었을 뿐 arr[0] = {1},. arr[1] = {2}, arr[2] = {3},. arr[3] = {4},

arr[4] = {5}로 초기화하여 변경하지 못하게 해주는 함.

 

 

(2). 일반적인 C언어 자료형의 포인트 변수

:int *const p = &a;

포인터 p를 선언하고, 그 포인터를 오른쪽에 있는 주소 값으로 상수화 하라는 뜻.

, 포인터 p는 오직 a의 주소만을 가르키게 되며, 포인터 연상을 통해 포인터 p

다른 주소를 가르키게 하는  것이 불가능 해짐.

하지만, 포인터 p를 통하여 그 변수의 값 (a의 값)만큼은 마음대로 접근하여 변경가능함.

 

 

const int *p; (int const *p 둘 다 같은 표현으로 사용됨.)

가르키는 변수의 값을 변경하지 못하게 하는 const 포인터 p를 선언.

const 포인터 p는 여러 변수의 주소 값을 가질 수 있기 때문에, 선언과 동시에 초기화를 꼭

해줄 필요는 없음.

하지만, 포인터 p가 가르키는 대상을 완전히 값을 변경하지 못하게 하는 것이 아닌,

포인터 p를 통하여 값을 변경시키지 못하게 막는 것임.

 

 

const int *p = &a;

와 같이 선언 할 경우, 포인터도 상수화, 포인터가 가르키는 대상 (a)eh 상수화 하는 것.

포인터 p a라는 하나만을 가르키게 되며, 그 가리키는 대상 a의 값도 변경하지 못하게

하는 것.

 

 

(3). 레퍼런스형 매개 변수

:원래라면 레퍼런스 즉 참조자는 int &ref = a; 와 같이 참조하는 역할로 변수만을 참조가 가능하나 

const int &ref = 50; const를 사용해주게 되면 상수도 참조가 가능해짐.

즉 매개 변수 예를 들어 int add(const int &num1, const int &num2)과 같이 함수를 만들어

메인함수가 되었건, 호출되어지는 영역에서 add(5, 10); 으로 호출을 하여도 문제 없이 const

사용하여 상수화 하였기 때문에 불러 올 수 있게 해주는 역할을 함.

, int add(int &num1, int &num2)로 하게 될 시에는 add(a, b); 와 같이 해주게 되어야함.

 

 

(4). 맴버 변수

:const의 말 그대로 값을 변경 시킬 수 없는 맴버(상수)

사용법은 다음과 같이

class test

{

          const int num;

};

사용하면 됨.

 

 

(5). 맴버 함수

:함수 내에서의 맴버 변수의 값을 변경 할 수 없는 함수(맴버 변수의 값을 변경이 불가능한 함수)

 

사용법은 다음과 같이

class test

{

           const int num;

 

 

public:

           void print() const

           {

                     cout << test << endl;

           }

};

사용하면 됩니다. 

 

, 무슨 말인가 하면, 예를 들어

 

class test

{

int testnum;

 

 

public:

           void print() const

           {

                     cout << test << endl;

                     testnum++;

           }

};

과 같이 testnum의 값을 변경 시켜주려 하게 될 시 에러를 발생 한다는 것.

그 이유는 바로 맴버 함수인 print const를 사용함으로써 함수만 호출할 수 있게만 해주는 역할역 하는 것이지, 값을 변경하는 기능까지는 진행을 못한다는 것.

 

 

(6). C++의 클래스 객체

: 상수화된 객체는 상수화된 함수만을 호출해야 함. 

 

예를 들어

class test

{

    const int num;

public:

                  test(int _num)

                                   :val(_num)

                                   { }

 

 

                  void print()

                  {        //컴파일 에러?!!

                             cout<< num <<endl;

                  }

};

 

 

int main(void)

{

                  const test t_work(10);

                  t_work.print();

                  return 0;

}

 

 

와 같이 해주게 되면 에러가 발생하게 된다. 하지만 다음과 같이 변경 해주게 될 시에는

 

 

class test

{

    const int num;

public:

                  test(int _num)

                                   :num(_num)

                                   { }

 

 

                  void print() const

                  {       

                             cout<< num <<endl;

                  }

};

 

 

int main(void)

{

                  const test t_work(10);

                  t_work.print();

                  return 0;

}

 

 

문제 없이 구동이 된다는 점이다. 쉽게 말해 const 클래스 객체를 사용할 때 에는 const로 상수화 시킨 매개 함수만을 불러 올 수 있다라고 이해하는 것이 빠를 수도 있습니다.

반응형