22.11.29 C# 일지_4
// C# 확장 메서드
namespace 네임스페이스명
{
public static class 클래스명
{
public static 반환형식 메소드명(this 확장대상형식 식별자, 매개변수..)
{
..
}
..
}
}
정적 클래스에 정적 메서드로 구현한다. 첫 번째 매개변수에 this 키워드를 붙인다. 같은 범위를 같은 네임스페이스에서 호출할 수 있다. 확장 메서드는 이미 완성된 기존 형식에 새로운 메서드를 추가하는 방법으로 사용된다. static 클래스에 static 메서드를 만들고, 메서드 첫 번째 매개변수에 this를 붙이면 확장 메서드가 된다.
using System;
namespace ConsoleApplication
{
static class Program4
{
static string Three(this string value)
{
return value.Substring(0, 3);
}
static void Main()
{
Console.WriteLine("안녕하십니까".Three());
}
}
}
Three 메서드는 문자열 뒤에 붙여 해당 문자열 중에 앞 세 글자만 반환하게 설계돼있다.
출력결과 ::
안녕하
using System;
namespace ConsoleApplication
{
public static class Program4
{
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
}
class ExtensionMethodDemo
{
static void Main()
{
string s = "안녕하십니까, 확장 메서드...";
Console.WriteLine(s.Length);
Console.WriteLine(s.WordCount());
}
}
}
문자열 s에는 wordCount() 라는 메서드가 없지만 같은 네임스페이스에 정의된 MyClass의 WordCount() 확장 메서드를 s변수에서 사용할 수 있게 한 것이다. 확장 메서드는 정적 형식에서는 제대로 호출되지만 동적 형식에서는 호출되지 않는다.
// C# 튜플
메서드의 매개변수를 전달할 때 사용자 정의 클래스를 사용하면 값을 한 번에 여러 개 전달할 수 있다. 튜플은 새로운 클래스를 만들지 않고도 언어 차원에서 값을 여러 개 전달할 수 있다. 그러나 튜플은 새로운 클래스를 만들지 않고도 값을 여러개 전달할 수 있어 편리하다.
튜플을 생성할 경우에는 반드시 모든 값을 초기화해야 한다.
var letters = ("a", "b", "c");
추가 클래스가 아닌 괄호를 사용하여 값을 하나 이상 그룹화한다. 각 요소의 값들은 letters.Item1, letters.Item2, ... 으로 접근할 수 있다. 자동으로 붙여지는 Item 명을 사용하고 싶지 않다면 직접 이름을 사용할 수도 있다. 명시적인 형식을 지정할 필요가 없다. 컴파일러가 자동으로 형식을 유추한다.
// C# 봉인 클래스 Sealed Class
더 이상 다른 클래스에 상속되지 않게 할 때 사용하는 클래스이다. 최종 클래스라고도 하며, 클래스 선언부에 sealed 키워드를 붙여서 생성한다. 구조체는 암시적으로 봉인되기 때문에 상속되지 않는다.
// C# Indexer
클래스의 인스턴스를 배열처럼 사용할 수 있도록 하는 구문으로 속성을 확장한 형태이며 배열 형식으로 속성들을 초기화하거나 값을 가져갈 수 있는 기능을 제공한다. 속성 여러 개를 하나로 표현하거나 객체를 배열 형식으로 표현할 때 사용한다. indexer를 입력하고 tap을 두번 입력하면 아래와 같은 기본 뼈대가 자동완성된다.
public object this[int index]
{
get { /* return the specified index here */ }
set { /* set the specified index to value here */ }
}
using System;
using System.Collections.Generic;
using System.Text;
namespace C_manage
{
class Class1
{
public string this[int index]
{
get
{
return (index % 2 == 0) ? $"{index} : 짝수 반환 " : $"{index} : 홀수 반환 ";
;
}
}
}
class IndexerNote
{
static void Main()
{
Class1 class1 = new Class1();
Console.WriteLine(class1[0]);
Console.WriteLine(class1[2]);
}
}
}
출력결과 ::
0 : 짝수 반환
1 : 홀수 반환
인덱서는 속성과 달리 이름을 따로 지정하지 않고 this 키워드를 사용한다. 매개변수로 배열형식을 받는다.