C++ 클래스 접근제한자
안녕하세요 열코입니다.
지난시간에 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++ 클래스 접근 제한자'에 대해 알아보았습니다.
질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!
공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.
[관련 게시글]
2018/10/09 - [C, C++] - C++ 클래스와 객체
2018/10/08 - [C, C++] - C/C++ 구조체 사용법 및 예제
2018/09/29 - [Java] - 자바 가비지 컬렉션(Java Garbage Collection)
'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 |