C++에서는 클래스(또는 구조체)의 멤버에 접근하는것을
제어하기 위한 키워드가 4가지가 있습니다.
public, protected, private, friend
이번 포스트에서는 friend를 제외한 3가지 키워드에 대해서 설명을 해보겠습니다.
friend는 지정된 대상에 대해서는 해당 클래스(또는 구조체)의 멤버의 접근 속성을
public처럼 이용할 수 있도록 예외(혜택?)를 주는 키워드인데요.
나중에 따로 포스트를 해보도록 하겠습니다.
편의상 클래스(또는 구조체)를 그냥 클래스라고 하겠습니다.
따로 구조체 라고 명시하는곳을 제외하곤
접근지정자에서는 클래스와 구조체 모두 통용됩니다.
먼저 접근 속성에 따른 차이를 알려드리자면 다음과 같습니다.
private 접근 속성은 해당 클래스에서는 접근 가능하나,
해당 클래스를 상속받은 자식 클래스나 클래스 외부에서 멤버에 접근할 수 없습니다.
protected 접근 속성은 해당 클래스와 해당 클래스를 상속받은 자식 클래스에서는
접근이 가능하나, 클래스 외부에서 멤버에 접근 할 수 없습니다.
public 접근 속성은 해당 클래스는 물론, 자식클래스 및 클래스 외부에서도
해당 클래스의 멤버에 접근이 가능합니다.
요약
public : 자신 접근 O, 자식 접근 O, 외부 접근 O
protected: 자신 접근 O, 자식 접근 O, 외부 접근 X
private: 자신 접근 O, 자식 접근 X, 외부 접근 X
이렇게 설명 드리긴 했지만, 이 설명만 보아서는 제대로 이해가 힘드실 것입니다.
사용 방법을 설명드리면서 접근 속성이 어떻게 다른지 차이도 함께 설명드리겠습니다.
사용 방법을 설명드리면서 접근 속성이 어떻게 다른지 차이도 함께 설명드리겠습니다.
접근 지정자의 사용 방법
1. 클래스 내부에서 사용하여, 멤버의 접근 속성 지정
사용 방법은 클래스 내부에서
다음과 같이 적어 사용합니다.
(접근 지정자 문구 대신 public, protected, private 중 선택하여 입력)
접근지정자:
해당 접근 지정자 위치 부터 다음 접근지정자 또는 클래스의 끝이 나오기 전에
선언된 멤버(멤버 변수 또는 멤버 함수, 멤버 타입)는 모두 해당 접근 속성을 가지게 됩니다.
|
특정 접근 지정자가 나온 이후부터 다음 접근 지정자 또는 클래스의 끝이 나오기
전까지는 해당 접근 속성임을 기억해 주세요.
위 예시에서 변수 a1 과 a2는 public 접근 속성을 가지게 됩니다.
public 접근 지정자와 다음 접근 지정자(protected) 사이에 있기 때문이지요.
b1 과 b2는 protected 접근 속성을 가지겠지요.
c1 과 c2 는 private 접근 속성을 가집니다.
그런데 d1 과 d2 는 접근지정자가 앞에 없는데 무엇일까요?
접근지정자가 따로 명시되지 않았을 때는 기본 접근 지정자를 따르는데요,
class(클래스)의 경우에는 기본 접근 지정자가 private 이고
struct(구조체)의 경우에는 기본 접근 지정자가 public 입니다.
A는 클래스 이므로 d1 과 d2는 private 접근 속성을 가지게 됩니다.
접근 속성에 따른 차이
|
먼저 클래스의 멤버 함수가 아닌 클래스 외부에서 클래스 멤버에 접근할 때를 예로 들어보겠습니다. 여기서는 일반 함수 foo를 만들고 A 클래스의 객체 a를 만들고 a를 통해서 멤버를 접근해 보고 있습니다.
먼저 a.d1 과 a.c1 의 경우는 d1 과 c1의 private 접근 속성인데,
"private 접근 속성은 해당 클래스에서는 접근 가능하나,
해당 클래스를 상속받은 자식 클래스나 클래스 외부에서 멤버에 접근할 수 없습니다."
라고 설명 드렸죠. 때문에 foo 함수에서 a.d1 =1; a.c1 = 1;
과 같은 코드를 넣으면 빌드 시 에러가 나게 됩니다.
다음 a.b1 또한 에러인데요, b1이 protected 접근 속성입니다.
"protected 접근 속성은 해당 클래스와 해당 클래스를 상속받은 자식 클래스에서는
접근이 가능하나, 클래스 외부에서 멤버에 접근 할 수 없습니다."
역시 마찬가지로 외부에서 접근 할 수 없기 때문에 a.b1 = 1;
과 같은 코드도 에러를 냅니다.
먼저 a.d1 과 a.c1 의 경우는 d1 과 c1의 private 접근 속성인데,
"private 접근 속성은 해당 클래스에서는 접근 가능하나,
해당 클래스를 상속받은 자식 클래스나 클래스 외부에서 멤버에 접근할 수 없습니다."
라고 설명 드렸죠. 때문에 foo 함수에서 a.d1 =1; a.c1 = 1;
과 같은 코드를 넣으면 빌드 시 에러가 나게 됩니다.
다음 a.b1 또한 에러인데요, b1이 protected 접근 속성입니다.
"protected 접근 속성은 해당 클래스와 해당 클래스를 상속받은 자식 클래스에서는
접근이 가능하나, 클래스 외부에서 멤버에 접근 할 수 없습니다."
역시 마찬가지로 외부에서 접근 할 수 없기 때문에 a.b1 = 1;
과 같은 코드도 에러를 냅니다.
a.a1 은 정상이라고 주석이 달려있네요.
"public 접근 속성은 해당 클래스는 물론, 자식클래스 및 클래스 외부에서도
해당 클래스의 멤버에 접근이 가능합니다."
클래스 외부에서 접근이 가능하므로 a.a1 = 1; 과 같은 코드는 정상입니다.
|
이번엔 foo 함수를 A 객체 안에 넣어보았습니다. 이제 foo함수는 A객체의 멤버함수 입니다.
이미 생성된 객체에 접근하기 때문에 a.a1 = 1; 과 같이 접근할 필요가 없으므로 객체 a 생성 부분을 빼고 각 멤버 변수 앞에 a. 을 뺐습니다.
주석을 보니 모두 정상이군요
이유는 간단합니다. 설명들을 다시 봅시다.
"private 접근 속성은 해당 클래스에서는 접근 가능하나,
해당 클래스를 상속받은 자식 클래스나 클래스 외부에서 멤버에 접근할 수 없습니다."
"protected 접근 속성은 해당 클래스와 해당 클래스를 상속받은 자식 클래스에서는
접근이 가능하나, 클래스 외부에서 멤버에 접근 할 수 없습니다."
"public 접근 속성은 해당 클래스는 물론, 자식클래스 및 클래스 외부에서도
해당 클래스의 멤버에 접근이 가능합니다."
private 나 protected 나 public 이나 모두 해당 클래스에서는 접근이 가능하기 때문이지요.
2. 상속 시 접근 지정자 사용
상속 관계에서 부모의 멤버들에 대한 접근 지정자가
상속 방법에 따라 변경될 수 있습니다.
class 자식 이름 : 접근 지정자 부모 타입 이름
그리고 상속 시 접근 지정자와 부모 클래스 멤버의 접근 지정자에 따라
자식 클래스에서 해당 멤버의 접근 지정자가 결정됩니다.
접근 속성에 따른 차이
예를들에 class A 를 상속받는 자식 클래스 B가 있다고 봅시다.
(A클래스의 멤버는 앞 예제와 동일.)
상속 접근 지정자가 public 인 경우 위 표에 따라
상속 방법에 따라 변경될 수 있습니다.
class 자식 이름 : 접근 지정자 부모 타입 이름
그리고 상속 시 접근 지정자와 부모 클래스 멤버의 접근 지정자에 따라
자식 클래스에서 해당 멤버의 접근 지정자가 결정됩니다.
접근 속성에 따른 차이
예를들에 class A 를 상속받는 자식 클래스 B가 있다고 봅시다.
(A클래스의 멤버는 앞 예제와 동일.)
|
상속 접근 지정자가 public 인 경우 위 표에 따라
B 클래스의 멤버 a1 은 public 접근 속성
멤버 b1 은 protected 접근 속성
멤버 c1 은 접근 불가 접근 속성을 가지게 됩니다.
따라서 5, 6, 13 번 째 줄 코드는 정상 코드이며 7, 14, 15번 째 줄은 protected 멤버, 접근 불가 멤버에 접근을 시도했으므로 빌드시 오류가 나게 됩니다.
상속 접근 지정자가 protected 인 경우 위 표에 따라
B 클래스의 멤버 a1 은 protected 접근 속성
멤버 b1 은 protected 접근 속성
멤버 c1 은 접근 불가 접근 속성을 가지게 됩니다.
따라서 5, 6 번 째 줄 코드는 정상 코드이며 7, 13, 14, 15번 째 줄은 protected 멤버, 접근 불가 멤버에 접근을 시도했으므로 빌드시 오류가 나게 됩니다.
상속 접근 지정자가 private 인 경우 위 표에 따라
B 클래스의 멤버 a1 은 private 접근 속성
멤버 b1 은 private 접근 속성
멤버 c1 은 접근 불가 접근 속성을 가지게 됩니다.
따라서 5, 6 번 째 줄 코드는 정상 코드이며 7, 13, 14, 15번 째 줄은 private 멤버, 접근 불가 멤버에 접근을 시도했으므로 빌드시 오류가 나게 됩니다.
B클래스를 상속 받는 C 클래스가 있다면 어떨까요?
B 클래스 멤버의 접근 속성을 부모 클래스의 멤버 접근 속성으로 두고 표를 두고 찾으면 되는데요, c1 같이 접근 불가 속성은 상속 받아도 접근 불가 속성이란것을 기억해주세요~
댓글 없음:
댓글 쓰기