금융 경제 보험 정보

C++ 캡슐화 (Encapsulation) 이란? 본문

카테고리 없음

C++ 캡슐화 (Encapsulation) 이란?

정보캣 2023. 11. 3. 09:04

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개 매장에서 사용가능한 레시피로 만든다고 생각하면

Comments