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

2021. 3. 28. 00:09·◼ IT Etc./(Until 2021)
반응형

 

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

 

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

 

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

반응형

'◼ IT Etc. > (Until 2021)' 카테고리의 다른 글

[알고리즘] 최대공약수와 최소공배수 - 간단하게 구현해보기 (+ 유클리드 호제법 알고리즘) (C++)  (0) 2021.04.09
눈 수술로 인해 잠시 공백기가 있었습니다.  (0) 2021.04.07
제대 후 첫 슬럼프, 극복을 위한 공부의 변화  (0) 2021.03.23
매일 꾸준히.. 노력이 적으면 얻는 것도 적다.  (0) 2021.03.18
[알고리즘] 버블 정렬(Bubble Sort) 알고리즘 쉽게 구현해보기 (C++)  (0) 2021.03.16
'◼ IT Etc./(Until 2021)' 카테고리의 다른 글
  • [알고리즘] 최대공약수와 최소공배수 - 간단하게 구현해보기 (+ 유클리드 호제법 알고리즘) (C++)
  • 눈 수술로 인해 잠시 공백기가 있었습니다.
  • 제대 후 첫 슬럼프, 극복을 위한 공부의 변화
  • 매일 꾸준히.. 노력이 적으면 얻는 것도 적다.
SangYoonLee (SYL)
SangYoonLee (SYL)
Slow, But Steady Wins The Race 😎
    반응형
  • SangYoonLee (SYL)
    ◆ Slow, But Steady ◆
    SangYoonLee (SYL)
  • 전체
    오늘
    어제
    • ◻ 전체 글 수 : (132)
      • ✪ 취미, 경험 회고 및 일상 (26)
        • [취미] Room Escape (2)
        • [회고] IT 관련 경험 회고 (18)
        • [일상] 일상 생각 (4)
        • [일상] 독후감 (1)
      • ◼ FrontEnd (30)
        • Web & HTML, CSS (9)
        • JavaScript (4)
        • TypeScript (1)
        • ReactJS (16)
      • ◼ CS (3)
        • 자료구조 & 알고리즘 (1)
        • 컴퓨터 구조 (1)
        • 운영체제 (1)
      • ◼ PS Note (40)
        • 백준 (38)
        • 프로그래머스 (2)
      • ◼ IT Etc. (33)
        • (Until 2021) (21)
        • Python (6)
        • C | C# | C++ (1)
        • Git (1)
        • Unity (4)
        • Game Dev. (0)
  • 블로그 메뉴

    • 홈
    • 💻 GitHub
    • 🟢 Velog
    • 🧩 온라인 방탈출 출시 작품 모음
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    코딩 일기
    Component
    더라비린스
    CodeSoom
    Python
    주간 회고
    미궁 게임
    C++
    unity
    코드숨
    소수 구하기
    백준
    Cpp
    관심사의 분리
    JavaScript
    알고리즘
    리엑트
    프로그래머스
    pygame
    wecode
    회고
    후기
    React
    프로젝트
    파이썬
    방탈출고사
    위코드
    1929
    개인 프로젝트
    유니티
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
SangYoonLee (SYL)
[C++] 클래스의 private 접근 제어자의 지정 범위
상단으로

티스토리툴바