본문 바로가기

C++

([C++] 29강) 정보은닉과 접근제어지시자 (private, public, protected)

안녕하세요 잭클입니다!

 

이번시간에는 정보은닉과 접근제어지시자에 대해서 배워보도록 하겠습니다!

 

저번시간까지는 사람에 대한 정보인 People 클래스를 만들어 보았습니다.

 

오늘은 조금 더 보안이 필요한

 

"계좌" 를 의미하는 클래스를 한번 만들어 보도록 하겠습니다.

 

 

 

"정보은닉"이란 무엇을 의미하는것 같으신가요?

 

"은닉"은 숨기는 거니까

 

정보은닉이란 정보를 숨기는 행위 아닐까요??

 

맞습니다.

 

클래스의 정보를 남들이 볼수 있는 수준을 정해주는 행위를 정보은닉 이라고 하며

 

그 정보의 보안 수준을 정해주는 문법이 바로 "접근제어지시자" 입니다.

 

 

 

 

정보은닉은 왜 필요할까요?

 

대표적인 이유는 말그대로 보안입니다.

 

우리가 나중에 만들 프로그램들은 우리만 쓸 것이 아닐수도 있습니다.

 

내가 만든것을 남이 쓸수도 있게되겠죠

 

그런데 나만 알고있어야 할 정보들이 내 코드를 사용하는 다른사람들한테까지

 

전부 보인다면 큰 문제가 되겠죠?

 

그래서 정보은닉을 통해서 내가 허용하는 범위까지만 공개하도록 할 수 있는 것입니다!

 

 

 

 

접근제어지시자에 대해서 알아보도록 하겠습니다!

접근제어지시자 허용범위
private 나 자신을 제외한 어느곳에도 접근을 허용하지않음.
public 모든곳에서 접근을 허용함
protected 나와, 나를 상속받은 자식클래스에서만 접근을 허용함

 

자 이번에는 접근제어지시자의 사용 방법을 알려드리겠습니다.

 

사실 우리는 접근제어지시자를 이미 사용해 본적이 있는데요!

 

public을 저번시간에 사용해보았습니다!

 

클래스 안의 모든 요소들을 public으로 선언해놓았기때문에 main함수에서도

 

접근할 수 있었던 것입니다!

 

접근제어지시자의 사용방법은 이렇습니다!

 

//클래스 안에서

접근제어지시자:

아주 간단하죠??

 

접근제어지시자의 아랫줄부터는 해당 접근제어지시자의 허용범위가 적용되고,

 

다음 접근제어지시자를 만나면 그 밑의 요소들부터는 바뀐 접근제어지시자를 따릅니다!

 

하지만, public private public private 이렇게 난잡하게 돼있으면 보기가 매우 헷갈릴 수 있으니

 

우리는 각각으로만 두도록 하겠습니다.

 

참 protected는 나중에 배울 "상속" 이라는 개념에 연관되어있어서 아직은 이해에 어려움이 있으니

 

저런게 있다 정도만 이해해주시고 넘어가 주시면 되겠습니다!

 

 

 

 

자 그럼 이번엔 예제를 만들어보죠!

 

계좌에 대한 클래스를 만들어보겠습니다.

 

계좌에 대한 정보중 누구나 볼 수 있는 정보는

 

이름, 개설날짜 정도로 하고

 

비밀로 해야하는 요소로는 잔액, 계좌번호가 있는것으로 해보도록 하겠습니다.

 

예제를 보시죠!

 

#include <iostream>
using namespace std;

class Account {
public: //아랫줄부터 다음 접근제어지시자를 만날때까지는 모두 public
    char* name;
    char* createDate;
private: //아랫줄부터 다음 접근제어지시자를 만날때까지는 모두 private
    int amount = 0;
    char* accountNumber;
};

void main() {
    Account myAcc;
    char name[100] = "잭클";
    char createDate[100] = "2022-08-22";
    char accNum[100] = "123456-01-123456";
    myAcc.name = name;
    myAcc.createDate = createDate;
    myAcc.accountNumber = accNum;
}

자, 이 예제 코드를 비주얼 스튜디오에 옮겨볼까요??

 

빨간줄이 뜰겁니다! 왤까요??

 

빨간줄에 마우스를 올려보시면 알 수 있습니다!

Account클래스의 accountNumber변수는 private이기때문에 메인함수에서

 

접근 할 수 없기때문에 에러가 발생합니다!

 

그러면 이 문제를 해결할 수 있는 코드를 짜볼까요?

 

어떤 방법이 있을까요?

 

Account 클래스에 public으로 계좌를설정해주는 함수를 만들면 되겠네요!

 

만드는겸에 입금, 출금, 잔액출력 함수도 만들어 볼까요??

 

#include <iostream>
using namespace std;

class Account {
public:
    char* name;
    char* createDate;

    void SetAccount(char* name, char* createDate, char* accNum) {
        this->name = name;
        this->createDate = createDate;
        accountNumber = accNum;
    }

    void Deposit(int amount) {
        this->amount += amount;
    }

    bool Withdrawal(int amount) {
        if (this->amount < amount) {
            cout << "잔액이 부족합니다" << endl;
            return false;
        }

        this->amount -= amount;

        return true;
    }

    int Balance() {
        cout << "현재 통장의 잔고는 " << amount << "원 입니다." << endl;
        return amount;
    }
private:
    int amount = 0;
    char* accountNumber;
};

void main() {
    Account myAcc;
    char name[100] = "잭클";
    char createDate[100] = "2022-08-22";
    char accNum[100] = "123456-01-123456";
    myAcc.SetAccount(name, createDate, accNum);

    myAcc.Deposit(10000);
    myAcc.Balance();
    myAcc.Withdrawal(12000);
    myAcc.Balance();
    myAcc.Withdrawal(9000);
    myAcc.Balance();
}

계좌를 만들고 SetAccount함수를 통해 계좌의 기본정보를 설정해줍니다!

 

여기서 중요한 점은, 메인함수에서는 accountNumber에 접근할수 없지만,

 

SetAccount함수 안에서는 자기 자신의 요소인 accountNumber에 접근하는 것이므로

 

accountNumber에 접근이 가능해지는 것입니다! 

 

마찬가지로main함수에서는 Account의 amount에 접근할 수 없지만,

 

public인 Deposit, Withdrawal함수를 통해 입출금을 할 수 있는것입니다!

 

자 그럼 실행 결과를 볼까요?

 

만약에 amount가 public이었다면 잔액이 10000원 있을때,

 

메인함수에서 -12000을 해줬다면 잔액이 -2000이 됐을것입니다.

 

하지만 amount를 private으로 선언함으로써 직접 접근을 막고, Withdrawal함수에서 조건을 걸어주면서

 

현재 잔액 이상의 돈을 빼내지 못하게 했습니다. 이런식의 활용이 가능하게 해주는 것이 바로

 

접근제어지시자이며, 정보은닉인 것입니다.

 

 

 

적절한 허용 범위를 주면서 좋은 코드를 짜는 연습을 충분히 하셔야 합니다!

 

자 그럼 이번 글도 마무리 하도록 하겠습니다!

 

수고하셨습니다!