<개인공부>/[Flutter, Dart]

[Dart] 다트 확장 메서드(Extension Methods) - 클래스에 기능 추가

BlockDMask 2025. 2. 10. 07:00
반응형

안녕하세요. BlockDMask입니다.

우리가 개발을 하다 보면 기본 클래스(String, List, DateTime 등), 외부 라이브러리에 원하는 기능이 없어서 불편할 때가 있습니다. 이때 정말 유용하게 사용할 수 있는 확장 메서드에 대해서 소개해 보려 합니다.

 

1. 확장 메서드란?

Dart의 확장 메서드(Extension Methods)는 기존 클래스의 코드를 변경하지 않고도 새로운 메서드를 추가할 수 있는 기능입니다.

이 기능을 활용하면 외부 라이브러리의 클래스나 기본 제공 클래스(String, List 등)에도 원하는 기능을 쉽게 확장할 수 있습니다.

(C#에서도 확장 메서드 문법을 사용할 수 있습니다.)

 

 

 

2. 기본 문법 설명

확장 메서드는 extension과 on 키워드만 알면 됩니다.

- extension확장메서드 이름 on 확장할 클래스 { 구현 }

이걸 코드로 보면 아래와 같습니다.

- ExtensionName: 확장 메서드의 이름

- TargetType: 확장할 대상 클래스 (예시: String, List, DateTime 등)

- methodName: 추가할 메서드의 이름

 

 

 

3. 확장 메서드 예제 1: String 클래스 확장

실습을 위해 하나의 메서드를 추가해 볼게요.

Dart의 String클래스에는 문자열을 "소문자_소문자" 이런 식으로 포맷을 바꿔주는 snake_case 변환 기능이 없습니다.

이 기능을 한번 추가해 보겠습니다. toSnakeCase()라는 확장 메서드를 만들어보겠습니다.

 

- replaceAllMapped()를 사용해서 대문자가 나오면 _ 를 추가하는 방식으로 구현했습니다.

- 아래 실제 사용 부분을 보면  마치 원래부터 String 클래스에 존재하던 메서드 처럼, 우리가 만든 toSnakeCase() 메서드를 사용할 수 있는 것을 볼 수 있습니다.

이것이.. 이것이 바로 "확장 메서드"입니다.

 

 

 

4. 확장 메서드 예제 2:List의 평균 구하기 

두 번째 예제입니다.

Dart의 List<int>에는 기본적으로 평균을 구하는 함수는 없습니다.

이를 해결하기 위해서 average()라는 확장 메서드를 추가해 보겠습니다.

해당 메서드는 get을 이용해서 마치 프로퍼티처럼 호출 할 수 있도록 해보았습니다.

 

 

- 함수 이름 앞에 get을 붙여주면 메서드를 마치 프로퍼티 처럼 쓸 수 있습니다.

- reduce()를 활용해서 리스트의 모든 요소를 더한 후, 개수로 나누어서 평균을 구하도록 구현했습니다.

reduce 함수와, get 키워드는 이후 포스팅에서 좀 자세히 다루어 보겠습니다.

 

아무튼, 이렇게 리스트 클래스에서도 확장 메서드를 만들어 보았습니다.

 

 

 

5. 확장 메서드 예제 3: DateTime 포맷 

자 이제 마지막으로 DateTime 클래스에도 확장메서드를 한번 만들어 보겠습니다.

Dart의 DateTime 클래스에는 날짜를 YYY-MM-DD 형식으로 변환하는 기능은 없습니다.

이것을 구현하기 위해서 formatted 속성을 추가하는 확장 메서드를 만들어 보았습니다.

 

- padLeft(2, '0')을 사용해서 월과 일이 한자리 수인 경우 앞에 0을 붙이게 했습니다.

- formatted 속성을 사용한 것처럼, DateTime을 쉽게 원하는 포맷으로 변경하는 확장 메서드를 여러분도 만들 수 있습니다.

 

 

 

6. Dart 확장 메서드 사용 시 주의할 점

6-1. 기존 메서드를 덮어쓸 수 없습니다.

기존에 같은 이름의 메서드가 있으면, 원래 메서드가 호출됩니다.

Dart의 String클래스에는 toUpperCase()라는 메서드(함수)가 이미 만들어져 있습니다.

이 toUpperCase와 동일한 이름으로 확장 메서드를 만든다 하더라도, 우리가 만든 확장 메서드가 호출되진 않습니다.

 

 

6-2. dynamic 타입에서는 동작하지 않는다.

확장 메서드는 정적 타입이 지정된 변수에서만 동작합니다.

즉, dynamic과 같은 동적 타입에서는 확장 메서드를 사용할 수 없습니다.

 

 

6-3. 네임스페이스 충돌 주의

여러 개의 확장 메서드가 같은 클래스를 확장하면 충돌이 발생할 수 있습니다.

네이밍을 신중하게 세팅할 것을 권장드립니다.

 

 

정리하면, Dart의 "확장 메서드(Extension Methods)"는 기존 클래스를 변경하지 않도고 원하는 기능을 추가할 수 있는 재미난 문법입니다.

이렇게 오늘 다트의 확장 메서드의 설명, 사용법, 예제, 주의점까지 한번 알아보았습니다.

여러분의 dart 지식에 도움이 되었길 바랍니다. 감사합니다.

반응형