캡슐화와 접근지정자__public, private

😎·2022년 11월 28일
0

CPP

목록 보기
7/46

캡슐화

캡슐화는 객체 지향 프로그래밍에서 다음 2가지 측면이 있다: 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉한다.

위 문구는 위키 백과에 정의된 문구다. C++에서는 접근 지정자를 통해 캡슐화를 구현하는데, 이를 조금 더 쉽게 이해하기 위해서는 접근 지정자인 public 과 private에 대해 알아햐안다.

public

일반적으로 멤버 함수(공개 인터페이스)는 public
으로 설정한다. 클래스 안과 밖에서 접근 가능하다.

private

일반적으로 클래스의 멤버 변수(구현 세부 정보)는 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;
};

class 외부에서 private에 직접 접근하면 어떻게 될까?

  • Sample.class.hpp

클래스는 다음과 같이 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 밖에서 접근한다는 의미)

  • main.c

주석 처리된 부분은 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에 값을 넣어주면 된다!

  • Sample.class.cpp
#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

접근 지정자 __ 블로그

캡슐화 __ 블로그

profile
jaekim

0개의 댓글