본문 바로가기
언어/C++

[C++ 기본 공부정리] 15-2. OOP 캡슐화 - static, const 멤버

by 민-Zero 2020. 1. 4.

공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다.

틀린 부분에 대한 지적은 감사합니다.

1. 정적(static) 멤버 변수

static(정적) 멤버 변수를 사용할 경우 기존의 멤버 변수와는 다르게 동작합니다. 일반적인 멤버 변수의 경우 인스턴스화를 거쳐 객체를 만들경우 해당 클래스를 통해 만든 여러 객체마다 멤버 변수의 메모리가 각자 할당되어 서로 영향을 주지 않지만 static 멤버 변수의 경우 해당 클래스를 통해 만든 모든 객체가 동일한 메모리를 공유하기 때문에 어떤 객체에서 static 멤버 변수의 값을 변경한다면 다른 객체에서도 같이 변경된다. 즉, 클래스 내의 전역변수라고 생각하면 된다. 

 

문법)

class 클래스명{

static 변수타입 변수명;

};

static 멤버 변수의 특징을 정리하면 다음과 같다.

 

선언은 클래스 내부에서 하지만 초기화는 생성자 등 클래스 내부에서 진행할 수 없고 파일 영역에서 진행한다. 이유는 전역변수와 같이 프로그램 시작 시 생성되고 프로그램 종료 시 변수가 사라지므로 객체가 생성될 때 초기화할 수 없기 때문에 파일 영역에서 초기화해야 한다.

 

일반 적인 static 변수는 변수가 정의된 파일 어디서나 접근 가능했지만, 파일 외부에서는 참조할 수 없었다. 하지만 static 멤버 변수는 외부 연결(external linkage)을 가지고 있어 여러 파일에서 접근 가능하다.

 

static으로 선언해도 멤버 변수 이기 때문에 접근제어자의 적용을 받으므로 외부 접근을 허용하려면 일반적인 멤버 변수처럼 public으로 적용하거나 public영역의 메소드에서 설정하는 함수를 통해 접근 또는 friend키워드를 통해 허용해야 한다.

 

간단한 예시를 통해 static 멤버 변수를 확인하자.

Test라는 클래스가 일반 멤버 변수 num1과 static 멤버 변수 a를 가지고 있다. 일반 멤버 변수는 생성자를 통해 초기화하지만 static은 class 외부의 파일 영역에서 초기화 하지 않으면 에러가 발생한다. 특정 객체가 아닌 클래스에 속한 변수이므로 범위 지정 연산자를 통해 접근하여 초기화한다(클래스명::변수명). 2개의 멤버 변수 모두 private로 설정되어 값의 변경과 출력을 위한 함수를 간단히 생성했다.

해당 클래스를 가지고 static 멤버 변수의 특징을 확인해 보기 위해 t1, t2 두 개의 객체를 생성했다. t1 객체를 이용해 static 멤버 변수의 값을 변경하고 t1, t2에서 static 멤버 변수 값을 확인해 보면 아무 t1 뿐만 아니라 아무런 동작도 하지 않은 t2도 같이 변경되어 static 멤버 변수는 메모리를 공유하는 것을 확인할 수 있다. 이와 다르게 일반 멤버 변수를 t2에서 변경하면 t1은 변경되지 않아 각 객체마다 메모리를 할당하는 것을 확인할 수 있다.

 

2. 정적(static) 멤버 함수

멤버 함수도 static으로 선언할 수 있다. 그러면 특정 객체에 속한 멤버 함수가 아닌 클래스에 속한 멤버 함수 이므로 객체를 생성하지 않고 클래스명을 이용하여 호출하는 것이 가능해진다.

 

문법)

static 반환타입 함수명(매개변수){}

일반 멤버 함수 : 객체명.함수명();

정적 멤버 함수 : 클래스명::함수명();

 

static 멤버 함수의 특징은 다음과 같다.

객체를 생성하지 않고 호출 가능

객체에 속한 함수가 아니므로 어떤 객체의 함수인지 알려주는 this 포인터 사용 불가

static 멤버 함수 또한 프로그램 시작 시 메모리에 등록되므로 static 멤버 변수만 사용 가능하다.

 

아무 객체를 생성하지 않아도 클래스를 통해 static 멤버 함수를 호출 가능하며 함수 내부, 외부 모두 함수의 정의가 가능하다. 

 

 

만일 static 멤버 함수에서 non static 멤버 변수를 사용하려고 하면 비정적 멤버는 참조가 불가능하다고 에러가 발생하게 된다.

this 또한 비정적 멤버 함수에서만 사용 가능하다는 에러를 발생시킨다.

 

3. 상수(const) 멤버 변수, 함수

const 멤버 변수와 함수는 static과 마찬가지로 멤버 변수나 함수를 상수화 시킨 것을 뜻한다. const 키워들 붙여 사용한다. 상수 멤버 함수의 경우 함수의 원형 마지막에 const를 붙이는 것을 주의하자.

문법)

상수 멤버 변수 : const 변수타입 변수명;

상수 멤버 함수 : 반환타입 함수명(매개변수) const {  } 

 

상수 멤버 변수는 한번 초기화시키면 값의 변경이 불가능한데 const 멤버 변수 또한 초기화되면 데이터의 변경이 불가능하다. 클래스 전체에서 공유되고 값이 변경되면 안 되는 값의 경우 상수 멤버 변수를 통해 사용하여 안정성을 높인다.

단, 상수 멤버 변수는 선언과 동시에 초기화가 이루어져야 하므로 생성자 중 이니셜라이저를 통해서만 초기화 가능하다.

그렇지 않을 경우 에러를 발생시킨다.

 

상수 멤버 함수란 상수 함수와 마찬가지로 호출한 객체의 데이터를 변경할 수 없는 멤버 함수가 된다. 따라서 주로 값을 읽기만 하거나 단순 출력을 하는 함수의 경우 const를 사용하여 안전성을 높일 수 있다.

static 멤버 함수가 static 멤버 변수만 사용 가능한 것과 다르게 const 멤버 함수는 모든 멤버 변수를 사용 가능하다. 또한 클래스 내부, 외부 어느 곳에서든 정의가 가능하다. 

댓글