안녕하세요. 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 지식에 도움이 되었길 바랍니다. 감사합니다.
'<개인공부> > [Flutter, Dart]' 카테고리의 다른 글
[Dart] 다트 .. (캐스캐이드 연산자) 정리 (0) | 2025.02.05 |
---|---|
[Flutter] 플러터와 안드로이드 스튜디오 설치 총정리 (10) | 2020.09.10 |
[Dart] 다트 기본 문법 정리 2편 (is, as) (2) | 2020.05.16 |
[Dart] 다트 기본 문법 정리 1편 (자료형, 연산자, 주석) (0) | 2020.05.10 |