확장 메소드
포스트
취소

확장 메소드

확장 메소드란?

  • 라이브러리의 API를 직접 수정하지 않고 특정 메소드를 구현하고 싶을 때 사용하는 기능
  • 기존의 자료구조에 새로운 기능을 추가한 것처럼 동작한다.
  • dynamic 타입의 변수에는 사용할 수 없다.
  • var 타입의 변수에는 사용할 수 있다.
  • 확장 메소드는 Dart의 타입 추론을 사용한다.
  • 확장 메소드는 리시버의 정적 타입에 대해 생성된다.
    • 정적으로 생성되기 때문에 static 함수를 호출하는 것만큼 빠르다.

사용 방법

  • 기본 형식
extension 클래스명 on 기능을_구현할_클래스명 {
    /* 기능 구현 */
}
  • 사용 예시
extension StringExtension on String {
    int parseInt(){
        return int.parse(this);
    }

    bool get isDouble {
        return this != null && double.tryParse(this) != null;
    }
}

var i = "10".parseInt();
print(i.runtimeType); //출력 : int
  
var isDouble = "10.0".isDouble;
print("isDouble : $isDouble"); //출력 : true

isDouble = "a".isDouble;
print("isDouble : $isDouble"); //출력 : false

충돌 방지

  • 확장 메소드가 인터페이스나 다른 확장 메소드와 충돌하는 경우에 대한 대처 방법

  • show/hide 키워드를 통해서 사용하는 확장 메소드의 제한을 추가하기

    • hide 키워드 사용 시 extention 클래스 자체를 숨겨야한다
      • “hide 클래스명.확장메소드명”처럼 사용할 수는 없다.
//extention_sample_1.dart
extension ExtensionSample1 on String {
    int parseInt(){
        return int.parse(this);
    }
}

//extention_sample_2.dart
extension ExtensionSample2 on String {
    int parseInt(){
        return int.parse(this);
    }
}

//parseInt()가 충돌다는 경우에 대한 대처법
import 'extention_sample_1.dart';
import 'extention_sample_2.dart' hide ExtensionSample2; //hide 키워드를 통해서 ExtensionSample2의 확장 메소드를 숨긴다.
  • 명시적인 확장 사용
//extention_sample_1.dart
extension ExtensionSample1 on String {
    int parseInt(){
        return int.parse(this);
    }
}

//extention_sample_2.dart
extension ExtensionSample2 on String {
    int parseInt(){
        return int.parse(this);
    }
}

import 'extention_sample_1.dart';
import 'extention_sample_2.dart';
print(ExtensionSample1("27").parseInt());
print(ExtensionSample2("27").parseInt());
  • 별칭을 지정하는 경우
//extention_sample_1.dart
extension ExtensionSample on String {
    int parseInt(){
        return int.parse(this);
    }
}

//extention_sample_2.dart
extension ExtensionSample on String {
    int parseInt(){
        return int.parse(this);
    }
}

//extension 클래스의 이름이 동일해도 사용할 수 있는 방법
import 'extention_sample_1.dart';
import 'extention_sample_2.dart' as ea;
print(ExtensionSample("27").parseInt());
print(ea.ExtensionSample("27").parseInt());

확장 메소드와 연산자

  • 연산자를 통해서 다양한 방식으로 구현할 수도 있다.
extention ExtensionSample on String {
    String operator & (String other) => "$this $other";
}

print("오늘" & "아침에는" & "미역국에" & "밥 말아 먹었음!"); //출력 : 오늘 아침에는 미역국에 밥 말아 먹었음!
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.