nested_types — 중첩 클래스
nested_types — 중첩 클래스 (Nested classes)
클래스/구조체 또는 유니언의 선언이 다른 클래스 안에 나타날 수 있어요. 그렇게 선언된 클래스를 **중첩 클래스(nested class)**라고 불러요.
중첩 클래스는 자신이 둘러싼 클래스 안에서만 존재하는 게 아니라, 둘러싼 클래스의 이름 공간과 접근 권한을 공유해요. 그래서 내부 구현을 감추거나, 밀접하게 연관된 타입을 묶어서 표현할 때 유용해요.
출처: cppreference
본문
클래스/구조체 또는 유니언의 선언이 다른 클래스 안에 나타날 수 있어요. 그런 선언은 중첩 클래스를 선언해요.
설명 (Explanation)
중첩 클래스의 이름은 둘러싼 클래스의 범위에 존재해요. 중첩 클래스의 멤버 함수에서의 이름 조회는 중첩 클래스의 범위를 먼저 살펴본 후 둘러싼 클래스의 범위를 방문해요. 둘러싼 클래스의 어떤 멤버와 마찬가지로, 중첩 클래스는 둘러싼 클래스가 접근할 수 있는 모든 이름(private, protected 등)에 접근할 수 있어요. 하지만 그 외에는 독립적이며, 둘러싼 클래스의 this 포인터에 대한 특별한 접근 권한은 없어요. 중첩 클래스의 선언은 둘러싼 클래스의 어떤 멤버든 사용할 수 있으며, 비정적 멤버에 대해서는 일반적인 사용 규칙을 따라요.
중첩 클래스 안에 정의된 friend 함수는, 중첩 클래스 안에 정의된 멤버 함수 본문에서의 조회가 둘러싼 클래스의 private 멤버를 찾을 수 있다 하더라도, 둘러싼 클래스의 멤버에 대한 특별한 접근 권한이 없어요.
중첩 클래스 멤버의 클래스 밖 정의(Out-of-class definition)는 둘러싼 클래스의 네임스페이스에 나타나요.
class enclose
{
class nested1; // 전방 선언
class nested2; // 전방 선언
class nested1 {}; // 중첩 클래스 정의
};
class enclose::nested2 {}; // 중첩 클래스 정의
중첩 클래스 선언은 멤버 접근 지정자를 따르며, private 멤버 클래스는 둘러싼 클래스의 범위 밖에서 이름을 붙일 수 없어요. 다만 그 클래스의 객체는 조작될 수 있어요.
C++98에서는 중첩 클래스의 멤버가 둘러싼 클래스와 그 friend에 접근할 수 없었지만, 이후 둘러싼 클래스의 다른 멤버와 동일한 접근 권한을 가진다는 뜻으로 정정됐어요.
같이 보기
- 클래스
- 접근 지정자