확장 메서드는 기존 데이터 유형(특히 라이브러리 및 외부 유형)에 새로운 기능을 추가할 필요성으로 인해 나타났습니다. 이러한 유형의 원래 코드를 수정하지 않고도 추가적인 편의성을 제공할 수 있습니다. 이는 현대 .NET 애플리케이션에서 특히 중요하며, 기본 클래스의 수정 접근이 없을 때 유용합니다.
문제는 상속자나 래퍼를 만들지 않고는 타입을 확장할 수 없다는 점이었습니다. 이로 인해 복잡한 아키텍처와 "잘못된" 상속이 발생했습니다.
해결책은 확장 메서드입니다. Visual Basic에서 확장 메서드는 <Extension> 속성으로 주석이 달린 정적 메서드를 가진 모듈로 선언됩니다. 메서드의 첫 번째 매개변수는 항상 확장할 유형을 가리키며, 이를 통해 메서드에 객체의 일반적인 멤버처럼 접근할 수 있습니다.
코드 예시:
Imports System.Runtime.CompilerServices Module StringExtensions <Extension> Public Function ToTitleCase(ByVal str As String) As String If String.IsNullOrEmpty(str) Then Return str Return Char.ToUpper(str(0)) & str.Substring(1).ToLower() End Function End Module ' 사용: Dim s As String = "visual basic" Console.WriteLine(s.ToTitleCase()) ' Visual basic
주요 특징:
확장 메서드에 클래스를 통해 접근할 수 있나요?
네, 확장 메서드는 확장 클래스의 이름을 통해 정적 메서드로 호출할 수 있으며, 첫 번째 (this/Me) 매개변수를 명시적으로 지정하면 됩니다.
코드 예시:
StringExtensions.ToTitleCase("test string")
확장 메서드를 통해 시스템 메서드의 동작을 오버라이드 할 수 있나요?
아니요, 확장 메서드는 기존 인스턴스 메서드를 오버라이드하지 않습니다. 이름이 일치하면 타입의 원래 메서드가 호출됩니다.
확장 메서드는 가변 인수를 가질 수 있나요(ParamArray), 예를 들어 문자열의 경우?
네, 확장 메서드에서도 일반 정적 메서드처럼 ParamArray를 사용할 수 있습니다.
큰 프로젝트에서 각 유형에 대해 겹치는 이름과 다른 로직을 가진 자체 확장 메서드를 생성하며 통일성이 없습니다.
장점:
단점:
모듈에서는 표준 타입에 대한 일반적이고 잘 문서화된 확장을 수집합니다. 각 메서드의 이름은 그 용도를 명확히 나타냅니다.
장점:
단점: