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 |