금융 경제 보험 정보
C++ 캡슐화 (Encapsulation) 이란? 본문
C++ 코드를 작성할 때 객체지향 프로그램을 만들기 위해 캡슐화로 코드를 짠다는 말을 한다. 진짜 외계인 말인가?ㅋㅋㅋ
객체지향이라는 말은 말그대로 객체화 시킨다는 것. 철학적인 맥락에서 주체와 객체의 의미를 연관시켜 해석할 수 있다. 영어에서 Subject가 주어 Object 가 목적어 (객체) 인데 여기서 객체는 결국 나의 주관적인 그 무엇이 아니라 사물 그자체의 객관화된 것을 말한다.
주관성이 빠져있는 물건이기 때문에 결국 누구나 갖다 쓸 수 있다는 의미가 되는데 개인의 특성화 된 것이 아니라 어디에서나 누구나 쓸 수 있는 영혼이 없는 물건 그자체로 사심이 빠져있는 상태 ㅋㅋㅋ 뭐라는 거야 ㅋㅋ 어쨋든 객체화의 핵심은 최대한 특성을 객관화 시켜서 여기저기 아무데나 다 적용할 수 있는 상태로 만드는 것이다.
이렇게 했을 때 좋은점이 무엇인가? 1. 중복을 피할 수 있다. 2. 오류를 줄일 수 있다.
어쨋든 이번글에서는 객체화의 방법중 하나인 캡슐화에 대해서 설명을 해보자. 캡슐화라는 것은 하나의 클래스 안에 속성과 메소드를 같이 넣어서 하나의 패키지를 만들어 두는 것이다. 마치 밀키트 처럼 요리재료와 레시피가 한 묶음이 되어 있어서 그냥 갖다 쓰면 되는 것이다. 여기서 나의 주관적인 요리 철학 그런거 없고 그냥 따라 만들면 된다. 캠핑장에서도 밀키트 가정집에서도 밀키트로 탄생하는 요리는 다 똑같다.
그런데 캡슐화의 특징 중 하나는 속성에 Private 한 요소를 둬서 유저가 반드시 따라야만 하게 만들어 둘 수 있다는 것이다. 예를 들면 밀키트에서 마늘이 재료로 있으면 통마늘이 아니라 무조건 다진 마늘만 써야 된다. 이 때 그냥 마늘을 다져서 넣어두면 통마늘을 사용할 수 없다. 그러니 다진 마늘이 Private 한 요소가 되는 것이다. 내가 슈퍼에서 통마늘 사서 넣으면 안되냐고? 응 안돼.
코드로 예를 들어보자
class BankAccount {
private:
string currency;
public:
string getCurrency() {
return currency;
}
void setCurrency(string c) {
if (c != "usd") {
cout << "Error: currency should be usd" << endl;
return;
}
currency = c;
}
};
이런 코드가 있다. 지금 프로그래머 A는 은행원이 고객들의 은행계좌를 개설할 때 쓰는 프로그램을 만들고 있다. 이 은행은 달러로만 거래 할 수 있기 때문에 Currency 를 Private 으로 설정해 두었다. 그리고 메소드를 Public으로 열어둬서 Currency를 지정만 가능하도록 한 것이다. void setCurrency(string c) {
이렇게 이 클래스에서는 Currency라는 속성 + 다루는 메쏘드 getCurrency(), setCurrency(string c)가 더해져서 하나의 캡슐 형태를 이루고 있다. 이 캡슐에서 Private 요소로 Currency를 두어서 user가 마음대로 통화를 바꿀 수 없게 해두었다.
int main() {
// Create John's account
BankAccount johnsAccount;
// Set the currency to USD
johnsAccount.setCurrency("usd");
// Print the currency
cout << "John's account currency: " << johnsAccount.getCurrency() << endl;
// Try to set the currency to KRW
johnsAccount.setCurrency("krw");
// Print the currency
cout << "John's account currency: " << johnsAccount.getCurrency() << endl;
return 0;
}
위의 코드는 유저 인터페이스에 해당하는 코드로 실제 유저가 프로그램을 통해서 어카운트의 통화 부분을 세팅할 때 실행하는 코드이다. 이 코드를 실행해보면 Krw 를 넣게 되면 USD만 가능하다고 출력이 된다.
이렇게 캡슐화는 하나의 클래스를 통해 밀키트를 만드는.. 최대한 많은 코드 파트에서 효율적으로 코드를 재사용 할 수 있도록 주관적인 요소를 빼면서 표준화 객관화 시켜주는 과정이다. 마치 코드를 자영업 식당이 아니라 전국 프랜차이즈 100개 매장에서 사용가능한 레시피로 만든다고 생각하면