Upgrade to Pro — share decks privately, control downloads, hide ads and more …

타입에 별명을 붙여주자

타입에 별명을 붙여주자

Google I/O 2021 extended Double S에서 '타입에 별명을 붙여주자'라는 세션의 발표자료 입니다.

12P : RunTimeType과 동등성 검사
DartPad Link : https://dartpad.dev/a1aec903fc33e0fdb47ad23f2d0e073d?null_safety=true

14P : 함수 시그니처
DartPad Link : https://dartpad.dev/bdfc1fab398a38bac0a167af629cbe94?null_safety=true

21P : @Deprecated와 함께 사용
DartPad Link : https://dartpad.dev/55d79f896d07906d3af890fe8eccafd9?null_safety=true

24P : 구식 타입별칭 사용하지 않기
DartPad Link : https://dartpad.dev/aa3fcca8cccda821acb6c4a819efdfaf?null_safety=true

26P : 타입 별칭 보다 인라인 함수 선호하기 1
DartPad Link : https://dartpad.dev/7c70ebdbaae06f45652d1882d736f0f8?null_safety=true

다트 1.x대 버전 테스트는 제가 직접 Dart Sdk를 설치해서 해봤기때문에 궁금하신 분들은 한번 해보시면 좋을 듯 합니다.

Avatar for HongJongPyo

HongJongPyo

June 30, 2021
Tweet

More Decks by HongJongPyo

Other Decks in Programming

Transcript

  1. 03 클래스 타입 별칭 04 타입 별칭 올바르게 사용하기 ఋੑী

    ߹ݺਸ ࠢৈ઱੗ 01 타입 별칭 (Type Alias) 02 함수 타입 별칭
  2. 02 함수 타입 별칭 4 ఋੑী ߹ݺਸ ࠢৈ઱੗ 03 클래스

    타입 별칭 04 타입 별칭 올바르게 사용하기 01 타입 별칭 (Type Alias)
  3. 03 클래스 타입 별칭 5 ఋੑী ߹ݺਸ ࠢৈ઱੗ 04 타입

    별칭 올바르게 사용하기 01 타입 별칭 (Type Alias) 02 함수 타입 별칭
  4. 04 타입 별칭 올바르게 사용하기 6 ఋੑী ߹ݺਸ ࠢৈ઱੗ 03

    클래스 타입 별칭 01 타입 별칭 (Type Alias) 02 함수 타입 별칭
  5. 03 클래스 타입 별칭 04 타입 별칭 올바르게 사용하기 ఋੑী

    ߹ݺਸ ࠢৈ઱੗ 01 타입 별칭 (Type Alias) 02 함수 타입 별칭
  6. 타입 별칭(Type Alias)이란? 공식 홈페이지에 Keyword ‘typedef’로 선언되어 typedef라고 불리며

    타입을 참조하는 간결한 방법이라고 설명되어 있습니다. C, C++, Swift, Kotlin 많은 언어들에서도 사용됩니다.
  7. Dart 타입 별칭 기능의 역사 2.13 <= Dart Version 신식

    타입 별칭 (모든 타입에 사용가능) Dart Vesion < 2.0 구식 타입 별칭 (함수 타입에만 사용가능) 2.0 <= Dart Vesion < 2.13 신식 타입 별칭 (함수 타입에만 사용가능)
  8. 2.0 이후의 타입 별칭 사용법 예시) typedef Operation = int

    Function(int a, int b); // 함수 타입 typedef Compare<T>= int Function(T a, T b)// 제네릭 타입을 사용 typedef Centimeter = double; // 기본형 2.13 이후 사용가능 사용법) typedef 별칭 <제네릭 타입>? = 타입;
  9. 구식 타입 별칭 사용법 예시) typedef int Operation(int a, int

    b); typedef int Compare<T>(T a, T b); 사용법) typedef 반환 타입? 별칭 <제네릭 타입>? (매개 변수?);
  10. RunTime Type과 동등성 검사 typedef Meter = int; typedef Centimeter

    = int; main(){ Meter meter = 1; Centimeter centimeter = 1; int integer = 1; print(“Meter의 Runtime Type : ${meter.runtimeType}”); print(“CentiMeter의 의 Runtime Type : ${centimeter.runtimeType}”); print("int Runtime Type : ${db.runtimeType}"); } 👉DartPad👈
  11. 02 함수 타입 별칭 13 ఋੑী ߹ݺਸ ࠢৈ઱੗ 03 클래스

    타입 별칭 04 타입 별칭 올바르게 사용하기 01 타입 별칭 (Type Alias)
  12. 함수 시그니처 Function Signature 함수의 원형에서 함수와 매개 변수들의 이름

    제외한 나머지를 함수의 시그니처라고 합니다. => 매개 변수의 수, 타입 그리고 반환 타입 👉DartPad👈
  13. Flutter 공식 함수 타입 별칭 예제 typedef WidgetBuilder = Widget

    Function(BuildContext context) ; // Builder.builder에서 사용 // StatelessWidget.build, StatefulWidget의 State.build에서도 // 사용되는 시그니처 typedef VoidCallback = void Function(); // Button들에서 onPressed로 사용 // 매개 변수와 반환 값 둘 다 없는 콜백의 시그니처 typedef ValueChanged<T> = void Function(T value) ; // Radio, Switch, Checkbox등에서 onChanged로 사용 // 현재의 값과 다른 값이 왔을 때 동작 시키는 콜백의 시그니처
  14. 같은 시그니처에 다른 의미 부여 typedef ValueChanged<T> = void Function(T

    value) ; typedef ValueSetter<T> = void Function(T value) ; typedef VoidCallback = void Function() ; typedef GestureTapCallback = void Function() ; // GestureDetector, InkWell의 onTap 필드로 사용 // VoidCallback과 시그니처는 같지만 // 의미론적으로 제스처의 인식인지 버튼을 누르는 것인지의 차이 // DataTable의 onSelectAll 필드로 사용 // ValueChanged<T>와 시그니처는 같지만 // 값의 변경과 관계없이 Set 되었을 때 동작시킨다는 의미를 가집니다..
  15. 03 클래스 타입 별칭 17 ఋੑী ߹ݺਸ ࠢৈ઱੗ 04 타입

    별칭 올바르게 사용하기 01 타입 별칭 (Type Alias) 02 함수 타입 별칭
  16. 클래스 타입에 별칭을 적용하려면? 1. flutter upgrade 명령어를 통해 2.2

    이상으로 올리기 현재 최신 버전 2.2.2 ( 2 – 1. pubspec.yaml 파일의 environment의 sdk를 2.13이상으로 변경 2 – 2. 사용을 원하는 파일의 상단에 ‘//@dart = 2.13’를 추가 하는 것으로 해당 파일만 dart 2.13 버전으로 사용 가능합니다. OR
  17. 더 명확한 의미를 가지도록 변경하기 class Product { // 높이의

    단위는 센티미터 double height; // 길이의 단위는 센티미터 double length; // 폭의 단위는 센티미터 double width; } Typedef Centimeter = double; class Product { Centimeter height; Centimeter length; Centimeter width; } 쇼핑몰에서 물건들을 Centimeter 단위로 표기한다고 합니다. 이 때 타입 별칭을 이용해서 더 명확하게 의미를 전달할 수 있습니다.
  18. @Deprecated와 함께 사용 플러그인의 클래스의 이름이 나쁘다는 건의를 받아서 클래스

    명을 변경해야하는 일이 생겼습니다. @Deprecated(“Use GoodNameClass instead”) Typedef BadNameClass = GoodNameClass; 👉DartPad👈
  19. 04 타입 별칭 올바르게 사용하기 22 ఋੑী ߹ݺਸ ࠢৈ઱੗ 03

    클래스 타입 별칭 01 타입 별칭 (Type Alias) 02 함수 타입 별칭
  20. 구식 타입 별칭사용하지 않기 Dart는 두 가지 방식의 함수 타입

    별칭이 있습니다. 그 중 구식 타입 별칭의 문제를 알려드리겠습니다. 👉DartPad👈
  21. 단순한 함수 실행을 위한 단일 멤버 추상클래스 대신 타입 별칭

    사용 abstract class Predicate<E> { bool test(E element); } typedef Predicate<E> = bool Function(E element);
  22. 2.0 부터는 type annotation을 사용할 수 있는 모든 곳에서 함수

    타입을 사용할 수 있기 때문에 무조건 타입 별칭을 사용해야하지 않으며 대부분의 경우 인라인 함수가 훨씬 명확합니다. 타입 별칭 보다 인라인 함수 선호하기 1 Dart 1.x버전에서는 함수를 변수, 필드, 제네릭 형식 매개변수로 사용하려면 먼저 구식 타입 별칭을 사용해 원하는 함수 타입을 정의해야 했습니다. 👉DartPad👈
  23. 타입 별칭 보다 인라인 함수 선호하기 2 예시) typedef Compare<T>

    = int Function(T a, T b); int sort(int a, int b) => a - b; void main(){ print(sort is Compare<int>); } 그러나 예외는 있습니다. 특별히 길거나 자주 사용되는 경우 여전히 타입 별칭을 정의할 필요가 있을 수 있습니다.
  24. 마무리 정리 코드의 양은 줄지만 익숙하지 않은 사람이 볼 땐

    접근성이 떨어지게 될 수 있습니다. 그러나 이름만으로 의도하는 내용의 전달이 부족한 상황에서는 좋다고 생각합니다. 함께 프로젝트를 진행하시는 팀이 있다면 타입 별칭 기능을 사용하자고 말해 보는 건 어떨까요?
  25. 발표를 마치며 Dart 언어의 발전 과정을 보는게 꽤 재미있었습니다. 저처럼

    초보 개발자도 발표하는 모습을 보시고 용기내서 다른 분들도 더 많이 참여 하시면 좋을 것 같아요! 다음에도 기회만 된다면 또 발표자로 참여하고 싶습니다.