[TIL-012] 내가 모르는 메서드를 잘 사용할 수 있는 이유

Dart는 타입을 선언하는 것과 메서드의 반환 타입이 무엇인지 아는 것이 중요하다.

근데 메서드의 반환 타입이 무엇인지 모르는 경우가 많다.

물론, VSCode가 알려주지만 시그니처(메서드의 형태)가 도대체 어떤 의미인지까지는 잘 모른다.

그래서 오늘은 공식 문서에 나오는 메서드의 시그니처를 읽는 방법을 공부했다.

 

map 메서드

`List`의 `length`만큼 반복문이 동작하는 메서드.

콜백 함수에서 `List`의 각 요소를 읽어 올 수 있으며, return 되는 값을 모아 최종적으로 `Iterable`객체를 반환한다.

 

공식 문서에 나오는 코드를 분석해 보자.

Iterable<T> map<T>( T toElement( E e ) )

 

Iterable<T>

`map`메서드가 최종적으로 반환할 타입을 말한다.

var numbers = [1, 2, 3];
var strings = numbers.map((n) => '$n');
  • 변수 `strings`의 최종 타입은 `numbers.map()`의 반환 타입으로 인해 `Iterable<String>`이 된다.

 

map<T>

`map`메서드를 호출할 때 명시적으로 T라는 타입을 지정할 수 있다.

그러면 반환되는 타입은 T를 요소로 가지는 `Iterable`이여야만 한다.

var numbers = [1, 2, 3];
var strings = numbers.map<String>((n) => '숫자: $n');
  • 호출할 때 명시적로 `<String>`을 사용했으므로 변수 `strings`의 최종 타입은 `Iterable<String>`이 돼야 한다.

 

 T toElement( E e )

  • `toElement( E e )`는 `map`메서드의 콜백함수를 뜻한다.
  • `T`는 이 콜백함수의 반환 타입이다.
  • `e`는 콜백함수의 매개변수이며, `List`의 각 요소가 할당된다.
  • `E`는 매개변수 `e`의 타입이다. 

 

설명

위에서 부분적으로 설명한 것을 풀어서 설명하면 다음과 같다.

Iterable<T> map<T>( T toElement( E e ) )

 

`map`메서드는 호출할 때 `toElement`라는 콜백함수를 인자로 사용하고, 이 콜백함수의 매개변수인 `e`는 `List`의 각 요소이며 타입은 `E`이다.

 

콜백함수는 반복이 될 때마다 `T`라는 타입을 반환하고, 최종적으로 `map`메서드는 `T`를 요소로 하는 `Iterable<T>`을 반환한다.

 

마무리(느낀 점)

이제 메서드의 반환 값을 변수에 할당하여 초기화 할 때, `var`키워드를 사용해 타입 추론을 하는 것이 아니라 메서드의 타입을 적용하여 명시적으로 변수의 타입을 나타낼 수 있게 되었다.

 

Dart는 타입을 잘 지정하고, 무엇이 어떤 타입인지 미리 알고 있으면 컴파일 오류가 90%는 줄어들 것 같다.

그리고 메서드 체이닝을 더욱 활발히 사용 할 수 있을 것 같다.