C#의 확장 메소드(Extension Method)는 기존 클래스에 새로운 메소드를 추가하는 방법입니다. 이를 통해 클래스의 원래 소스 코드를 수정하지 않고도 기능을 확장할 수 있습니다. 특히, 기존 클래스가 닫혀 있거나 수정할 수 없는 경우 유용하게 사용할 수 있습니다.
예를 들어, string 클래스에 우리가 원하는 메소드를 추가해 문자열을 더욱 쉽게 조작할 수 있습니다. 확장 메소드는 LINQ와 같이 메소드를 체이닝하여 사용할 때도 활용됩니다.
확장 메소드 정의 방법
확장 메소드를 정의하기 위해서는 아래의 조건을 따라야 합니다.
- 정적 클래스(Static Class) 안에서 메소드를 정의해야 합니다.
- 정적 메소드(Static Method)로 선언해야 합니다.
- 메소드의 첫 번째 매개변수에 this 키워드를 사용하여, 해당 메소드가 어떤 클래스의 확장인지 지정합니다.
이제 예제를 통해 확장 메소드를 알아보겠습니다.
string 클래스에 확장 메소드를 추가하여 문자열의 첫 글자를 대문자로 변환하는 기능을 구현해 보겠습니다.
- 먼저, 확장 메소드를 담을 정적 클래스를 만듭니다.
- CapitalizeFirstLetter라는 확장 메소드를 추가하여 문자열의 첫 글자만 대문자로 변환합니다.
- 정적 클래스 StringExtensions: 모든 확장 메소드를 담을 컨테이너로, 반드시 static 키워드가 붙어야 합니다.
- 정적 메소드 CapitalizeFirstLetter: 이 메소드는 string 클래스의 인스턴스에서 호출할 수 있도록 확장됩니다. 메소드의 첫 번째 매개변수는 this string str로 설정되어 있어, 해당 메소드가 string 클래스의 확장임을 나타냅니다.
- 로직: string.IsNullOrEmpty(str)로 문자열이 비었는지 확인한 후, 비어 있지 않다면 첫 글자를 대문자로 변환하여 반환합니다.
위의 코드에서 text.CapitalizeFirstLetter()를 호출하면, text 문자열의 첫 글자만 대문자로 변환된 결과를 반환합니다. 이처럼 확장 메소드를 사용하면 객체를 수정하지 않고도 원하는 기능을 손쉽게 추가할 수 있습니다.
주의사항
확장 메소드를 사용할 때 몇 가지 주의할 점이 있습니다.
- 이름 충돌 방지: 확장 메소드 이름이 클래스의 기존 메소드와 겹치지 않도록 주의해야 합니다. 기본 클래스에 동일한 이름의 메소드가 있다면, 기존 메소드가 우선 호출됩니다.
- 호출 가능한 범위: 확장 메소드를 정의한 네임스페이스를 using 지시문을 통해 포함해야 합니다. 그렇지 않으면 확장 메소드가 표시되지 않습니다.
- 상속되지 않음: 확장 메소드는 상속되지 않습니다. 즉, 파생 클래스에서 기본 클래스의 확장 메소드를 사용할 수는 있지만, 확장 메소드가 자동으로 파생 클래스의 멤버가 되는 것은 아닙니다.
List를 활용한 추가 예제들
리스트의 평균값 구하기
List<int> 타입에 확장 메소드를 추가하여 리스트의 평균값을 계산하는 메소드를 작성해 보겠습니다.
문자열 리스트에서 특정 길이 이상의 문자열만 필터링하기
List<string> 타입에 확장 메소드를 추가하여 특정 길이 이상의 문자열만 남겨두는 메소드를 작성해 보겠습니다.
앞선 예제의 ListExtensions 클래스 내에 추가로 작성하셔도 무방합니다.
이 외에도 확장 메소드를 활용할 방법은 무궁무진합니다. 여러 상황에 알맞게 잘 활용하시길 바랍니다.
'프로그래밍 > c#' 카테고리의 다른 글
Unity c#에서 자주 사용하는 코루틴: IEnumerator와 IEnumerable 차이점 쉽게 이해하기 (0) | 2024.11.14 |
---|---|
C# 지역 함수?? 지역 함수의 예제와 활용 (0) | 2024.11.05 |
c# 비동기 프로그래밍 async, await (0) | 2024.10.01 |
c# 튜플? Tuple? (0) | 2024.08.01 |
c# 인덱서? Indexer? 인덱서의 특징과 예제 (0) | 2024.05.03 |
댓글