다트의 확장 메서드(Extension Methods)란 무엇인가요?
_____1. 확장 메서드란 무엇인가요?
• 기존 클래스나 타입을 상속 없이도 메서드나 프로퍼티를 추가하는 기능
• 전역 함수 형태가 아닌, 원래 타입의 인스턴스 메서드처럼 호출 가능
2. 왜 확장 메서드를 사용하나요?
• 표준 라이브러리나 외부 패키지를 수정할 수 없을 때 기능 보강
• 유틸리티 함수들을 타입별로 묶어 코드 가독성·재사용성 향상
• 상속이 불가능한 sealed 클래스에서도 추가 기능 제공
3. 선언 방법은 어떻게 되나요?
syntax
```dart
extension ExtensionName on Type {
ReturnType methodName(Parameters) { … }
Type get propertyName => …;
}
```
예시
```dart
extension StringCaps on String {
String capitalize() =>
this.isEmpty ? this : this[0].toUpperCase() + substring(1);
}
```
4. 사용 예제는 어떻게 되나요?
```dart
void main() {
String s = "hello";
print(s.capitalize()); // 출력: Hello
}
```
5. 확장 메서드 우선순위(해결 순)
1) 실제 클래스에 정의된 멤버
2) 상속받은 멤버
3) 명시적으로 import한 확장
4) 암시적으로 import된 확장
※ 동일 이름이 충돌할 때는 명시적 import 를 선택해야 함
6. 네임스페이스 충돌 해결법은?
• `import 'a.dart' as a; import 'b.dart' as b;`
`a.MyExt`/`b.MyExt` 로 구분
7. 제약사항이 있나요?
• private 멤버(`_member`)에는 접근 불가
• extension 내부에 상태(필드) 선언 불가
• `super` 키워드 사용 불가(상속 아님)
• late 초기화나 생성자 정의 불가
8. 제네릭 확장도 가능한가요?
```dart
extension ListUtils
T? secondOrNull() => this.length > 1 ? this[1] : null;
}
```
9. `static` 메서드를 추가할 수 있나요?
• extension 안에 `static` 메서드·필드 정의 가능
• 호출 시 `ExtensionName.staticMethod()` 형태로 사용
10. 확장 메서드의 라이프사이클은?
• 컴파일 타임에 메서드 호출로 변환됨
• 런타임 오버헤드 거의 없음
11. 어떤 버전부터 지원하나요?
• Dart 2.7 이상에서 도입
12. 기존 유틸 클래스와 비교하면?
• 기존: `StringUtils.capitalize(s)`처럼 별도 호출
• 확장: `s.capitalize()` 처럼 자연스러운 호출
13. 주의할 점·Best Practices
• 범위(scope)를 좁히기 위해 파일 단위로 작은 extension 작성
• 의도를 명확히 드러내는 이름 부여(예: `on String`, `on Iterable
• 동일 타입에 너무 많은 메서드를 몰아넣지 말고 책임 분리
• 네임스페이스 충돌 방지 위해 가급적 `as` import 활용
14. 더 알아볼 자료는?
• 공식 문서: https://dart.dev/guides/language/extension-methods
• Dart SDK 변경로그(2.7)
–––
위 내용을 참고하여 확장 메서드로 코드의 가독성·재사용성을 높여 보세요!
작성자:
정재민 [비회원]
| 작성일자: 1년 전
2024-09-19 01:52:35
조회수: 207 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 207 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.