하루하루

[C++] 접근 제어자 본문

IT/c++

[C++] 접근 제어자

Jo.o 2019. 10. 8. 13:20
반응형

접근 제어자는 클래스 내의 변수나 함수에 대한 접근 범위를 설정한다.

접근 제어자를 사용하는 이유는 객체지향 프로그래밍의 개념 중 하나인 데이터 은닉 때문이다.

 

사용자가 자판기에서 음료를 뽑을 때 버튼을 누르면 음료가 나온다. 하지만 어떤 원리로 음료가 나오는지 모르고, 알 필요도 없다. 이런 식으로 내부에 구현된 방식이 데이터 은닉이다.

 

클래스 멤버가 외부 함수에서 직접 접근하지 못하도록 제한을 설정하는 것이다.

 


 

- public

 

public으로 선언된 데이터 멤버 및 멤버 함수는 다른 클래스에서도 접근이 가능하다.

public 멤버는 . 연사자를 사용해 프로그램 어디서든 액세스 할 수 있다.

 

class Car
{
public:
    int model;
    void showModel();
};

void Car::showModel()
{
    std::cout << "Model : " << model << std::endl;
}

int main()
{
    Car bmw;
    bmw.model = 520;
	bmw.showModel();

    return 0;
}

* 실행 결과

Model : 520

 

 

- private

 

멤버를 private로 선언하면 해당 멤버는 클래스 내부에서만 접근할 수 있다.

클래스 내부의 멤버 함수 또는 friend 함수만 클래스의 private 멤버에 접근할 수 있다.

 

class Car
{
private:
    int model;
public:
    void showModel();
};

int main()
{
    Car bmw;
    bmw.model = 520;	// 오류 발생

    return 0;
}

Car의 멤버 변수를 private로 변경하게 되면 클래스 외부에서 직접 접근할 때 오류가 발생하게 된다.

...더보기

'model' is a private member of 'Car' 라는 오류가 발생한다.

 

다음과 같이 수정 가능하다.

 

#include <iostream>

class Car
{
private:
    int model;
public:
    void setModel(int model);
    void showModel();
};

void Car::setModel(int m)
{
    model = m;
}

int main()
{
    Car bmw;
    bmw.setModel(520);
    bmw.showModel();

    return 0;
}

이제 setModel이라는 메소드를 통해야만 Model을 설정할 수 있다. 그렇다면 설정된 model값을 출력하는 것이 아닌 가져오는 방법을 알아보자.

 

#include <iostream>

class Car
{
private:
    int model;
public:
    void setModel(int model);
    int getModel();
};

void Car::setModel(int m)
{
    model = m;
}

int Car::getModel()
{
    return model;
}

int main()
{
    Car bmw;
    bmw.setModel(520);
    std::cout << "Model :" << bmw.getModel() << std::endl;

    return 0;
}

이것이 car에 대한 getter와 setter를 만드는 방법이다.

어디서든 접근 가능한 public 대신에 private를 사용하는 이유는 정보 은닉을 하기 위해서다.

 

- protected

 

...

반응형