C++/C++ : Study

OOP - (3) 멤버 접근 제한자

더블유제이플로어 2024. 10. 14. 02:04

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