Class Member Access Modifier (visibility)
◆ 정보 은닉을 위해 멤버 접근을 제한할 수 있다
◆ 클래스 멤버 접근 제한자
● public
☞ 어디서든 접근 가능
● private
☞ 클래스의 멤버, friend 클래스에서만 접근 가능 (다음 강의에서 friend 설명)
● protected
☞ 상속된 클래스의 객체에서만 접근 가능 (상속 강의에서 설명 예정)
◆ 클래스 멤버 접근 제한자
public : 어디서든, 누구든지 접근 가능
private : 멤버들만 접근이 가능하다.
F5로 디버깅을 해보면
name 은 빈값으로 되어있고
health와 xp는 쓰레기값으로 되어있다.
스택 메모리에 p 객체가 만들어진다.
p 안에는 name / health / xp 멤버 변수가 만들어진다.
p.health = 10;을 입력하게 되면(멤버 변수를 바꾸게 되면)
디버깅으로 확인하면 health 값이 10으로 변경된 것을 확인할 수 있다.
class Player
{
public:
string name;
int health;
int xp;
};
int main()
{
Player* p_ptr = new Player();
(*p_ptr).health = 20;
p_ptr->health = 10;
cout << p_ptr->health << endl;
}
힙 메모리에 변수를 입력할 경우
Player* p_ptr = new Player();
이라고 쓰이게 되고
역참조를 이용하여서 (*p_ptr).health 로 멤버 변수 값을 변경할 수 있다.
줄여서 p_ptr->health 으로 변경할 수 있다.
int health 와 int xp 값을 private로 바꾸게 되면
멤버 변수를 접근할 수 없게 된다.
그러면 어떻게 private 변수를 쓸까?
class Player 안에서만 접근할 수 있게 된다.
중요한 Part이다.★★★★★
◆ 클래스 멤버 접근 제한자의 적용
● private 멤버에 접근하기 위해서는 public 멤버 함수가 필요하다
● 전부 다 public 으로 하면 안 되나요?
☞ 멤버에 직접 접근하는 것이 오류를 초래할 수 있다.
☞ 예를 들어, 게임에서 플레이어의 체력이 100이 상한선인데, 실수로 1000을 할당해 버린다면?
Player kim;
kim.name = "KJY"; // Complier Error!
kim.health = 1000; // Complier Error!
kim.Talk("Ready to battle"); // OK
Player *enemy = new Player();
enemy->xp = 100; // Complier Error!
enemy->Talk("I will kill you"); // OK
Account Example
◆ 계좌 클래스 예제
#include <iostream>
using namespace std;
class Account {
public:
bool Withdraw(double amount); // 출금
bool Deposit(double amount); // 입금
private:
string name; // 예금주 이름
double balance; // 계좌 잔액
};
● 계좌 잔액(balance)에 문제가 있다면? 입금(deposit)만 살펴보면 된다.
☞ 잔액에 직접 접근이 불가능하고, public 입금 멤버함수를 통해서만 접근이 가능하기 때문이다.
● 테스트 및 디버깅이 쉬워짐
Account kim_Account;
kim_Account.balance = 1000.00; // Complier Error!
kim_Account.Deposit(1000.00); // OK
kim_Account.name("kim`s Account"); // Complier Error!
Account *lee_Account = new Account();
lee_Account->balance = 1000.00; // Complier Error!
lee_Account->Withdraw(1000.00); // OK
delete lee_Account;
private double balance = 0; 으로 초기화하면 0값이 되어있음을 확인할 수 있다.
Withdraw(double amount)를 이용하면 -100으로 바뀐것을 확인할 수 있다.
private public 구분을 왜 해야하는 것인가?
계좌에서 출금 하려고 할때, 현재 가지고 있는 자본보다 빼려고 하려는 잔액이 더 많을때
그때 빼지 못하도록 막을 수 있는 함수를 쓸 수 있다.
멤버 함수에 if문을 추가하였고
if문에 따라 Withdraw(double amount) 를 실행해도 balance 값이 변하지 않는것을 확인할 수 있다.
private double balance(멤버 변수)는
Account 클래스의 멤버 함수에서만 private 멤버 변수를 접근할 수 있다.
public은 클래스 밖에서도 멤버 변수를 접근할 수 있다.
코딩테스트를 공부중이라서 개념 공부가 등한시 되는건 있지만
최대한 빨리 개념도 마무리 짓고 싶다. 빨리 공부 마무리 해야겠다.
https://youtu.be/i3Q_GBBFncA?si=llTygNfPMwTB91K
'C++ > C++ : Study' 카테고리의 다른 글
OOP - (5) 생성자와 소멸자 (1) | 2024.10.21 |
---|---|
OOP - (4) 멤버 함수 (0) | 2024.10.14 |
OOP - (2) 클래스와 객체 (0) | 2024.09.29 |
OOP - (1) OOP 개요(배경설명) (0) | 2024.09.28 |
C++ 포인터 참조자 (7) 포인터 vs 참조자 (0) | 2024.09.25 |