캡슐화는 객체 지향 프로그래밍에서 다음 2가지 측면이 있다: 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉한다.
위 문구는 위키 백과에 정의된 문구다. C++에서는 접근 지정자를 통해 캡슐화를 구현하는데, 이를 조금 더 쉽게 이해하기 위해서는 접근 지정자인 public 과 private에 대해 알아햐안다.
일반적으로 멤버 함수(공개 인터페이스)는 public
으로 설정한다. 클래스 안과 밖에서 접근 가능하다.
일반적으로 클래스의 멤버 변수(구현 세부 정보)는 private
로 설정한다. 클래스 안에서만 접근 가능하다.
클래스 사용자가 인터페이스(public)를 사용하도록 요구하는 것은 멤버 변수(private)에 대한 직접 접근을 제공하는 것보다 부담스러울 수 있지만, 클래스 재사용성과 유지보수 측면에서 이점이 있다.
-> 아직 재사용성과 유지보수에 어떻게 이점이 있는지 모르겠다.
클래스 내부에서 콜론과 함께 생성할 수 있다.
다음과 같이 public:
, privat:
을 입력 후 선언하면 된다.
class Sample {
public:
int publicFoo;
Sample(void);
~Sample(void);
void publicBar(void) const;
private:
int _privateFoo;
void _privateBar(void) const;
};
클래스는 다음과 같이 2개의 public 변수와 함수, 2개의 private 변수와 함수가 있다.
#ifndef SAMPLE_CLASS_H
# define SAMPLE_CLASS_H
class Sample {
public:
int publicFoo;
Sample(void);
~Sample(void);
void publicBar(void) const;
private:
int _privateFoo;
void _privateBar(void) const;
};
#endif
접근 지정자들이 어떻게 되어있는지 cpp 파일을 보기전에 main 문에서 private 지정자에 직접 접근해보자. (class 밖에서 접근한다는 의미)
주석 처리된 부분은 private 으로 설정된 변수와 함수를 클래스 외부에서 직접 접근하는 부분이다.
#include <iostream>
#include "Sample.class.hpp"
int main() {
Sample instance;
instance.publicFoo = 42;
std::cout << "instance.publicFoo: " << instance.publicFoo << std::endl;
// instance._privateFoo = 42;
// std::cout << "instance._privateFoo: " << instance._privateFoo << std::endl;
instance.publicBar();
// instance._privateBar();
return 0;
}
주석을 지운 뒤, 컴파일을 시도하면 다음과 같은 에러가 발생한다.
주석을 한 뒤, 다시 컴파일하고 실행해보자.
잘 작동하는 것을 확인할 수 있다. 그렇다면 private은 어떻게 설정해야하는 걸까?
아래 cpp 파일을 보자! 다음처럼 클래스를 선언하고 함수를 직접 호출해서 private에 값을 넣어주면 된다!
#include <iostream>
#include "Sample.class.hpp"
Sample::Sample(void) {
std::cout << "Constructor caled" << std::endl;
this->publicFoo = 0;
std::cout << "this->publicFoo: " << this->publicFoo << std::endl;
this->_privateFoo = 0;
std::cout << "this->_privateFoo: " << this->_privateFoo << std::endl;
this->publicBar();
this->_privateBar();
return;
}
Sample::~Sample(void) {
std::cout << "Destructor called" << std::endl;
return;
}
void Sample::publicBar(void) const {
std::cout << "Member function publicBar called" << std::endl;
return;
}
void Sample::_privateBar(void) const {
std::cout << "Member function _privateBar called" << std::endl;
return;
}
캡슐화__위키백과
캡슐화__MDN
접근 지정자 __ 블로그
캡슐화 __ 블로그