View
너무나도 객체지향스러운 방식인 오버로딩을 다트 언어에서는 사용할 수가 없었다. 나는 코드를 가독성 넘치면서 깔끔하게 작성하는데에 있어서 오버라이딩, 오버로딩만큼이나 유용한 도구가 없다고 생각했는데, 요런게 제공이 잘 되지 않다보니 좀 불편함을 느끼게 되는 것 같다.
ㅤ
아래가 내가 희망하던 코드의 방식이고
// 내가 짜고싶은 코드
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로 어떤 파라미터에 데이터를 넣어주고 있는지 알 수 있으니, 오버로딩으로 인한 문제에 걸리지 않게된다.
ㅤ
오호… 이해했어!
'Develop > Flutter 개발' 카테고리의 다른 글
[Flutter] 원치않게 하위 뷰가 새로 빌드될 때 (0) | 2024.01.28 |
---|---|
[Flutter] 클린 아키텍처 리펙토링 (4) - 계층 별 파일 간 의존성 분리 (0) | 2024.01.20 |
[Flutter] 클린 아키텍처 리펙토링 (3) - 누가 무슨 모델을 사용할 것인가? (1) | 2024.01.14 |
[Flutter] Datetime과 Timestamp (0) | 2024.01.14 |
[Flutter] 클린 아키텍처 리펙토링 (2) - Data Layer (0) | 2024.01.09 |