C#

22.11.29 C# 일지_4

함형우 2022. 11. 29. 11:15
728x90

// 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 키워드를 사용한다. 매개변수로 배열형식을 받는다.

728x90