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는 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이지만 명시적으로 표시하는 것이 가독성이 좋다.