◼ IT Etc./(Until 2021)

[C++] 클래스의 private 접근 제어자의 지정 범위

SangYoonLee (SYL) 2021. 3. 28. 00:09
반응형

 

C++는 객체 지향 언어이므로 공부할 때 반드시 클래스(Class)의 개념을 공부하게 된다.

 

클래스(Class)는 간단하게 '객체의 설계도'라고 표현할 수 있는데,

 

이를 처음 배우는 학생이 클래스의 기초에 나오는 내용인 접근 제어(access control)를 공부할 때 헷갈릴 만한 부분이 있어

 

이번 시간에 간단히 포스트로 다뤄보고자 한다.

 

 

 

사실 이 내용은 필자가 대학교 1학년 시절 C++를 처음 배울 때 아무도 이것에 대해 알려주지 않아

 

기말고사 시험 당일, 그것도 시험 문제 푸는 당시에 갑자기 스스로 의문이 생겨

시험시간 내내 곤혹스러워 했었던 내용이었다. (다행이 그 문제는 맞았던걸로 기억..)

 

 

 

 

먼저, 클래스와 접근 제어에 관한 개념이 어느 정도 잡혀있다는 전제로 설명을 하니

 

이런 개념이 아직 많이 낯설으시면 공부를 조금 하신 후 보시길 추천드린다.

 


 

접근 제어자는 private, protected, public이 있다.

 

 

이 중 private 접근제어자는 한 클래서 내에서만 접근이 가능하도록 지정하는 접근자로

클래스의 맴버 변수를 이 private 접근자로 지정하여

객체 지향의 원칙 중 하나인 캡슐화의 정보은닉을 구현하도록 하는 역할을 한다.

 

보통 클래스 내 맴버 변수들은 이 원칙에 따라 privatie 접근 제어자로 선언하고

 

이 맴버 변수들을 불러오거나 값을 변경할 때, 변수에 직접 대입할 수 없으니 접근자와 설정자라는 특수한 맴버 함수를 따로 만들어 사용한다.

 

 

이 때, 다음의 코드를 살펴보자.

 

class Buyer
{
private:
    int OwnMoney;
    int OwnApple;
    int ApplePrice;
public:
    Buyer(int num) {
        OwnMoney = num;
        OwnApple = 0;
    }
    void BuyApple (const Buyer &A, int num) {
        OwnMoney -= A.ApplePrice * num;   // 주목할 부분!
        OwnApple += num;
    }
    ...
}

int main (void)
{
    Buyer Park(30000);
    Buyer Kim(50000);
    
    Kim.BuyApple(Park, 10);   // 주목할 부분!
    ....

    return 0;
}

​(코드의 의미가 조금 이상할 수 있으나 설명을 위한 예시 코드일 뿐이니 무시하자.)

 

 

여기서 main함수의 Kim.BuyApple(Park, 10); 코드의 작동과정을 보자.

 

이 부분은 Buyer 클래스의 객체인 Kim의 맴버함수 BuyApple를 수행하는 코드이다.

 

 

 Kim의 맴버함수 BuyApple은 Buyer 클래스의 다른 객체 Park을 참조자로 받아서

private 접근자로 지정된 맴버 변수 ApplePrice로 '직접' 접근한다.

이것이 컴파일이 가능할가? 오류가 아난가?

 

답은, 이 소스코드는 아무런 문제 없이 컴파일 및 실행이 된다.

 

 

왜냐하면 private 접근자의 지정 범위는 인스턴스, 즉 객체 기준이 아닌 클래스 기준이기 때문이다.

 

즉, 서로 다른 인스턴스이더라도 같은 클래스 타입이면 각 멤버는 서로의 private 멤버 변수에 접근이 가능하다.

 

(이는 C++보다 객체지향성이 더욱 강한 JAVA도 마찬가지이다.)

 

 

뭔가 이 사실이 private의 의미와 대치되는 것처럼 보여 처음에 접하면 많이 헷갈릴 것이다.

 

필자도 그랬고 사실 지금도 100% 이해하진 못해 그냥 받아들였다.

 

 

 

 

andyader.blogspot.com/2013/11/c-private.html

 

참고로 해당 주소의 포스트가 이 내용을 조금 더 자세히 다루었고, 이해하는 데도 더 도움이 될 것 같아 주소를 남긴다.

 

필자도 당시 시험 보고 난 후 이 글을 통해 도움을 받았다.

반응형