플러터의 새로운 여정 Dart 3.0!

Written by 코드팩토리 JC

2월 14, 2024

서론

Dart언어 드디어 3.0!

Dart 언어는 지난 몇 년간 모바일 및 웹 개발에서 주목할만한 성장을 이루었습니다. 구글의 플러터 프레임워크에서 주로 사용되는 언어로, Dart 언어는 크로스 플랫폼 개발에서 핵심적인 역할을 하게 되었습니다. Dart 3.0이 출시되면서 개발자 커뮤니티는 새로운 기능, 개선된 성능, 그리고 더욱 강화된 안정성을 경험할 수 있게 되었습니다. 이 글은 Dart 언어를 이미 사용하고 있지만, 3.0 업데이트의 구체적인 내용을 아직 파악하지 못한 개발자들을 위해 작성되었습니다.

Dart 3.0은 Dart 언어의 발전을 새로운 차원으로 이끄는 중요한 이정표입니다. 이번 업데이트는 개발자들이 더 효율적이고, 빠르며, 유연한 애플리케이션을 구축할 수 있도록 도와줄 것입니다. 이제부터 Dart 3.0의 주요 변경 사항들을 자세히 살펴보고, Dart 언어의 새로운 문법과 특성들을 깊이 있게 탐구해보겠습니다.

Dart 3.0의 주요 변경 사항

새로운 기능 및 개선 사항 개요

Dart 3.0은 개발자들에게 많은 새로운 기능과 개선 사항을 제공합니다. 이 업데이트의 핵심은 코드의 간결성, 성능 향상, 그리고 더 나은 개발 경험에 중점을 두고 있습니다. 여기에는 개선된 null safety, 향상된 비동기 프로그래밍 지원, 그리고 컴파일러 최적화 등이 포함됩니다​​. 참고 링크 바로가기

  1. 개선된 Null Safety: Dart 3.0에서는 null safety 기능이 더욱 강화되었습니다. 이는 개발자들이 null 관련 버그를 더 쉽게 예방하고, 코드의 안정성을 향상시킬 수 있도록 도와줍니다​​.
  2. 비동기 프로그래밍의 향상: Dart 언어는 항상 비동기 프로그래밍을 강력히 지원해왔습니다. Dart 3.0에서는 비동기 코드의 성능과 가독성이 더욱 향상되었습니다​​.
  3. 컴파일러 최적화: 컴파일러 최적화를 통해 애플리케이션의 실행 속도가 향상되었습니다. 이는 특히 모바일 기기에서의 앱 성능에 큰 영향을 미칩니다​​.

성능 향상 및 안정성 개선에 대한 설명

Dart 3.0은 성능 향상과 안정성 개선에 중점을 두었습니다. 특히 메모리 관리와 가비지 컬렉션 기능이 개선되어 애플리케이션의 전반적인 효율성이 증가했습니다​​. 참고 링크 바로가기

  • 메모리 관리의 효율성: Dart 3.0은 메모리 사용을 최적화하여 더 빠르고 효율적인 애플리케이션 실행을 가능하게 합니다​​.
  • 가비지 컬렉션 개선: 새로운 가비지 컬렉션 알고리즘은 메모리 관리를 더욱 효율적으로 만들어, 애플리케이션의 성능을 향상시킵니다​​.

이러한 변경 사항들은 Dart 언어의 핵심적인 부분을 강화시키며, 개발자들이 더욱 빠르고 효율적인 코드를 작성할 수 있게 도와줍니다. Dart 3.0의 이러한 개선 사항들은 특히 대규모 애플리케이션 개발에서 그 진가를 발휘할 것입니다​​.

Dart 언어 문법의 변경 사항

문법 변경의 상세한 분석

이제 여러분들이 정말 기다리던 내용입니다. Dart 3.0은 언어 문법에 여러 중요한 변경을 도입했습니다. 이러한 변경 사항들은 코드 작성 방식에 상당한 영향을 미칠 수 있으며, 다음과 같은 주요 부분들을 포함합니다:

  • 패턴 매칭의 도입: Dart 3.0은 패턴 매칭 기능을 추가했습니다. 이를 통해 개발자들은 변수의 타입이나 값을 더 쉽게 검사하고 분해할 수 있게 되었습니다. 예를 들어, 다양한 타입의 패턴을 사용하여 복잡한 데이터 구조를 간결하게 처리할 수 있습니다​​.
switch (obj) {
  // obj가 1일경우 매치됩니다.
  case 1:
    print('one');

  // obj가 두개의 값을 갖고있는 리스트일 경우 매치됩니다.
  // case 문에서 첫번째 값은 a라는 변수명으로, 두번째 값은 b라는 변수명으로 사용 할 수 있습니다.
  case [a, b]:
    print('$a, $b');

  // 두개의 값을 갖고있는 Record 타입일 경우 매치됩니다.
  // case 문에서 첫번째 값은 a라는 변수명으로, 두번째 값은 b라는 변수명으로 사용 할 수 있습니다.
  case (var a, var b):
    print('a = $a, b = $b');

  default:
}
Dart

위와 같이 단순히 값을 조건으로 사용하는게 아닌 패턴을 정확히 매칭 시키는 기능이 생겼습니다.

  • 레코드 타입의 추가: 레코드는 여러 값을 하나의 구조로 묶는 새로운 데이터 타입입니다. 이를 통해 함수에서 여러 값을 반환하거나, 여러 값을 하나의 변수에 저장하는 것이 가능해졌습니다. 레코드는 불변성을 갖고 있으며, 각 필드에 대한 직접적인 접근을 제공합니다​​.
var person = (name: '홍길동', age: 30);

print('이름: ${person.name}, 나이: ${person.age}');
Dart

이 코드는 nameage 두 필드를 가진 person 레코드를 생성하고, 이를 출력합니다.

  • 클래스 수정자의 변화: Dart 3.0에서는 클래스에 적용할 수 있는 새로운 수정자가 추가되었습니다. 이를 통해 클래스를 더 세밀하게 제어할 수 있습니다. 새로 생긴 수성자로는 abstract, sealed, interface, final, base 등이 있습니다. 모든 수성자는 클래스 키워드 앞에 사용하게 됩니다. 아래 간단한 예제와 설명을 참고 해보세요!
abstract: 인스턴스화할 수 없고 다른 클래스의 기반으로 사용되는 클래스를 정의합니다.
abstract class Shape {
  void draw();
}
Dart
sealed: 클래스를 현재 라이브러리 내에서만 확장할 수 있게 제한합니다.
sealed class BaseClass {
  final String name;
  BaseClass(this.name);
}
Dart
interface: 클래스가 특정 인터페이스를 구현해야 함을 나타냅니다.
interface Drawable {
  void draw();
}

class Circle implements Drawable {
  @override
  void draw() {
  
  }
}
Dart
final: 다른 클래스가 상속받을 수 없는 클래스를 정의합니다.
final class CompletedTask {
  final String task;
  CompletedTask(this.task);
}
Dart
base: 다른 클래스가 상속할 수 있는 기반 클래스를 정의합니다. base 클래스는 인스턴스화할 수 있습니다.
base class Vehicle {
  void start() {
    print('Vehicle started');
  }
}
Dart

추가로 mixin 수정자도 존재합니다. 기존 존재하던 mixin을 클래스 형태로 사용 할 수 있도록 해주는거니 설명은 스킵하겠습니다.

위 예제들을 조금 더 자세히 파고들수도 있지만 아래 테이블로 매우 쉽게 이해가 됩니다. 단순히 단일 수정자를 사용하는 것 뿐만 아니라 조합을 했을때 어떤 기능이 제공 되는지 정리 돼있습니다. 다트 언어를 어느정도 사용 해왔고 OOP에 대한 지식이 조금이라도 있다면 금방 쉽게 이해 할 수 있을거라고 생각됩니다.

수정자 (Modifier)생성자로 사용 가능 여부Extend 가능 여부Implement 가능 여부Mixin 사용 가능 여부Exhaustive 여부
class가능가능가능불가능불가능
base class가능가능불가능불가능불가능
interface class가능불가능가능불가능불가능
final class가능불가능불가능불가능불가능
sealed class불가능불가능불가능불가능가능
abstract class불가능가능가능불가능불가능
abstract base class불가능가능불가능불가능불가능
abstract interface class불가능불가능가능불가능불가능
abstract final class불가능불가능불가능불가능불가능
mixin class가능가능가능가능불가능
base mixin class가능가능불가능가능불가능
abstract mixin class불가능가능가능가능불가능
abstract base mixin class불가능가능불가능가능불가능
mixin불가능불가능가능가능불가능
base mixin불가능불가능불가능가능불가능
  • 스위치 표현식과 if-case 절: Dart 3.0은 스위치 표현식을 도입하여 다중 방향 분기를 더 효율적으로 표현 할 수 있게 되었습니다.
switch (charCode) {
  case slash || star || plus || minus:
    token = operator(charCode);
  case comma || semicolon:
    token = punctuation(charCode);
  case >= digit0 && <= digit9:
    token = number();
  default:
    throw FormatException('Invalid');
}
Dart

위 코드를 아래와 같이 작성 가능합니다!

token = switch (charCode) {
  slash || star || plus || minus => operator(charCode),
  comma || semicolon => punctuation(charCode),
  >= digit0 && <= digit9 => number(),
  _ => throw FormatException('Invalid')
};
Dart

이러한 기능들을 통해 저희는 더 효율적이고 읽기 쉬운 코드를 작성할 수 있게 되었습니다.

위 내용은 모두 공식문서에서 확인 할 수 있습니다!

관련 포스트

ChatGPT가 이야기하는 2024년 개발자 로드맵

ChatGPT가 이야기하는 2024년 개발자 로드맵

서론 개발자의 여정을 시작하며 안녕하세요, 미래의 개발자 여러분! 오늘부터 시작하는 여러분의 개발 여정에 함께할 수 있어서 기쁩니다. 2023년은 기술이 매우 빠르게 변화하는 해였으며, 이러한 변화 속에서 개발자가 되기 위한 길은 더욱 다채롭고 흥미로워졌습니다. 이 로드맵은 초보자인 여러분이 개발의 세계에 첫발을 내딛는 데 필요한 기초부터 시작해, 점차 심화 단계로 나아가는 길을 안내해 드릴 것입니다. 백엔드 개발 이 글은 단순히 기술을 배우는 것 이상의 의미를 가집니다....

Flutter Freezed 플러그인! Entity Code Generation은 이거 하나로 끝!

Flutter Freezed 플러그인! Entity Code Generation은 이거 하나로 끝!

https://youtu.be/i5p6wXLAX7I 서론 Flutter 는 Code Generation 기능이 상당히 많이 활성화되어 있어요. 흔히들 많이 사용하는 json_serializable 라이브러리도 있고 retrofit 및 chopper 라이브러리도 있습니다. 오늘 알려드릴 freezed 또한 데이터 클래스에 편의 기능들을 제공해주는 code generation 라이브러리입니다. Freezed vs Json Serializable Code Generation 이라는...

Flutter Equatable 플러그인, 도대체 어디에 쓰는건가요?

Flutter Equatable 플러그인, 도대체 어디에 쓰는건가요?

https://youtu.be/9-FGJHTRRW0 서론 안녕하세요 코드팩토리입니다. 오늘은 Equatable 플러그인 사용법에대한 강의를 가져왔어요. 외부 플러그인들을 보거나 튜토리얼을 보면 클래스들이 Equatable 부모 클래스를 익스텐드하는걸 자주 볼 수 있는데 커뮤니티에서도 종종 질문이 들어와서 왜 Equatable 플러그인을 사용해야하는지 설명을 해보려고 합니다. Equatable 이란? Equatable 플러그인은 한 인스턴스와 다른 인스턴스가 같은 인스턴스인지...