확장 메서드 정의
this 한정자를 사용하는 정적 메서드를 작성합니다.
확장 메서드 정의은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
확장 메서드란?
확장 메서드를 사용하면 기존 형식을 수정하거나 파생 형식을 만들지 않고도 해당 형식에 새 메서드를 추가할 수 있습니다. 인스턴스 메서드인 것처럼 호출하지만 실제로는 특수한 static 메서드입니다.
확장 메서드는 string이나 int처럼 소스 코드를 직접 소유하지 않은 형식에 편리한 새 동작을 추가하고 싶을 때 특히 유용합니다.
세 가지 요구 사항
확장 메서드를 선언하려면 정적 클래스, 정적 메서드, 그리고 this 키워드가 표시된 첫 번째 매개변수가 필요합니다. this 매개변수가 확장할 형식을 지정합니다.
using System;
public static class StringExtensions
{
public static int WordCount(this string text)
{
if (string.IsNullOrWhiteSpace(text)) return 0;
return text.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
public class Program
{
public static void Main()
{
string sentence = "the quick brown fox";
Console.WriteLine(sentence.WordCount());
}
}인스턴스 메서드처럼 호출하기
WordCount는 정적 메서드이지만 sentence.WordCount()처럼 호출합니다. 컴파일러는 내부적으로 이 호출을 StringExtensions.WordCount(sentence)로 다시 작성합니다.
using System;
using System.Linq;
public static class StringExtensions
{
public static string Repeat(this string text, int times)
{
return string.Concat(Enumerable.Repeat(text, times));
}
}
public class Program
{
public static void Main()
{
// These two lines do exactly the same thing
Console.WriteLine("ab".Repeat(3));
Console.WriteLine(StringExtensions.Repeat("ab", 3));
}
}첫 매개변수가 인스턴스를 받습니다
마침표 왼쪽에 있는 값이 this 매개변수가 됩니다. 그 뒤에 매개변수를 더 추가할 수 있으며, 호출자는 해당 매개변수에 값을 일반적인 방식으로 전달합니다.
using System;
public static class IntExtensions
{
public static bool IsBetween(this int value, int low, int high)
{
return value >= low && value <= high;
}
}
public class Program
{
public static void Main()
{
int age = 25;
Console.WriteLine(age.IsBetween(18, 65));
Console.WriteLine(10.IsBetween(1, 5));
}
}직접 만든 형식 확장하기
확장 메서드는 라이브러리 형식에만 사용할 수 있는 것이 아닙니다. 직접 만든 클래스도 확장할 수 있으므로, 핵심 형식은 깔끔하게 유지하면서 다른 곳에 도우미 동작을 추가할 때 유용합니다.
using System;
public class Money
{
public decimal Amount { get; }
public Money(decimal amount) { Amount = amount; }
}
public static class MoneyExtensions
{
public static string ToUsd(this Money m) => "$" + m.Amount.ToString("0.00");
}
public class Program
{
public static void Main()
{
var price = new Money(19.5m);
Console.WriteLine(price.ToUsd());
}
}확장 메서드는 비공개 멤버에 접근할 수 없습니다
확장 메서드는 다른 클래스에 정의된 정적 메서드일 뿐이므로 형식의 공개 영역만 사용할 수 있습니다(같은 어셈블리에 있을 때는 내부 영역도 사용할 수 있습니다). 비공개 필드에는 접근할 수 없습니다.
using System;
public class Counter
{
private int _count;
public int Value => _count;
public void Increment() => _count++;
}
public static class CounterExtensions
{
// Can only use public members like Value and Increment
public static bool IsZero(this Counter c) => c.Value == 0;
}
public class Program
{
public static void Main()
{
var c = new Counter();
Console.WriteLine(c.IsZero());
c.Increment();
Console.WriteLine(c.IsZero());
}
}확장 메서드 연결하기
각 확장 메서드가 값을 반환하므로 여러 메서드를 유창한 처리 흐름으로 연결할 수 있습니다. 위에서 아래로 읽히며, LINQ가 사용하는 방식이기도 합니다.
using System;
public static class TextExtensions
{
public static string Shout(this string s) => s.ToUpper();
public static string Bang(this string s) => s + "!";
}
public class Program
{
public static void Main()
{
string result = "hello".Shout().Bang();
Console.WriteLine(result);
}
}널과 확장 메서드
실제 인스턴스 호출과 달리 확장 메서드는 수신 객체가 null이어도 실행할 수 있습니다. 코드가 해당 객체를 실제로 사용하기 전까지 역참조가 일어나지 않기 때문입니다. 이를 통해 널에 안전한 도우미를 작성할 수 있습니다.
using System;
public static class StringExtensions
{
public static bool IsBlank(this string text)
{
// text may be null here, and that is fine
return string.IsNullOrWhiteSpace(text);
}
}
public class Program
{
public static void Main()
{
string nothing = null;
Console.WriteLine(nothing.IsBlank());
Console.WriteLine("x".IsBlank());
}
}인스턴스 메서드가 확장 메서드보다 우선합니다
일치하는 서명을 가진 실제 인스턴스 메서드가 있으면 컴파일러는 항상 확장 메서드보다 인스턴스 메서드를 우선합니다. 확장 메서드는 형식이 아직 제공하지 않는 기능을 보완할 때만 사용됩니다.
using System;
public static class Ext
{
// This will be ignored because string already has ToString()
public static string ToString(this string s, int n) => s + n;
}
public class Program
{
public static void Main()
{
// Resolves to the built-in instance ToString(), not the extension
Console.WriteLine("value: " + "abc".ToString());
}
}실용적인 도우미 라이브러리
관련된 확장 메서드를 하나의 정적 클래스에 모으면 깔끔한 유틸리티 라이브러리를 만들 수 있습니다. 다음은 프로젝트 전반에서 재사용할 수 있는 간단한 숫자 도우미 클래스의 예입니다.
using System;
public static class NumberExtensions
{
public static bool IsEven(this int n) => n % 2 == 0;
public static int Squared(this int n) => n * n;
public static double Percent(this int n) => n / 100.0;
}
public class Program
{
public static void Main()
{
Console.WriteLine(4.IsEven());
Console.WriteLine(5.Squared());
Console.WriteLine(50.Percent());
}
}직접 해 보기
배운 내용을 결합해 보십시오. 여러 개의 목적이 분명한 확장 메서드를 하나의 정적 클래스에 작성하고 유창하게 호출해 보십시오. 일상적인 도우미 라이브러리는 바로 이런 방식으로 만들어집니다.
using System;
public static class StringExtensions
{
public static string Capitalize(this string s)
=> string.IsNullOrEmpty(s) ? s : char.ToUpper(s[0]) + s.Substring(1);
public static string Surround(this string s, char c) => c + s + c;
}
public class Program
{
public static void Main()
{
Console.WriteLine("hello".Capitalize().Surround('*'));
}
}빠른 확인
확장 메서드 선언에 대한 이해도를 확인해 보십시오.
복습
확장 메서드는 첫 번째 매개변수에 this를 사용하는 static 클래스 내부의 static 메서드입니다. 인스턴스 문법으로 호출하지만 컴파일되면 일반적인 정적 호출이 됩니다.
- 세 가지 요구 사항: 정적 클래스, 정적 메서드, 첫 번째 매개변수의
this - 공개 멤버만 접근할 수 있습니다.
- 인스턴스 메서드가 항상 우선합니다.
- 확장 메서드는 연결할 수 있으며
null수신 객체에서도 실행할 수 있습니다.
자주 묻는 질문
“확장 메서드 정의” 강의는 무료인가요?
네 — “확장 메서드 정의” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“확장 메서드 정의”에서 뭘 배우나요?
this 한정자를 사용하는 정적 메서드를 작성합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“확장 메서드 정의” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 확장 메서드 정의
- 인터페이스와 제네릭 확장
- 확장 메서드 확인 과정
- 좋은 확장 기능 설계