목차
- 01. Intro
- 02. 접근 지정자
- 정의 및 종류
- 클래스 내부에서의 접근 지정자
- 상속에서의 접근 지정자
- 03. 마무리
- 04. 연관 내용
01. Intro
오늘은 [접근 지정자]의 정의와 사용 예시에 대해 알아보겠습니다.
02. 접근 지정자
정의 및 종류
접근 지정자는 객체 지향의 은닉성인 캡슐화를 위해 사용됩니다.
클래스에 있는 멤버 함수나 변수를 접근할 수 있는 범위를 설정하는 역할을 합니다.
종류로는 [public], [protected], [private] 3가지가 존재합니다.
이 3가지에 대해서 자세히 살펴보도록 하겠습니다.
클래스 내부에서의 접근 지정자
#include <iostream>
using namespace std;
class Sport
{
//private
int _num;
};
int main()
{
Sport sport;
// sport._num = 10;
return 0;
}
클래스에서는 기본 접근 지정자가 private입니다.
그래서, 접근 지정자의 레이아웃을 설정하지 않으면, 클래스 멤버 변수에 대해 접근할 수 없습니다.
public
#include <iostream>
using namespace std;
class Sport
{
public:
Sport() : _num(0) {}
virtual ~Sport() {}
int _num;
};
int main()
{
Sport sport;
sport._num = 10;
return 0;
}
public 접근 지정자는 클래스의 객체를 통해서 클래스 외부에서도 접근이 가능합니다.
그래서, sport라는 객체를 만들고 _num 멤버 변수에 직접 접근해서 값을 대입할 수 있습니다.
class Sport
{
// 생성자와 소멸자를 명시적으로 작성할 경우, public 접근 지정자 아래에 작성해야 함.
// 즉, 아래의 경우는 불가능
Sport() : _num(0) {}
virtual ~Sport() {}
int _num;
};
여담으로, public 접근 지정자를 설정하지 않고 생성자와 소멸자를 명시적으로 표기할 경우, private 접근 지정자로 설정되어 컴파일 시 오류가 발생합니다.
protected
#include <iostream>
using namespace std;
class Sport
{
public:
Sport() : _num(0), _kind(0) {}
virtual ~Sport() {}
public:
int _num;
protected:
int _kind;
};
class Soccer : public Sport
{
public:
Soccer() : _player(0) {}
~Soccer() {}
void print()
{
// protected 레이아웃에 선언된 멤버 변수는 상속된 클래스에서 접근 가능
cout << _kind << endl;
}
int _player;
};
int main()
{
Sport sport;
sport._num = 10;
// protected 레이아웃에 선언된 멤버 변수는 클래스 외부에서 접근 불가능
// sport._kind = 10;
return 0;
}
protected 접근 지정자는 클래스 외부에서의 접근이 불가능하도록 막습니다.
즉, 클래스 내부와 자식 클래스에서만 접근이 가능합니다.

그래서, 위 사진처럼 Sport 클래스의 객체인 sport에서 _kind 멤버 변수에 접근할 수 없습니다.
반면에, Sport 클래스를 상속받은 Soccer 클래스의 멤버 함수인 print()에서는 _kind 멤버 변수에 대해 접근할 수 있습니다.
private
#include <iostream>
using namespace std;
class Sport
{
public:
Sport() : _num(0), _kind(0), _id(0) {}
virtual ~Sport() {}
// Getter & Setter
void SetId(const int id) { _id = id; }
int GetId() { return _id; }
public:
int _num;
protected:
int _kind;
private:
int _id;
};
class Soccer : public Sport
{
public:
Soccer() : _player(0) {}
~Soccer() {}
void print()
{
cout << _kind << endl;
// 상속된 클래스에서도 private 멤버 변수 접근 불가능
// cout << _id << endl;
}
int _player;
};
int main()
{
Sport sport;
sport._num = 10;
// sport._kind = 10;
// sport._id = 10;
// private 멤버 변수에 대한 접근
sport.SetId(10);
cout << sport.GetId() << endl;
return 0;
}
private 접근 지정자는 클래스 내부에서만 접근이 가능합니다.
즉, protected 접근 지정자와 달리 상속받은 클래스에서도 접근할 수 없습니다.
그래서, 위 코드를 보면 Sport 클래스를 상속받는 Soccer 클래스에서도 private 접근 지정자로 선언된 멤버 변수를 접근할 수 없는 것을 확인할 수 있습니다. 당연히, 클래스 외부에서도 접근할 수 없습니다.
// Getter & Setter
void SetId(const int id) { _id = id; }
int GetId() { return _id; }
private로 선언된 멤버 변수에 접근하려면, public으로 선언된 Getter와 Setter 멤버 함수가 필요합니다.
위 코드처럼 클래스 내부에 선언함으로써 private 멤버 변수에 접근할 수 있습니다.
상속에서의 접근 지정자
상속할 때도 접근 지정자를 사용할 수 있습니다.
위와 마찬가지로 [public], [protected], [private] 3가지가 존재합니다.
public
#include <iostream>
using namespace std;
class Sport
{
public:
int _num;
protected:
int _kind;
private:
int _id;
};
class Soccer : public Sport
{
public:
// Soccer 클래스에서 변경되는 점
// _num : public 유지
// _kind : protected 유지
// _id : private -> 접근 불가능
void soccerChange()
{
_kind = 10;
}
int _player;
};
class ChildSoccer : public Soccer
{
void childSoccerChange()
{
_num = 10;
_kind = 10;
// _id = 10;
}
};
int main()
{
Soccer soccer;
soccer._num = 10;
return 0;
}
public 상속은 부모 클래스의 접근 지정자를 모두 유지하면서 상속을 받습니다.
일반적으로 가장 많이 사용하는 상속입니다.
protected
#include <iostream>
using namespace std;
class Sport
{
public:
int _num;
protected:
int _kind;
private:
int _id;
};
class Soccer : protected Sport
{
public:
// Soccer 클래스에서 변경되는 점
// _num : public -> protected 변경
// _kind : protected 유지
// _id : private -> 접근 불가능
void soccerChange()
{
_kind = 10;
}
int _player;
};
class ChildSoccer : public Soccer
{
void childSoccerChange()
{
_num = 10;
_kind = 10;
// _id = 10;
}
};
int main()
{
Soccer soccer;
// === 변경된 점 ===
// soccer._num = 10;
return 0;
}
protected 상속은 제한적 상속으로 public 멤버 함수 및 변수가 자식 클래스에서 protected 멤버 함수 및 변수로 변경됩니다.
그래서, 상속받은 클래스에서는 문제없이 사용할 수 있습니다.
하지만, 객체에서는 해당 멤버 함수 및 변수에 대한 접근이 불가능합니다.
Sport 클래스를 protected로 상속받은 Soccer 클래스가 있습니다.
Sport 클래스의 _num의 접근 지정자가 Soccer 클래스에서 protected로 변경됩니다.
따라서, main 함수에서 Soccer 클래스 객체인 soccer은 _num에 대해서 접근할 수 없습니다.
private
#include <iostream>
using namespace std;
class Sport
{
public:
int _num;
protected:
int _kind;
private:
int _id;
};
class Soccer : private Sport
{
public:
// Soccer 클래스에서 변경되는 점
// _num : public -> private 변경
// _kind : protected -> private 변경
// _id : private -> 접근 불가능
void soccerChange()
{
_kind = 10;
}
int _player;
};
class ChildSoccer : public Soccer
{
void childSoccerChange()
{
// === 변경된 점 ===
// _num = 10;
// _kind = 10;
// _id = 10;
}
};
int main()
{
Soccer soccer;
// soccer._num = 10;
return 0;
}
private 상속은 모든 멤버 함수나 변수에 대해서 숨깁니다.
즉, public & protected 멤버 함수 및 변수가 자식 클래스에서 private 멤버 함수 및 변수로 변경됩니다.
그래서, 상속받은 클래스와 클래스 외부인 객체 모두 접근이 불가능합니다.
Sport 클래스를 private로 상속받은 Soccer 클래스가 있습니다.
Sport 클래스의 _num의 접근 지정자가 Soccer 클래스에서 private로 변경됩니다.
그러므로, Soccer 클래스에서는 _num에 대해서 문제없이 접근할 수 있습니다.
하지만, Soccer 클래스를 상속받은 ChildSoccer 클래스에서는 Sport 클래스의 멤버 변수인 _num과 _kind에 대해서 모두 접근할 수 없습니다.
03. 마무리
오늘은 접근 지정자에 대해서 알아보았습니다.
클래스 내부에서 접근 지정자 레이아웃을 통해 함수와 변수의 접근 범위를 설정하는 것은 이전에 많이 접해봤습니다.
하지만, 상속에 대한 접근 지정자는 자주 사용하지 않다 보니 이에 대해서 다시 복습할 수 있었습니다.
04. 연관 내용
읽어주셔서 감사합니다.
틀린 내용 지적은 언제나 환영입니다!
'게임 개발 > C++' 카테고리의 다른 글
| [C++] 부동소수점 (0) | 2025.03.15 |
|---|---|
| [C++] 전방 선언 (2) | 2025.03.13 |
| [C++] 포인터 vs 참조 (0) | 2025.03.11 |
| [C++] mutable 키워드 (0) | 2025.03.10 |
| [C++] const 키워드 (0) | 2025.03.09 |