C# 프로그래밍 13번째 시간 - 확장클래스 및 기타 클래스
유니티의 열세걸음, C# 공부시작 53일차
벌써 유니티 C#을 공부한지 거의 두달이 되었습니다!
그만큼 C#에 대한 내용들도 많이 찾아보았고, 유니티에 대한 내용들도 많이 공부하였습니다.
전역하고 집에서 코딩할 생각하니 벌써 기대가 되는군요 ㅎㅎ
C# 내용들은 아마 이것으로 일단 마무리할 것 같습니다.
기본적으로 C내용과 비슷한 부분도 많았기 때문에 매우 기초적인 내용들은
다루지 않았고 제가 모르는 부분들 위주로 했기 때문이죠!
그럼 시작해보겠습니다! 오늘은 확장클래스 및 클래스의 다른 다양한 형태에 대해서 배우겠습니다.
1. 확장 메소드
확장 메소드는 저희가 지금 봤던 메소드와는 다르게, 기존 클래스의 기능을 확장시켜주는 역할을 합니다.
선언 형식은 이러합니다.
namespace 네임스페이스명
{
public static class 클래스명
{
public static 반환형식 메소드명(this 확장대상형식 식별자, 매개변수..)
{
..
}
..
}
}
형식을 보면, 정적 클래스를 먼저 정의 후, 그 안에 확장 메소드가 들어갑니다.
이때 확장 메소드도 정적(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));
}
}
}
이에 따른 결과는 40입니다.
코드를 보면, 확장 메소드는 ExtensionMethod입니다.
그리고 인스턴스 메소드처럼 메인 메소드에서 5.Multiplication으로 해놓으면서
메소드를 호출하고 있습니다. 이때 5는 매개변수 var에 들어가고 2는 a, 3은 b에 들어갑니다.
그리고 result란 변수에 var의 값을 담아, result에 a를 b번 곱한 후 결과를 반환한 후 값을 출력합니다.
이 확장 메소드는 기존 클래스의 소스 코드를 변경하지 않고 기능을 확장시킬 수 있습니다.
물론 상속을 통해서도 기능을 확장할 수 있지만
만약 클래스가 sealed로 한정되어 있으면 확장 메소드를 사용해야 될 수도 있습니다!!
2. 분할 클래스 (Partial Class)
클래스의 구현이 길어지면 두 개 이상의 소스 파일이나 클래스를 분할하기도 합니다.
이때 사용하는 키워드가 partial입니다.
클래스, 인터페이스, 구조체에도 모두 쓸 수 있습니다. 바로 예제를 만들어보죠!
[분할 클래스을 활용한 예제]
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();
}
}
}
이에 따른 결과는 이렇습니다.
Test()
Test2()
Test3()
partial 키워드가 붙은 클래스는 컴파일할때 컴파일러에 의해서 하나로 합쳐집니다.
분할에는 제한이 없기 때문에 여러번 해도 상관없습니다!!
3. 중첩 클래스
말 그대로 클래스 안에 또 클래스를 정의한 것입니다. 중첩 for, if문과 같이 클래스도 할 수 있습니다!
중첩 클래스는 주로 외부에 정의하는 것보다
관련있는 클래스를 내부 클래스로 두어서 코드를 쉽게 이해하기 위해 사용합니다.
차후에 볼때 헷갈리지 않기 위함이죠! 내부에 쓰인 클래스가 제한자를 명시하지 않으면
private으로 보호 수준이 지정됩니다.
A라는 클래스 안에 private으로 지정된 B라는 클래스가 존재하면,
B클래스는 A 클래스 밖에서 보이지 않습니다.
A 클래스 내에서만 사용이 가능한 것이죠. 형태는 이러합니다.
class 클래스명
{
class 클래스명
{
..
}
}
이를 이용해 예제를 만들어 보겠습니다.
[중첩 클래스를 활용한 예제]
using System;
namespace Study
{
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();
}
}
}
이에 따른 결과값은 이렇습니다.
a : 70
a : 60
코드를 보면 InnerClass의 생성자에 OuterClass의 객체를 넘겨주어서
instance 객체에 a_instance를 가져옵니다.
그리고 매개변수 num을 받아 num값을 가진 상태에서 instance객체의 멤버 변수 a의 값을 수정합니다.
이를 통해 안쪽에 정의된 클래스에서 바깥쪽에 정의된 클래스의 private 멤버에 접근할 수 있음을 확인했습니다.
그리고 instance 객체의 멤버 변수 a의 값을 결과적으로 출력합니다.
마무리하며
여기까지해서 일단 C#의 기초적인 부분을 알아보았습니다.
이를 더 활용하여 Unity에서 공부해보고 구현해보도록 하겠습니다!!
차후 공부할 내용들을 다시 가지고 오겠습니다~ ㅎㅎ
Comments