[ c++ ] c++에서의 const와 static

개발하는 곰댕이·2021년 12월 17일
0

cpp

목록 보기
3/11

static

우선 c에서의 static은 cpp에서도 동일하게 사용됩니다.
그러면 cpp에서의 static과 c에서의 static은 어떤 다른점이 있을까요?

static 멤버변수

static 멤버변수는 클래스 변수라고도 불리는데 그 이유는 객체를 아무리 많이 생성해도 메모리 영역에는 단 하나만 할당되어 사용되기 때문입니다.
그렇기 때문에 클래스당 하나만 생성된다고 해서 클래스 변수라고도 불리는 것 입니다.

이 클래스 변수는 해당 클래스의 객체들이 모두 접근 가능한 하나의 변수입니다.
전역변수와 비슷한데 모든 곳에서 접근 가능한 게 아닌 클래스를 통해서만 접근 가능한 전역변수라고 생각하면 될 것 같습니다.

생성 시기와 소멸 시기도 전역변수와 동일하며, 초기화도 단 한번만 진행할 수 있게 생성자가 아닌 클래스 외부에서 초기화를 진행합니다.

class TempA
{
	...
    ststic int	_num;
    ...
}

int	TempA::_num = 0;

static 멤버변수는 객체 내부에 있지 않습니다.

우선 static 멤버변수가 public으로 선언이 되어있다고 했을 때 객체가 생성되지 않더라도 접근이 가능합니다.

class	TempA
{
public:
	static int _num;
};

int	TempA::_num = 0;

int	main(void)
{
	std::cout << TempA::_num << std::endl;

	return (0);
}

출력은 다음과 같습니다.

0

이렇듯 static 멤버변수는 멤버변수처럼 객체로 제한된게 아닌 전역변수의 성질을 가진 변수인 것을 알 수 있습니다.

그렇기 때문에 static 멤버변수에 접근할때 가능하다면 멤버변수와 구분할 수 있도록 클래스의 이름으로 접근하는게 좋다고 합니다.

static 멤버함수

static 멤버함수는 static 멤버변수와 특성이 동일합니다.

  • 선언된 클래스의 모든 객체가 접근이 가능합니다.
  • public으로 선언되면 클래스의 이름을 통해서 접근이 가능합니다.
  • 객체의 멤버로 존재하지 않습니다.

우리는 제일 마지막 부분인 객체의 멤버로 존재하지 않습니다.에 집중해야합니다.
이 말은 static멤버함수는 객체의 멤버가 아니기 때문에 객체의 private변수에는 접근할 수 없습니다.
따라서 다음과 같은 클래스 정의는 에러가 납니다.

class	TempA
{
private:
	int _num;

public:
	static void	add(int num)
	{
		this->_num += num;
	}
};

static 멤버함수인 add에서 private변수인 _num에 매개변수 num을 더하고 있습니다.

하지만 add함수는 객체의 멤버가 아니기 때문에 private변수인 _num에는 접근할 수 없습니다.
그렇기 때문에 에러가 나는 겁니다.
이런 특성을 잘 활용한다면 일반적인 전역변수와 전역함수를 대체할 수 있다고 합니다.

const

const도 마찬가지로 c언어에서 사용했던것과 동일하게 사용 가능합니다.

const 객체

const 객체는 다른 변수들과 마찬가지로 객체를 상수화 한다는 뜻으로써 객체의 데이터 변경을 허용하지 않는다는 말입니다.

그렇기 때문에 const 객체const 멤버함수의 호출만이 가능합니다.

const 멤버함수

const 함수는 해당 함수 내에 멤버변수의 변경을 허용하지 않는다는 뜻 입니다.
또한 const 함수 내에서는 일반 함수의 사용이 제한되며 오직 const 함수만 사용이 가능합니다.

const 함수의 오버로딩

함수의 오버로딩은 매개변수의 수 혹은 자료형이 달라야 하는데, 만약 다 동일하다고 하더라도 함수가 const화 되어있다면 함수의 오버로딩이 가능합니다.
즉, 다음과 같은 함수들은 오버로딩이 됩니다.

void	tmp(void) {...}
void	tmp(void) const {...}

이러한 const들의 사용은 복잡해보이지만 코드의 안정성을 높여주는 중요한 내용이므로 사용할 수 있다면 사용하는게 좋습니다.

[ c++ ] namespace
[ c++ ] 클래스, 생성자, 소멸자, 이니셜라이저, this포인터
[ c++ ] c++에서의 const와 static
[ c++ ] 참조자(reference)
[ c++ ] new와 delete
[ c++ ] 함수 오버로딩
[ c++ ] 파일 입출력 (ifstream, ofstream)
[ c++ ] 함수포인터, 멤버 함수포인터
[ c++ ]연산자 오버로딩
[ c++ ] 캡슐화란?
[ c++ ] 상속과 다형성에 대해 알아보자

0개의 댓글