본문 바로가기

c언어

const에 대해서

이미 앞에서 상수와 변수를 말할때 const라는 명령어를 적었던것으로 기억한다.

 

const는 변수를 상수화 시키는것이라고 설명했을텐데 크게 다르진 않다.

다만 단어를 바꿔 변수를 "읽기 전용" 으로 바꾼다고 다시 설명하겠다.

 

읽기 전용이란 값을 변경할 수 없다는것인데. 이것이 상수와 동일하기 때문이다. 아니 애초에 상수가 읽기전용이니까 말을 바꾼게 아닌건가??

 

어찌되었든 const가 적혀있는것은 값을 변경할 수 없다.

그리고 const는 클래스의 멤버로도 들어올 수 있다.

 

다음의 경우를 보자.

#pragma once

class cTemp {
private :
	const int m_iTemp;
public :
	cTemp(int iTemp) { m_iTemp = iTemp; }
};

클래스 cTemp는 상수화된 int m_iTemp를 가지고 있다.

그리고 매개변수 있는 생성자를 통해 m_iTemp를 초기화하려고 한다. 생성자는 초기화하는 용도랬으니 괜찮을것같지만 이건 불가능하다

 

이유는 단순하다. 생성자도 대입을 통한 초기화이기 때문이다. 

즉 이미 m_iTemp는 생성자가 실행되기전에 메모리상에 저장이 되었고, 상수이기때문에 값의 변경이 불가능해진다.

 

그러면 m_iTemp의 값을 정할수는 없는것인가??

 

두가지 방법이 있다.

1. 생성자에서 바로 초기화하기

#pragma once

class cTemp {
private :
	const int m_iTemp;
public :
	cTemp(int iTemp) : m_iTemp(iTemp) {}
};

이렇게 생성자 이후 바로 콜론을 붙이고 멤버변수(초기화할 값) 을 하게되면 그 값으로 초기화 된 이후 상수화되어 고정된다.

이것을 initializer라고 부른다.

 

2. 클래스에 선언할때 초기화하기

#pragma once

class cTemp {
private :
	const int m_iTemp=100;
};

이렇게 클래스 내부에서 멤버변수를 선언할때부터 초기화하면 그 값으로 상수화된다.

 

다만 이 방법은 두가지 문제가 있다

첫째는 위의 방법처럼 매개변수를 받을 수 없다는 것, 즉 상황에 따를 초기화값의 변화가 불가능하다는것이다.

둘째는 이 방법 자체가 최근에 나온 기술이기 때문에 컴파일러의 버전에따라 불가능할 수도 있다는것이다.

 

상수화된 멤버변수는 보았고 이번엔 멤버함수이다.

 

경우에따라 멤버변수의 값을 변경하지 않는 함수들이 있을것이다.

#pragma once

class cTemp {
private :
	int m_iTemp;
public :
	void print() { cout << m_iTemp << endl; }
};

여기에 있는 print함수는 그 기능이 m_iTemp를 출력하는것이지 그 값을 변경시키진 않는다. 이런 함수의 경우 반환값 뒤에 const를 붙여 상수화 즉 읽기 전용으로 변경할 수 있다.

#pragma once

class cTemp {
private :
	int m_iTemp;
public :
	void const print() { cout << m_iTemp << endl; }
};

이럴 경우 print함수 내에서는 멤버변수의 값을 변경시킬 수 없게 된다.

그리고 같은 상수형 멤버함수를 호출하는것은 가능하지만 상수형이 아닌 일반 함수의 경우 호출이 불가능하다.( 일반 함수 내에서 멤버변수를 수정하는 기능이 없더라도 컴파일러는 그것을 모르기 때문에 const가 아닌 함수들은 전부 불러올 수 없다.)

 

그리고 같은 이름과 같은 매개변수를 가지더라도 const가 붙은것과 붙지않은것은 공존할 수 있다.

그 경우 애초에 클래스가 const로 선언되었다면 const함수가, 그렇지 않다면 일반 함수가 호출된다.

 

 

'c언어' 카테고리의 다른 글

복사 생성자 +깊은복사와 얕은복사  (0) 2023.02.14
static에 대해서  (0) 2023.02.14
클래스 대입  (0) 2023.02.13
상호참조와 전방선언  (0) 2023.02.13
클래스 사용 예시  (0) 2023.02.10