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

[C++ 기본 공부정리] 14-2. OOP - 클래스 접근제어자(access modifier)

by 민-Zero 2019. 12. 28.

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

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

앞서 클래스의 선언을 정리하면서 public이나 private와 같은 접근제어자를 사용했다. 접근제어자는 캡슐화에 포함된 개념 중 하나인 정보은닉을 위해 사용된다. 정보은닉은 프로그램 이용자가 사용해야하는 기능이나 데이터 이외에는 공개하지 않아야 한다는 뜻이다. 불필요하게 모든 정보를 공개하게 된다면 잘못된 방법으로 프로그램이 쓰일 가능성이 존재하기 때문이다.

 

1. 접근제어자(access modifier)

접근 제어자는 접근 제어(access control)을 위해 멤버 변수나 함수에 외부에서 직접적인 접근을 막거나 허용하는 기능을 설정하도록 해주어 정보 은닉을 실행하도록 해준다. 

문법)

class 클래스명 {

접근 제어자1:

    멤버 변수;

    ....

    멤버 함수:

    ....

접근 제어자2:

    멤버 변수;

    ....

    멤버 함수:

    ....

};

접근 제어자를 동시에 혼용하여 사용할 수 있으며 다른 제어자를 만나기 전까지는 선언된 접근 제어로 설정된다.

C++은 3가지의 접근제어자를 제공한다.

private

② public

③ protected

구조체, 열거체 또한 객체로써 접근제어자를 사용할 수 있으며 기본 접근제어는 public이기 때문에 멤버 변수 및 함수에 접근이 가능하지만 class의 경우 기본 접근제어가 private로 되어 있어 접근이 불가능하다.  각각의 접근 제어에 대해 자세히 정리하자.

 

2. private

class의 기본 접근제어자인 private는 객체의 멤버를 외부에 공개하지 않고 직접적인 접근 또한 불가능하게 한다. 오직 동일 클래스 내에 있는 멤버 또는 friend 함수만 접근 가능하기 때문에 필요시 public으로 선언된 메소드를 이용하여 기능을 수행한다. friend는 뒤에 따로 정리하자.

문법)

class 클래스명 {

private:

    멤버 변수;

    ....

    멤버 함수:

    ....

};

기본 접근제어자 이기 때문에 private:를 생략해도 설정된다.

멤버 변수, 함수 전부 클래스 외부인 메인 함수에서는 접근이 불가능하며 동일 클래스 내의 함수 Print는 멤버 변수 x, y를 사용 가능하다

 

3. public

public 접근제어자로 설정된 멤버 변수 및 멤버 함수는 외부에 공개되어 아무 제약 없이 접근 가능하며 해당 객체를 사용하는 곳이면 어디서든 접근 가능하다. class는 기본적으로 private지만 public 접근제어자를 사용하여 외부에서 접근 가능하도록 선언할 수 있다.

문법)

class 클래스명 {

public:

    멤버 변수;

    ....

    멤버 함수:

    ....

};

public: 아래에 사용된 멤버 변수 및 함수는 public으로 설정되고 다른 제어자를 밑에 추가하지 않는다면 전부 public으로 사용될 것이다.

맨 처음 예시에서는 제어자를 설정하지 않아 클래스 기본 접근제어인 private로 설정되어 멤버 변수에 접근이 불가능했지만 해당 예시에선 public으로 선언을 하였기 때문에 메인 함수에서 Test 클래스의 멤버 변수 접근이 가능해졌다.

 

이러한 이유로 private 접근제어의 특성상 public 멤버 함수는 같은 객체 내에 있는 private 멤버 함수에 대한 접근이 가능하므로 private 멤버와 프로그램 사이의 다리 역할을 하는 인터페이스로 사용된다. 

Print함수가 없다면 멤버 변수는 private로 설정되어 있기 때문에 main함수에서 값을 확인할 방법이 없지만 public으로 설정되어 있는 Print함수를 통해 private 멤버 변수의 값을 확인할 수 있다.

 

4. protected

private로 정보 은닉을 수행하고 public을 통해 필요시에 private에 접근을 가능하게 했다. 이 두 가지 만으로도 정보은닉에 대한 수행은 모두 가능한 것처럼 보이나 protected란 제어자가 하나 더 존재한다.

그 이유는 뒤에 정리할 클래스의 상속에 관한 제어 자이다. private로 선언할 경우 해당 클래스에서만 접근 가능하기 때문에 해당 클래스를 상속받은 하위 클래스라 할지라도 접근이 불가능하다. 따라서 private의 기능을 수행하면서 상속한 하위 클래스에 대해서는 접근을 가능하도록 해주는 제어자이다.

즉, 상속된 하위 클래스에 대해서는 public의 역할을 수행하나 그 외 외부 접근은 모두 private의 역할을 수행하도록 하는 제어 자이다.

 

protected에 접근 가능한 객체는 다음과 같다.

1) 동일 객체 내의 멤버

2) 해당 클래스의 friend

3) 해당 객체를 public 또는 protected로 파생된 클래스

간단하게 상속을 통해 protected의 예시를 보여주면

Test 클래스를 상속하는 Test2 클래스를 생성하였다. 멤버 변수 z는 protected로 선언되어있고 x, y는 private로 선언되어있다.

따라서 외부인 메인 함수에서는 멤버 변수 x, y, z 모두 접근이 불가능함을 확인할 수 있다. 또한 Test의 속성을 이어받은 하위 클래스라도 private로 선언된 x 변수는 접근하려 하면 에러가 발생하고 protected로 선언된 z 변수는 접근 가능한 것을 확인할 수 있다.

댓글