재밌고 어려운 IT를 이해해보자~!
확장 메소드, 분할 클래스, 중첩 클래스 본문
확장 메소드
이 확장 메소드는, 기존 클래스의 기능을 확장시켜주는 메소드라고 볼 수 있다.
namespace 네임스페이스명
{
public static class 클래스명
{
public static 반환형식 메소드명(this 확장대상형식 식별자, 매개변수..)
{
..
}
..
}
}
선언 형식을 보시면, 정적(static) 클래스를 먼저 정의하고 그 안에 확장 메소드가 정의되었습니다. 확장 메소드 역시 정적(static) 메소드여야 한다.
그리고 메소드의 첫번째 매개변수에서 this 한정자가 존재해야 한다.
예제
using System;
using Extension;
namespace Extension
{
public static class ExtensionMethod
{
public static int Multiplication(this int var, int a, int b)
{
int result = var;
for (int i = 0; i < b; i++)
result *= a;
return result;
}
}
}
namespace Example
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("{0}", 5.Multiplication(2, 3));
}
}
}
마치 인스턴스 메소드처럼 5의 뒤에 .을 붙여 메소드를 호출하고 있습니다. 여기서 5는 Multiplication()의 매개변수 var에 들어가며, 2는 a에, 3은 b에 들어가게 된다.
10~15행을 살펴보면 result란 변수에 var의 값을 담아, result에 a를 b번 곱하고 이 결과값을 호출부로 반환하여, 반환된 값을 출력
이미 빌드된 라이브러리를 참조해서 사용하고 있는데, 이 라이브러리 내부에 있는 기존의 클래스를 좀 더 확장시키고 싶어. 그런데 나에게는 이 라이브러리의 소스 코드가 없기 때문에 클래스를 직접 수정할 수는 없을 것 같을때 유용하게 사용할 수 있다.
분할 클래스(Partial Class)
클래스의 구현이 길어질 경우 두 개 이상의 소스 파일로 분할하여 동시에 작업을 수행하거나, 관리의 편의를 위해 클래스를 분할하기도 한다.
예제
using System;
namespace Example
{
partial class Nested
{
public void Test() { Console.WriteLine("Test()"); }
}
partial class Nested
{
public void Test2() { Console.WriteLine("Test2()"); }
}
partial class Nested
{
public void Test3() { Console.WriteLine("Test3()"); }
}
class Program
{
static void Main(string[] args)
{
Nested nested = new Nested();
nested.Test();
nested.Test2();
nested.Test3();
}
}
}
partial 키워드가 붙은 클래스는 컴파일 시 컴파일러에 의해 하나로 합쳐진다.
분할에는 제한이 없으며, 여러 번 분할해도 상관이 없다.
중첩 클래스(Nested Class)
첩 클래스는 클래스 내에 또 클래스가 정의된 클래스를 말한다.
이 중첩 클래스는 주로 외곽 클래스에서만 사용하고자 할때, 외부에 정의하는 것보다 관련있는 클래스를 내부 클래스로 두어 코드를 쉽게 이해하기 위해 사용된다.
class 클래스명
{
class 클래스명
{
..
}
}
예제
using System;
namespace ConsoleApplication21
{
public class OuterClass
{
private int a = 70;
public class InnerClass
{
OuterClass instance;
public InnerClass(OuterClass a_instance)
{
instance = a_instance;
}
public void AccessVariable(int num)
{
this.instance.a = num;
}
public void ShowVariable()
{
Console.WriteLine("a : {0}", this.instance.a);
}
}
}
class Program
{
static void Main(string[] args)
{
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = new OuterClass.InnerClass(outer);
inner.ShowVariable();
inner.AccessVariable(60);
inner.ShowVariable();
}
}
}