하아찡

접근제한자, 캡슐화 본문

C++/기본문법

접근제한자, 캡슐화

하아찡 2024. 12. 16. 19:16

접근제한자는 클래스 변수나 메소드에 대한 접근범위를 제한하는 키워드입니다.

 

캡슐화의 요소중 하나이죠.

 

자그러면 접근제한자 종류를 알아보죠

크게 Public, Private, Protected가 존재합니다.

첫번째 Public 부터 살펴보시죠

 

public으로 변수나 메소드를 생성했을 경우에는 어디서든 누구든지 사용이 가능한 변수 혹은 메소드 입니다.

여기서 누구든지 사용이 가능하다는건 무엇이냐?

 

바로 코드로 보시죵

#include <iostream>
#include <string>

class Base {
public:
    std::string str;

public:
    Base() : str("Base") {
        std::cout << "Base Class" << std::endl; 
        ShowClass();
    
    }

    void ShowClass() { 
        std::cout << str << std::endl; 
    }
};

int main() {
    std::cout << " === Base Class 생성 ===" << std::endl;
    Base p;
    p.ShowClass();

    return 0;
}

 

위 코드를 봤을때 main 함수 내부에서 Base클래스를 사용해서 객체를 만듭니다.

이 과정에서 클래스를 사용해서 객체를 만들었을때 부르는 명칭을 인스턴스(Instance) 라고합니다.

 

클래스는 설계도 혹은 템플릿으로 생각을 해주시고

인스턴스는 설계도로 만들어진 객체라고 생각하시면 됩니다.(실제 사용하기위해서 구체적인 객체로 만들었다 생각하시면 편할듯해요.)

 

자 그러면 다시 코드를 봅시다.

Public으로 ShowClass라는 메소드가 Base클래스에 정의 됐습니다.

접근제한자가 public임으로 main함수에서 Base클래스로 인스턴스를 만들었는데도 Base클래스에 존재하는 ShowClass메소드를 main함수에서도 호출이 가능하게 됩니다.

 

즉, 정리하면 public으로 접근제한자가 설정됐다면 자신을 사용 할 수 있는 모든자에게 쓸 수 있는 권한을 준겁니다.

 

 

자 그러면 다른 접근제한자 Private도 살펴봐야겠죠.

#include <iostream>
#include <string>

class Base {
public:
    std::string str;

public:
    Base() : str("Base") {
        std::cout << "Base Class" << std::endl; 
        ShowClass();
    
    }

private:
    void ShowClass() { 
        std::cout << str << std::endl; 
    }
};

int main() {
    std::cout << " === Base Class 생성 ===" << std::endl;
    Base p;

    return 0;
}

위 코드는 전에 보여드렸던 코드와 다르게 ShowClass메소드를 private로 선언을 했습니다.

그로인해 main함수 내부에서 Base클래스로 인스턴스를 만들었어도 해당 인스턴스를 통해서 main함수에서 ShowClass를 호출할 수 없게 된겁니다.

하지만 Base클래스 생성자 쪽을 보시면 ShowClass메소드를 사용하고 있는 모습이 보입니다.

 

즉, private로 정의가 되면 자기 자신만 사용가능한 메소드 및 변수가 되는겁니다.

외부에서 직접적으로 메소드를 사용을 못하게 막거나, 변수값을 외부에서 직접 수정을 못하게 막을 수 있습니다.

해당 과정에서 이제 캡슐화가 나타나게 됩니다.

 

 


또 딴길로 새면서 봅시다.

캡슐화 라는 말이 나오는데 그러면 캡슐화는 도대체 무엇인가?

 

음 일단 캡슐화의 목적을 보면

정보를 은닉한다.

데이터 무결성.

등등 이 존재하죠.

 

일단 우리는 두가지만 볼겁니다. 사실 서의 두가지가 끝인거같긴해요. 다 거기서 거기인 말이라..

자 그러면 정보를 은닉한다? 저게 무슨말인가.

우리가 위에서 봤듯이 public으로 사용을하면 누구든지 변수 및 메소드를 사용이 가능했습니다.

근데 만약 클래스 내부에서만 값을 변경해야하는 변수라면? 외부에서 직접적으로 변경 할 수 있게 하면 될까요?

안되다 보닌깐 클래스 내부에서 사용할 변수를 private로 선언을 하게 됩니다.

그러면 외부에서는 해당 클래스의 도움없이는 변하거나 값을 가져올 수 도 없게 됩니다. 이게 정보를 은닉한다. 입니다.

 

자 그러면 데이터의 무결성은 무엇인가?

정보를 은닉하는 쪽에서 설명과 거의 동일합니다.

정보를 은닉을 했으면 해당 클래스는 해당 클래스에서만 값이 수정이 가능하게 되다보닌깐, 외부에서 직접적인 수정이 불가능 함으로  잘못된 데이터로 값이 수정되는 일이 없게 됩니다.

 


다시 돌고 돌아 원점으로 돌아와서 접근제한자 마지막인 Protected를 살펴보겠습니다.

바로 코드부터 살펴보시죠

#include <iostream>
#include <string>

class Base {
public:
    std::string str;

public:
    Base() : str("Base") { std::cout << "Base Class" << std::endl; }

protected:
    void ShowClass() { std::cout << str << std::endl; }
};


class Derived : public Base {
private:
    std::string str;

public:
    Derived() : Base(), str("Derived") {
        std::cout << "Derived Class" << std::endl;

        //상속받아서 Base 클래스 내부 ShowClass 메소드 사용가능
        ShowClass();
    }


};
int main() {
    std::cout << " === Base Class 생성 ===" << std::endl;
    Base p;

    std::cout << " === Derived Class 생성 ===" << std::endl;
    Derived c;


    return 0;
}

Base 클래스를 만들고 해당 클래스를 Derived클래스가 상속받았습니다.

 

자 왜 갑자기 상속받는 코드를 가져왔냐?

일단 설명부터 듣고 가시죠.

사실 protected는 상속을 받을때 않았을땐 private랑 다를게 없습니다. 그러면 private랑 무슨 차이가 있냐? 그 차이가 상속을 받았을때 생기게 됩니다.

 

private로 만들면 상속을 받은 자식도 메소드 및 변수를 사용할 수 없게되는데, 만약 내가 상속을 해줬을때 자식 메소드에서는 사용을 해야할때 바로 그때! protected를 사용하게 됩니다.

 

그래서 코드를 봤을때 Base클래스에 있는 ShowClass를 main함수에서 호출이 불가능하지만, 상속받은 자식 클래스 내부에서는 Base클래스에 있는 ShowClass를 호출하고있는 모습이 보입니다.

 

즉 정리를 하면

public은 누구든지 사용이 가능한 공용이고,

private는 자신만 사용이 가능한 시크릿한 아이고,

protected는 자신과 상속받은 자식만 사용이 가능한 조금 시크릿한 아이입니당.

 

혹시 틀린게 있다면 지적부탁드려용~!!

반응형

'C++ > 기본문법' 카테고리의 다른 글

mutex  (1) 2024.12.26
오버라이딩, 오버로딩  (1) 2024.12.15
레퍼런스(참조자) 란?  (0) 2024.12.10
변수란?  (0) 2024.12.02