C++

(C++) 정적 멤버와 상수 멤버(static, const)

Janny_ 2022. 9. 3. 01:35

정적 멤버


C++에서 정적 멤버란 클래스에는 속하지만, 객체 별로 할당되지 않고 클래스의 모든 객체가 공유하는 멤버를 의미합니다.

멤버 변수가 정적(static)으로 선언되면, 해당 클래스의 모든 객체에 대해 하나의 데이터만이 유지 관리됩니다.

 

static 멤버 변수는 클래스 영역에서 선언되지만, 정의는 파일 영역에서 수행됩니다. static 멤버 변수는 '클래스 변수'라고도 하는데 일반적인 멤버 변수와 달리 클래스당 하나씩만 생성되기 때문입니다.

이러한 정적 멤버 변수는 외부 연결(external linkage)을 가지므로, 여러 파일에서 접근할 수 있습니다.

 

정적 멤버 변수에도 클래스 멤버의 접근 제한 규칙이 적용되므로, 클래스의 멤버 함수나 friend만이 접근할 수 있습니다.

하지만 정적 멤버 변수를 외부에서도 접근할 수 있게 하고 싶으면, 정적 멤버 변수를 public 영역에 선언하면 됩니다.

 

* friend - C++에서 객체의 private 멤버에는 해당 객체의 public 멤버 함수를 통해서만 접근할 수 있습니다. 하지만 경우에 따라서는 해당 객체의 멤버 함수가 아닌 함수도 private 멤버에 접근해야만 할 경우가 발생합니다. 이럴 때마다 매번 private 멤버에 접근하기 위한 새로운 public 멤버 함수를 작성하는 것은 매우 비효율적입니다. 따라서 C++에서는 이러한 경우를 위해 프렌드(friend)라는 새로운 접근 제어 키워드를 제공합니다.

 

C++에서는 클래스의 멤버 함수도 정적(static)으로 선언할 수 있습니다.

이렇게 선언된 정적 멤버 함수는 해당 클래스의 객체를 생성하지 않고도, 클래스 이름만으로 호출할 수 있습니다.

 

문법

- 객체이름.멤버함수이름();   // 일반 멤버 함수의 호출

- 클래스이름.멤버함수이름(); // 정적 멤버 함수의 호출

 

이러한 정적 멤버 함수는 다음과 같은 특징을 갖습니다.

 

1. 객체를 생성하지 않고 클래스 이름만으로 호출할 수 있습니다.

2. 객체를 생성하지 않으므로, this 포인터를 가지지 않습니다.

3. 특정 객체와 결합하지 않으므로, 정적 멤버 변수밖에 사용할 수 없습니다.

 

예제

class SoSimple

{

private:

     int num1;

     static int num2;

public:

     SoSimple(int n): num1(n)

     { }

     static void Adder(int n)

     {

          num1+=n;     //컴파일 에러 발생

          num2+=n;

     }

};

int SoSimple::num2=0;

 

static 멤버 함수인 Adder에서 멤버 변수인 num1에 접근하게 되면 컴파일 에러가 발생하게 됩니다.

즉, static 멤버 함수 내에서는 static으로 선언되지 않은 멤버 변수의 접근도, 멤버 함수의 호출도 불가능한 것입니다.

 

'static 멤버 함수 내에서는 static 멤버 변수와 static 멤버 함수만 호출이 가능합니다.'

 

이러한 특성을 지니는 static 멤버 변수와 static 멤버 함수를 활용하면 대부분의 경우에서 전역 변수와 전역 함수를 대체할 수도 있습니다.

 

 

 

 

 

상수 멤버


상수 멤버 변수란 한 번 초기화하면, 그 값을 변경할 수 없는 멤버 변수를 의미합니다. 이러한 상수 멤버 변수는 변수의 타입 앞에 const 키워드를 사용하여 선언합니다. 클래스 전체에 걸쳐 사용되는 중요한 상수는 상수 멤버 변수로 정의하여 사용하는 것이 좋습니다.

 

문법

const 타입 멤버변수이름;

 

상수 멤버 함수는 호출한 객체의 데이터를 변경할 수 없는 멤버 함수를 의미합니다. 이러한 상수 멤버 함수는 함수의 원형 마지막에 const 키워드를 사용하여 선언합니다. 호출한 객체의 데이터를 단순히 읽기만 하는 멤버 함수는 상수 멤버 함수로 정의하는 것이 정보 보호 측면에서도 좋습니다.

 

문법

함수의 원형 const;

 

 

 

 

 

 

 

 

 

 

 

<참고>

열혈 c++ 프로그래밍

http://www.tcpschool.com/cpp/cpp_encapsulation_staticConst