중첩 클래스의 사용이유
1. 현재의 클래스의 일부분처럼 표현할 수 있는 클래스를 만들고자 할 때
2. 클래스 외부에 공개하고 싶지 않은 형식을 만들고자 할 때
위 특징을 보면 이해가 되겠지만, 저런 특징들 때문에 접근 한정자의 디폴트가 private입니다. 뒤에 사용법 설명에서 확인할 수 있습니다.
중첩 클래스 사용법
중첩 클래스란 클래스, 구조체, 인터페이스 내에서 또 class가 선언된 것을 의미합니다.
// 1번 코드
public class Container
{
class Nested
{
Nested() { }
}
}
예제코드를 보면, 위 처럼 클래스안에 클래스가 선언되어 있는 것을 확인할 수 있습니다.
Nested Type은 외부 type이(Container 부분) Class, struct, Interface 중 무엇이든지 상관없이 private이 디폴트 접근 한정자입니다. 즉, 중첩 클래스를 포함하는 type에서만 접근할 수 있습니다.
위 코드를 다시 표현하자면
// 2번 코드
public class Container
{
private class Nested //접근한정자는 private이 default.
{
Nested() { }
}
}
이 코드와 같은 의미입니다.
말이 조급 복잡한데, 위 코드를 기준으로 설명하자면 Nested 클래스는 기본적으로 private접근 한정자로 선언하게 되어있고, Container클래스에서는 Nested클래스에 접근할 수 있지만, Container 클래스외에는 Nested 클래스에 접근할 수 없다는 소리입니다.
아래는 위 설명을 보충한 예시입니다.
1. 외부에서 접근불가능한 경우
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace NestedClassPractice
{
public class OuterClass : MonoBehaviour
{
private class NestedClass
{
public NestedClass()
{
}
}
}
public class InnerTest
{
OuterClass.
}
}
IntterTestClass에서 OuterClass의 NestedClass를 접근할 수 없는 모습.(NestedClass가 private이기 때문.)
2. 외부에서 접근가능한 경우
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace NestedClassPractice
{
public class OuterClass : MonoBehaviour
{
public class NestedClass
{
public NestedClass()
{
}
}
}
public class InnerTest
{
OuterClass.NestedClass
}
}
NestedClass가 public으로 선언되니 InnerTest Class에서 NestedClass에 접근할 수 있는 모습을 확인할 수 있습니다.
1. 외부 클래스에서 NestedClass 객체 생성
코드 요약
- Nested Class에서 OuterClass의 객체를 생성해주고 값을 넣습니다.
- InnterTest Class에서 NestedClass의 객체를 생성합니다.
- outerMember에 값이 들어간 것을 확인합니다.
2. NestClass의 필드값 사용
잘 되는 것을 확인할 수 있습니다.
결론
외부에서 NestedClass의 필드값에 접근할 수 있는 것을 확인할 수 있긴 했지만, Nested Class의 사용이유를 생각해보면 썩 좋은 사용용도는 아닐 것입니다. OuterClass에 해당하는 클래스에서만 일부분 처럼 사용할 수 있는 class를 만들고 싶을 때 사용하면 좋은 방법인 것 같습니다.
'C#' 카테고리의 다른 글
[C#] CS0273에러 accessor must be more restrictive than the property or indexer (1) | 2024.09.25 |
---|---|
[C#] 데이터 타입 (0) | 2023.01.05 |
[C#] 변수 (0) | 2023.01.04 |
[C#] Boxing과 Unboxing에 대하여 (0) | 2021.08.08 |
[C#] 배열의 default 초기화 (0) | 2021.04.30 |