View

300x250

너무나도 객체지향스러운 방식인 오버로딩을 다트 언어에서는 사용할 수가 없었다. 나는 코드를 가독성 넘치면서 깔끔하게 작성하는데에 있어서 오버라이딩, 오버로딩만큼이나 유용한 도구가 없다고 생각했는데, 요런게 제공이 잘 되지 않다보니 좀 불편함을 느끼게 되는 것 같다.

아래가 내가 희망하던 코드의 방식이고

// 내가 짜고싶은 코드
List<Type> getEntityList({
  DateTime bySelectedDate,
}) { ... }

List<Type> getEntityList({
  String bySelectedUserId,
}) { ... }

// -> 이걸 사용하는 시점에는
list = getEntityList(bySelectedDate: DateTime);
list = getEntityList(bySelectedUserId: UserId);

아래는 다트에서 짜야하는 코드 방식이라고 생각한다. 오버로딩이 불가능하니깐 함수명이 너무나도 길어지고 있다.

// Dart에서 짜야하는 코드
List<Type> getEntityListBySelectedDate(
  DateTime bySelectedDate,
) { ... }

List<Type> getEntityListBySelectedUserId(
  String bySelectedUserId,
) { ... }

// -> 이걸 사용하는 시점에는
list = getEntityListBySelectedDate(DateTime);
list = getEntityListBySelectedUserId(UserId);

물론 이런 방식으로 작성하는 것도 가능하겠지만, 함수 내부의 로직이 너무 더러워지는게 문제라고 생각한다.

// 함수 내부 본문에서 값이 null이 아닌 선택지에 대해 로직 처리하기
List<Type> getEntityList([
  DateTime bySelectedDate, 
  String bySelectedUserId,
]) { ... }

// -> 이걸 사용하는 시점에는
list = getEntityList(bySelectedDate: DateTime);
list = getEntityList(bySelectedUserId: UserId);

Dart가 오버로딩을 할 수 없는 이유

그런 고로, 왜 Dart에서는 오버로딩을 지원하지 않는지를 구글링을 해보니 아래처럼 설명하고 있다.

Function overloading is not supported in Dart at all. Function overloading requires static types. Dart at its core is a dynamically typed language.

Dart did not support overloading originally because it was a much more dynamic language where the declared types did not have any semantic effect. That made it impossible to use static type based overload resolution.

대충 요약을 하자면 Dart 언어는 동적인 타입의 언어이기 때문에, 선언 시점의 타입이 유효한 의미를 가지지 않아 오버로딩으로 어떤 함수를 사용할 지 컴파일 타임에 선택하기 어렵다는 것이다.

다른 Dynamic Type Language 들도 컴파일 타임에 strict 하게 타입체킹을 수행하지 않기 때문에 컴파일 타임에 미리 사용할 함수를 결정해 머신코드로 번역하지 못하게 되고, 메서드 오버로딩을 구현해 동적으로 어떤 함수를 수행할 지 선택하려고 하더라도 Dynamic Type Language의 장점을 살리지 못하고 실행에 시간이 더 오래걸리는 문제가 발생할 수 있다고 한다.

따라서 다트에서는 오버로딩을 하지 않고, 차라리 optional parameter를 사용해 하나의 함수에 전달하는 파라미터에 따라 다양한 로직을 수행할 수 있게 설계한 것 같다. 이러면 타입 상관 없이 무조건 하나의 함수만 처리하게 되고, 파라미터는 어차피 named로 어떤 파라미터에 데이터를 넣어주고 있는지 알 수 있으니, 오버로딩으로 인한 문제에 걸리지 않게된다.

오호… 이해했어!

320x100
Share Link
reply
반응형
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31