제로의영역

7.13 중첩 클래스 본문

C#

7.13 중첩 클래스

아이큐제로 2019. 6. 7. 19:01

* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.

* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.

 

 (1) 정의: 클래스 안에 선언되어 있는(만드는) 클래스

 

 (2) 용도

  1) 클래스 외부에 공개하고 싶지 않은 형식을 만들때 

  2) 현재의 클래스의 일부분처럼 표현할 수 있는 클래스를 만들 때

 

 (3) 사용법

  1) 클래스 안에 클래스를 선언함. 

  2) 자신이 소속되어 있는 클래스의 멤버(필드, 메소드, 프로퍼티, 이벤트 등)에 접근 가능.(private 멤버에도 접근 가능)

 

 예제1)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Nested1
{
    public class OuterClass                             //외부클래스
    {
        private int a = 70;                             //OuterClass의 변수를 a로 선언
        public class InnerClass                         //내부클래스
        {
            OuterClass instance;                        //InnerClass의 변수를 OuterClass의 변수로 선언

            public  InnerClass(OuterClass a_instance)   //외부클래스 a를 변수로 가지는 내부클래스2
            {
                instance = a_instance;                   //OuterClass의 객체를 넘겨주어 instance객체에 OuterClass의 객체인 a_instance를 가져옴
            }
            public void AccessVariable(int num)
            {
                this.instance.a = num;                  //num을 받아 num값을 가지고 instance객체의 멤버변수a값을 수정
            }
            public void ShowVariable()
            {
                Console.WriteLine("a:{0}", this.instance.a);
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            OuterClass outer = new OuterClass();                                //outer를 생성
            OuterClass.InnerClass inner = new OuterClass.InnerClass(outer);     //outer를 변수로 갖는 inner를 생성

            inner.ShowVariable();                                               //inner.ShowVariable()호출 this.instance.a>>a_instance>>70
            inner.AccessVariable(60);                                           //60변수를 갖는 AccessVariable()호출 num>>60>>instance.a가 60으로 변환
            inner.ShowVariable();                                               //변환된 값 출력
        }
    }
}

출력 결과:

a:70
a:60

책의 예제가 너무 어려워서 인터넷 예제를 가져왔습니다만 이것도 어렵네요. 그래서 다른 예제에 한번 더 도전해봅니다.

 

예제2)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Nested2
{
    public class Outer_class                                                //외부 클래스
    {
        public void method1()                                               //외부 클래스 메소드
        {
            Console.WriteLine("Outer class method");
        }

        public class Inner_class                                            //내부 클래스
        {
            public void method2()                                           //내부 클래스 메소드
            {
                Console.WriteLine("Inner class Method");
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Outer_class obj1 = new Outer_class();                           //외부클래스 변수 obj1 생성
            obj1.method1();                                                 //obj1의 메소드 호출

            Outer_class.Inner_class obj2 = new Outer_class.Inner_class();   //내부클래스 변수 obj2 생성(외부클래스.내부클래스.변수로 수식)
            obj2.method2();                                                 //obj2의 메소드 호출
        }
    }
}

출력 결과:

Outer class method
Inner class Method

 

2번 예제가 딱 제 수준이네요. ㅎㅎ

중첩 클래스에서 공부 포기할 뻔했습니다.

'C#' 카테고리의 다른 글

7.15 확장 메소드  (0) 2019.06.14
7.14 분할 클래스(Partial Class)  (0) 2019.06.10
7.12 오버라이딩 봉인하기  (0) 2019.06.05
7.11 메소드 숨기기  (0) 2019.06.05
7.10 오버라이딩과 다형성  (0) 2019.06.03