Computer Science
탄탄한 기반 실력을 위한
전공과 이론 지식 모음
Today I Learned!
배웠으면 기록을 해야지
TIL 사진
Flutter 사진
Flutter로 모바일까지
거꾸로캠퍼스 코딩랩 Flutter 앱개발 강사
스파르타코딩클럽 즉문즉답 튜터
카카오테크캠퍼스 3기 학습코치
프로필 사진
박성민
임베디드 세계에
발을 들인 박치기 공룡
임베디드 사진
EMBEDDED SYSTEM
임베디드 SW와 HW, 이론부터 실전까지
ALGORITHM
알고리즘 해결 전략 기록
🎓
중앙대학교 소프트웨어학부
텔레칩스 차량용 임베디드 스쿨 3기
애플 개발자 아카데미 1기
깃허브 사진
GitHub
프로젝트 모아보기
Instagram
인스타그램 사진

Develop/Flutter 개발

[Dart] 다트가 오버로딩을 지원하지 않는 이유?

sm_amoled 2024. 1. 15. 16:22

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

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

// 내가 짜고싶은 코드
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