중첩 형식 - C# 프로그래밍 가이드

클래스, 구조체 또는 인터페이스 내에서 정의된 형식을 C#에서 중첩 형식이라고 합니다.

docs.microsoft.com

중첩 클래스의 사용이유

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 객체 생성

코드 요약

  1. Nested Class에서 OuterClass의 객체를 생성해주고 값을 넣습니다.
  2. InnterTest Class에서 NestedClass의 객체를 생성합니다.
  3. outerMember에 값이 들어간 것을 확인합니다.

 

2. NestClass의 필드값 사용

 

 

잘 되는 것을 확인할 수 있습니다.

 


결론

 외부에서 NestedClass의 필드값에 접근할 수 있는 것을 확인할 수 있긴 했지만, Nested Class의 사용이유를 생각해보면 썩 좋은 사용용도는 아닐 것입니다. OuterClass에 해당하는 클래스에서만 일부분 처럼 사용할 수 있는 class를 만들고 싶을 때 사용하면 좋은 방법인 것 같습니다.