컴퓨터프로그래밍/C#

C# - 확장클래스, 분할메소드, 중첩클래스

zelkova 2016. 11. 28. 11:34

<목차로 돌아가기>


  확장메소드(Extension Method)


클래스의 기능을 확장시켜주는 메소드입니다 쉽게 말해서 이걸 사용하면 굳이 불러오거나 할 필요없이 곧바로 사용할 수 있습니다.



사용방법)

namespace 네임스페이스명
{
    public static class 클래스명
    {
        public static 반환형식 메소드명(this 확장대상형식 식별자, 매개변수..)
        {
            ..
        }
    }
}



사용방법)

  1.  using System;
  2.  using System.Collections.Generic;
  3.  using System.Linq;
  4.  using System.Text;
  5.  using System.Threading.Tasks;
  6.  using Extension;

  7.  namespace Extension
  8.  {
  9.     public static class ExtensionMethod
  10.     {
  11.         public static void increaseDelay(this int count, int delay)
  12.         {
  13.             do {
  14.                 for (int i=0; i < count; i++) {
  15.                     var t = Task.Run(async delegate
  16.                     {
  17.                         await Task.Delay(delay);
  18.                         return 42;
  19.                     });
  20.                     t.Wait();
  21.                     //Console.Write("{0},{1}", t.Status, t.Result);
  22.                     Console.Write("{0}초 ", i+1);
  23.                 }
  24.                 count = count + 1;
  25.                 Console.WriteLine("\n{0}번째 출력임돠", count);
  26.             }while (count <= 5);
  27.         }
  28.     }
  29.  }
  30.  namespace ConsoleApplication2
  31.  {
  32.     class Program
  33.     {
  34.         static void Main(string[] args)
  35.         {
  36.             0.increaseDelay(1000);
  37.         }
  38.     }
  39.  }


결과)


음 뭔가 복잡하네.. 

14~27줄은 무시하셔도 됩니다. 시간은 1초씩 증가해서 지연시키는 겁니다.


우선

8줄 : 여기에서 namespace의 이름을 정해줍시다.

6줄 : 여기에선 정한 namespace를 사용한다고 선언합니다.

12줄 : 정적으로 메소드를 선언합니다.

37줄 : 여기에서 0은 increaseDelay 메소드의 count에 들어가고 

         increaseDelay(1000)의 1000은 delay에 들어갑니다.

         호출을 0첫번째 인자값으로 한다는것이 특이점 입니다.


  분할 클래스(Partial Class)


100줄, 1000줄, 1만줄!!! 이렇게 양이 늘어나면 찾기가 어려워지죠

따라서 1파트, 2파트 한 부분을 뚝 나눠서 정리할 수 있습니다.


사용방법)

partial class 클래스이름(식별자)


예제)

  1.  using System;
  2.  using System.Collections.Generic;
  3.  using System.Linq;
  4.  using System.Text;
  5.  using System.Threading.Tasks;

  6.  namespace ConsoleApplication2
  7.  {
  8.     using System;
  9.     using System.Collections.Generic;
  10.     using System.Linq;
  11.     using System.Text;
  12.     using System.Threading.Tasks;

  13.     namespace ConsoleApplication21
  14.     {
  15.         partial class Nested
  16.         {
  17.             public void Test() { Console.WriteLine("냥"); }
  18.         }
  19.         partial class Nested
  20.         {
  21.             public void Test2() { Console.WriteLine("눠"); }
  22.         }
  23.         partial class Nested
  24.         {
  25.             public void Test3() { Console.WriteLine("끼"); }
  26.         }
  27.         class Program
  28.         {
  29.             static void Main(string[] args)
  30.             {
  31.                 Nested nested = new Nested();
  32.                 Console.WriteLine("그");
  33.                 nested.Test();
  34.                 Console.WriteLine("나");
  35.                 nested.Test2();
  36.                 Console.WriteLine("서");
  37.                 nested.Test3();
  38.                 Console.WriteLine("워 넣음");
  39.             }
  40.         }
  41.     }
  42.  }


결과)


설마 설명 필요함..?



  중첩클래스(Nested Class)

클래스를 내부 클래스로 두어 코드를 쉽게 이해하기 위해 사용됩니다. 참고로, 내부에 쓰인 클래스는 제한자가 명시되어 있지 않으면 private로 보호 수준이 지정됩니다. 즉, A라는 클래스 안에 private로 지정된 B라는 클래스가 존재하면, B 클래스는 A 클래스 밖에서 보이지 않습니다. A 클래스 내에서만 사용이 가능합니다.


사용방법)

class 클래스명

{

    class 클래스명

    {

        ..

    }

}



예제)

  1.  using System;
  2.  using System.Collections.Generic;
  3.  using System.Linq;
  4.  using System.Text;
  5.  using System.Threading.Tasks;

  6.  namespace ConsoleApplication2
  7.  {
  8.     public class OuterClass
  9.     {
  10.         private int a = 70;

  11.         public class InnerClass
  12.         {
  13.             OuterClass instance;

  14.             public InnerClass(OuterClass a_instance)
  15.             {
  16.                 instance = a_instance;
  17.             }

  18.             public void AccessVariable(int num)
  19.             {
  20.                 this.instance.a = num;
  21.             }

  22.             public void ShowVariable()
  23.             {
  24.                 Console.WriteLine("a : {0}", this.instance.a);
  25.             }
  26.         }
  27.     }

  28.     class Program
  29.     {
  30.         static void Main(string[] args)
  31.         {
  32.             OuterClass outer = new OuterClass();
  33.             OuterClass.InnerClass inner = new OuterClass.InnerClass(outer);

  34.             inner.ShowVariable();
  35.             inner.AccessVariable(60);
  36.             inner.ShowVariable();
  37.         }
  38.     }
  39.  }


결과)


15줄 : OuterClass 객체를 생성함

17줄 :  InnerClass의 생성자의 인자값으로 OuterClass의 객체를 받음
19줄 :   instance 객체에 OuterClass의 객체인 a_instance를 집어넣음


22줄 : 호출할때 받은 인자값 num 으로 받음

24줄 : InnerClass의 instance에 a값 즉 private int a에 접근하여 수정함



반응형

'컴퓨터프로그래밍 > C#' 카테고리의 다른 글

C# - 제네릭  (0) 2016.11.29
C# - 인터페이스  (0) 2016.11.29
C# - 추상클래스  (0) 2016.11.27
C# - 메소드 메소드 재정의(override), 숨기기  (0) 2016.11.27
C# - 상속  (0) 2016.11.25