C++에서는 클래스 선언을 다른 클래스 안에 내포시킬 수 있습니다.

다른 클래스 안에 선언된 클래스를 내포 클래스(nested class)라고 합니다.

이 방법은 새로운 데이터형에 클래스 사용 범위를 제공함으로써 이름이 난잡해지는 것을 막습니다.

(구형 C++에서는 내포 클래스를 아예 지원하지 않거나 그 개념이 불완전하게 구현됩니다.)

class Person
{
private:
	int age;
    
	class Card {
	public:
		char* number;
		int money;
		void Show();
	};
    
public:
	Card card;
};

void Person::Card::Show() {

}

클래스를 내포시키는 일반적인 이유는 다른 클래스의 구현을 지원하고 이름 충돌을 막는 것입니다.

내포 클래스를 어떤 제한자로 설정하느냐에 따라 사용 범위와 접근 제어가 달려있습니다.

 

사용 범위

private일때

Person 클래스의 내포 클래스인 Card클래스는 Person클래스에서만 알려집니다. 그래서 내부에서만 사용 가능하고 외부에서는 불가능합니다.

 

protected일 때

Card클래스는 Person클래스와 Person클래스를 상속받은 파생 클래스에서는 Card클래스의 존재를 알게 되고 객체를 직접 생성할 수 있습니다.

private와 마찬가지로 외부에서는 불가능합니다.

 

public일 때

외부에서도 접근이 가능하며 객체 생성도 됩니다. 하지만 내포 클래스는 클래스 사용 범위를 가지고 있기 때문에 Person클래스 외부에서는 클래스 제한자를 사용해야 합니다.

#include <iostream>
class Person
{
private:
	int age;

public:
	class Card {
	public:
		char* number;
		int money;
		void Show();
	};
};

void Person::Card::Show() {

}

int main(void) {
	Person::Card card;
}

 

접근 제어

어떤 특정 클래스가 사용 범위 안에 들어오면 일반적인 접근 제어 규칙(friend, private, protected, public)이 내포 클래스의 멤버들에 대한 프로그램의 접근 가능 여부를 결정합니다.

A 클래스 선언이 B 클래스 선언 안에 있다고 해서, B 클래스에게 A 클래스에 대한 특별한 접근 권한이 부여되지 않습니다.

 

템플릿에서의 내포

똑같이 적용됩니다.

 

댓글을 달아 주세요