안녕하세요 열코입니다.

지난시간에 C++ 클래스에 대해 배워보았습니다. (공부하러가기)

클래스 멤버 선언 시 지정해 줄 수 있는 접근 제한자에 대해 기본적인 것만 짚고 넘어갔는데요.

3가지 접근 제한자가 존재한다고 말씀드렸습니다.

public, private, protected 바로 이 3가지 유형인데요.

이번시간에는 이 클래스 멤버 접근 제한자에 대해 알아보도록 하겠습니다.


☞ 왜 접근 제한자를 사용해야하는지?

객체지향 프로그래밍의 중요한 개념 중 하나는 데이터 숨김(은닉)입니다.

실제로 사용자가 자판기에서 음료를 뽑으려고 할 때 버튼을 누르면 음료가 나옵니다.

이때 사용자는 음료를 뽑기 위해 버튼을 누르면 된다는 것을 알고있지만 실제로 어떤 원리로 인해 음료가 나오는지 모릅니다.

알 필요도 없구요.

이 음료를 뽑기위한 내부 구현 방법이 데이터 숨김입니다.

클래스 멤버가 외부 함수에서 직접 액세스(접근) 하지 못하도록 일부 제한을 설정합니다.


* 참고1 : C++ 클래스 내에 멤버에 대한 접근 제한자를 두지 않으면 기본적으로 private입니다.

* 참고2 : C/C++ 구조체 멤버에 대한 기본적인 접근 제한자는 public입니다.



☞ public

public의 뜻은 '공개적인'이라는 뜻입니다.

public으로 선언된 데이터 멤버 및 멤버함수는 다른 클래스에서도 접근이 가능합니다.

public 멤버는 . 연산자를 사용하여 프로그램의 아무곳에서나 액세스 할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
#include <iostream>
 
using namespace std;
 
class Circle {
public :
    double radius;
    double print_area() {
        return 3.14 * radius * radius;
    }
};
 
int main(void)
{
    Circle circle;
    circle.radius = 5;
 
    cout << "반지름 : " << circle.radius << "\n";
    cout << "원의 넓이 : " << circle.print_area() << "\n";
 
    return 0;
}
cs


ㅇ 실행 결과


반지름 : 5

원의 넓이 : 78.5


위 프로그램에서 데이터 멤버 radius는 공개(public)되어 있으므로 클래스 외부(main함수)에서 접근(access) 할 수 있습니다.



☞ private

클래스 멤버를 private으로 선언하면 해당 멤버는 오직 클래스 내부에서 접근할 수 있습니다.

클래스 외부의 모든 객체나 함수에서 직접 접근할 수 없습니다.

클래스 내부의 멤버 함수 또는 friend 함수만 클래스의 private 멤버에 접근할 수 있습니다.

(friend 함수에 대해서는 다음시간에 알아보도록 하겠습니다 ^^)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
using namespace std;
 
class Circle {
private :
    double radius;
public :
    double print_area() {
        return 3.14 * radius * radius;
    }
};
 
int main(void)
{
    Circle circle;
    circle.radius = 5// 접근 오류!!
 
    cout << "반지름 : " << circle.radius << "\n"// 접근 오류!!
    cout << "원의 넓이 : " << circle.print_area() << "\n";
 
    return 0;
}
cs


클래스 외부에서 private 멤버에 직접 접근하려고하면 다음과 같이 오류가 발생합니다.


- 멤버 "Circle::radius""에 액세스할 수 없습니다.

- 'Circle::radius': private 멤버('Circle' 클래스에서 선언)에 액세스할 수 없습니다.


위 프로그램을 아래와 같이 수정할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
 
using namespace std;
 
class Circle {
private :
    double radius;
public :
    void set_radius(double r) {
        radius = r; // 클래스 내부에서 접근 가능
    }
    double get_radius() {
        return radius; // 클래스 내부에서 접근 가능
    }
    double print_area() {
        return 3.14 * radius * radius;
    }
};
 
int main(void)
{
    Circle circle;
    circle.set_radius(5);
 
    cout << "반지름 : " << circle.get_radius() << "\n";
    cout << "원의 넓이 : " << circle.print_area() << "\n";
 
    return 0;
}
cs


위 코드를 보시면 set_radius() 와 get_radius() 함수를 만들어서 private 멤버인 radius에 접근하는것을 볼 수 있습니다.

이것을 보통 getter와 setter라고 명명합니다.

setter는 클래스 외부에서 직접 접근할 수 없는 private 멤버의 값을 초기화 해 줄 때 사용하며,

getter는 이 private 멤버의 값을 반환할 때 사용합니다.

클래스 외부(main)함수에서 getter와 setter를 어떻게 사용했는지 확인 해 보세요.


ㅇ 실행 결과


반지름 : 5

원의 넓이 : 78.5



☞ protected

protected 제한자는 private 제한자와 비슷합니다.

클래스 외부에서는 protected 멤버에 접근할 수 없지만 해당 클래스의 하위 클래스(파생된 클래스, 자식 클래스)에서는 접근할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
 
using namespace std;
 
class Parent {
protected :
    int id;
};
 
class Child : public Parent {
public :
    void set_id(int i) {
        // 클래스 외부에서 protected 멤버에 접근
        id = i;
    }
    void print_id() {
        cout << "ID : " << id << "\n";
    }
};
 
int main(void)
{
    Child child;
 
    child.set_id(10);
    child.print_id();
 
    return 0;
}
cs


ㅇ 실행 결과


ID : 10



이상 'C++ 클래스 접근 제한자'에 대해 알아보았습니다.

질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!

공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.



'C, C++' 카테고리의 다른 글

C++ 연산자 오버로딩  (2) 2018.10.12
C++ 함수 오버로딩  (0) 2018.10.11
C/C++ 메모리 동적할당  (0) 2018.10.11
C++ friend 클래스와 함수  (1) 2018.10.10
C++ 클래스와 객체  (0) 2018.10.09
C/C++ 구조체 사용법 및 예제  (1) 2018.10.08
C/C++ 배열 사용법  (0) 2018.10.05
C 파일처리  (0) 2018.10.02

to Top