접근제어자 (Access Control Keywords)

 

C++의 클래스안에 있는 메소드와 속성은 기본값이 private 이다.

 

사용하기 위해서는 public 영역으로 지정해준다.

 

* public 영역에 있으면 외부에서 접근이 가능하다.

 

 

* private 영역에 있는 속성은 외부에서 접근이 불가능하다. 값을 사용하기 위해서는 별도의 메소드(setter/getter)가 필요하다.

 

 

- MyClass 라는 클래스의 인스턴스 james 의 public 속성인 age는 외부에서 사용할 수 있다. main()함수도 클래스의 입장에서 보면 외부에서 접근한 것이다.

 

- 반면 private 공간에 있는 name 속성은 직접 접근하면 오류가 난다. 이런 경우 클래스의 public 영역에서 값에 접근하기 위한 메소드를 구현하여 접근한다. 값을 설정하는 것을 setter 가져오는 것을 getter 라고 한다.

 

결과 콘솔

*소스코드

#include <iostream>
#include <string>

using namespace std;

class MyClass
{
private:
	string name;

public:
	int age;
	void setName(string name)
	{
		this->name = name;
	}
	void printName()
	{
		cout << this->name;
	}
};


int main()
{
	cout << "Welcome!\n";

	MyClass james;
	james.age = 30;

	cout << james.age << endl;

	// james.name = "james";

	james.setName("JAMES");
	james.printName();

	cout << endl;
	return 0;
}


 

일반적으로 속성은 외부에서 직접적으로 접근을 막고, 메소드를 통해서 속성에 접근하도록 한다. 클래스의 정보를 불필요하게 노출하지 않는 것(캡슐화)이 설계상 안전하기 때문이다. 프로그래머들이 뭐든지 다 만드는 시대가 아니라 이미 검증된 클래스 라이브러리를 가져다 사용하는데 그 클래스의 내부 구조를 볼 수 없게 하는 것이다.

 

외부 클래스 라이브러리를 include 하는 입장에서 보면 그들에게는 사용자인 내가 외부이다. 그래서 클래스에 private으로 선언한 변수는 접근 자체가 불가능하다. 메소드와 매개변수의 사용법이 나와있는 API Documentation 을 보고 사용할 수 있다.

 

 

설명하는 자체가 좀 어려운데 private 은 내부 public 은 외부라는 점을 기억한다.

 

private 하니까 privacy 를 존중해야 하고 public 은 바깥에 공개되어 있으니까 가져다 사용할 수 있다.

 


메소드 구현하기 (method)

 

* 메소드는 클래스의 함수이다. 무슨 말이냐면 그 클래스에 정의되있는 메소드는 그 클래스의 인스턴스만 사용할 수 있다. 종류가 다른 클래스가 그 메소드를 사용하려해도 접근할 수가 없다. (상속된 메소드는 예외)

 

 

 * 아래 코드에서 method는 public 영역에 선언한 함수들이다. 여기다 바로 구현할 수도 있지만 그러면 복잡해지니까 분리하였다. 메소드의 선언은 함수의 선언과 같다.

class MyClass
{
private:
	int a;
	double b = 7.99;
	string s = "string";

public:
	void showInfo();
	void setA(int a);
	int getA();
};

 

개별 함수의 구현부이다. <클래스 이름 :: 메소드 이름> 의 형식을 쓰고 { } 중괄호 안의 코드블록에 구현한다.

void MyClass::showInfo()
{
	cout << "int    a : " << a << endl;
	cout << "double b : " << b << endl;
	cout << "string s : " << s << endl;
}

void MyClass::setA(int a)
{
	this->a = a;
}

int MyClass::getA()
{
	return a;
}

 

아래는 메인함수에서 클래스의 메소드를 호출하는 코드이다. 직접적으로 MyClass의 속성(멤버변수)에 접근하는게 아니라 public 영역에 있는 메소드들을 통해서 값을 사용하는 모습이다.

int main()
{
	cout << "Welcome!\n";
	cout << "--------\n";

	MyClass james;

	james.setA(99);
	james.showInfo();

	int temp = james.getA();
	cout << "getA() : " << temp << endl;

	cout << endl;
	return 0;
}

결과창

private 접근제어자가 없으면 기본값이 private이지만 명시적으로 표시하는 것이 가독성이 좋다.

공유하기

facebook twitter kakaoTalk kakaostory naver band