중첩 클래스는 클래스 안에 선언되어 있는 클래스를 말합니다. 중첩클래스는 자신이 소속된 클래스의 멤버에 자유롭게 접근할 수 있다는 사실입니다. (바깥 클래스의 private 멤버에도 접근가능합니다!) 구조체와 비슷한 방법이다. 모든것이 public으로 공개되어있는 구조체와 다르게, 외부에서 접근이 안되도록 private으로 설정해서 사용한다.
중첩클래스의 사용이유는
class OuterClass
{
private int OutetMember;
class NestedClass //중첩 클래스
{
public void DoSomething()
{
OuterClass outer = new OuterClass();
outer.OuterMember = 10;
//OuterClass의 privte 멤버에 접근하여 값을 할당하거나 읽을 수 있습니다.
}
}
}
✍중첩 클래스 사용 예제
새로운 형식 ItemValue를 만들고,
바깥 클래스 Configruation에서 ItemValue를 리스트에 넣어 사용하는 방법으로 사용
class Configruation
{
List<ItemValue> listConfig = new List<ItemValue>();
public void SetConfig(string item, string value)
{
ItemValue iv = new ItemValue();
iv.SetValue(this, item, value);
}
public string GetConfig(string item)
{
foreach (ItemValue iv in listConfig)
{
if (iv.GetItem() == item)
return iv.GetValue();
}
return null;
}
//중첩 클래스 사용
//사용이유 : 외부에 공개하고 싶지 않은 형식을 만들기 위해
private class ItemValue
{
public string item;
public string value;
public void SetValue(Configruation config, string item, string value)
{
this.item = item;
this.value = value;
bool found = false;
//바깥 클래스의 listConfig도 사용가능하다.
for (int i = 0; i < config.listConfig.Count; i++)
{
if (config.listConfig[i].item == item)
{
config.listConfig[i] = this;
found = true;
break;
}
}
if(found == false)
config.listConfig.Add(this);
}
public string GetItem()
{ return item; }
public string GetValue()
{ return value; }
}
}
class MainApp
{
static void Main(string[] args)
{
Configruation config = new Configruation();
config.SetConfig("Version", "V 5.0");
config.SetConfig("Size", "655.324 KB");
Console.WriteLine(config.GetConfig("Version"));
Console.WriteLine(config.GetConfig("Size"));
config.SetConfig("Version", "V 5.0.1");
Console.WriteLine(config.GetConfig("Version"));
}
}
💻출력
V 5.0
655.324 KB
V 5.0.1
분할 클래스란 여러번에 나눠서 구현하는 클래스를 말합니다. 분할 클래스는 그 자체로 특별한 기능을 하는 것이 아니며, 클래스의 구현이 길어질 경우 여러 파일에 나눠서 구현할 수 있게 함으로써
소스 코드 관리의 편의를 제공하는 데 의미가 있습니다.
분할 클래스는 다음과 같이 partial 키워드를 이용합니다.
patial class MyClass
{
public void Method1() {}
public void Method2() {}
}
//클래스 이름은 동일해야 합니다.
patial class MyClass
{
public void Method3() {}
public void Method4() {}
}
확장 메소드는 기존 클래스의 기능을 확장하는 기법입니다. 확장메소드를 이용하면 string클래스에 문자열을 뒤집는 기능을 넣을 수 있고, int 형식에 제곱 연산 기능을 넣을 수도 있습니다.
확장 메소드를 선언하는 방식은 메소드를 선언하되, static 한정자로 수식해야합니다.
그리고 메소드의 첫 번째 매개변수는 반드시 this키워드와 함께 확장하고자 하는 클래스(형식)의 인스턴스여야 합니다. 그 뒤에 따라오는 매개변수 목록이 실제로 확장 메소드를 호출할 때 입력되는 매개 변수입니다.
메소드는 클래스 없이 선언 될수 없습니다.
따라서 클래스를 하나 선언하고 그 안에 확장 메소드를 선언합니다. 이때 선언하는 클래스도 역시 static 한정자로 수식해야 합니다.
✍int클래스에 x의 n제곱 메소드를 확장하기
namespace MyExtension //네임스페이스를 사용해야 합니다.
{
public static class IntegerExtension
{
public static int Power(this int myInt, int exponent) //두 번째 매개변수가
{ //실제로 사용되는 매개 변수 입니다.
int result = myInt;
for (int i =1; i < exponent; i++)
result = result * myInt;
retern result;
}
}
}
✍사용법
using MyExtension; //확장 메소드를 담는 클래스이 네임스페이스를 사용합니다.
int a = 2;
Console.WriteLIne(a.Power(3));
Console.WriteLIne(10.Power(4));