[TIL/Flutter] 변수를 명시적으로 null 초기화 하지마세요

pendant.kpendant.k
2 min read

예시 코드

class DiagnosisContent extends ConsumerStatefulWidget {
  const DiagnosisContent({
    super.key,
  });

  // Tap event

  @override
  ConsumerState<DiagnosisContent> createState() => _DiagnosisContentState();
}

class _DiagnosisContentState extends ConsumerState<DiagnosisContent> {
  // local states
  // local selected diagnosis
  var _selectedDiagnosis = null;
  var _selectedAnswerIdex = null;

  void _selectDiagnosis(DiagnosisType newValue) {
    setState(() {
      _selectedDiagnosis = newValue;
    });
  }
// ... 생략 ...

습관처럼 nullable 변수를 사용할 때 명시적으로 null값으로 초기화를 시켰다. 어느 순간부터 Flutter 코드가 질적으로 성장하지 않고 있다는 느낌을 받아 Dart 공식 문서를 다시 보고 있는데, 다음과 같은 내용이 있었다.

명시적으로 변수를 null값으로 초기화하지마세요! (어 왜요?)

그냥 하지말라면 하지마 ! 가 아니라 variable이 nullable하거나 const, final이 아닌 경우에는 Dart가 알아서 암시적으로 null 값으로 초기화를 한단다.

If the variable is nullable and not const or final, then it is implicitly initialized to null for you.

-Dart 공식 문서 / Linter rules / avoid_init_to_null 관련 내용- https://dart.dev/tools/linter-rules/avoid_init_to_null

Dart 공식문서님이 말하는 굿 케이스

Item? bestDeal(List<Item> cart) {
  // 명시적으로 선언해주지 않아도 됨
  Item? bestItem;

  for (final item in cart) {
    if (bestItem == null || item.price < bestItem.price) {
      bestItem = item;
    }
  }

  return bestItem;
}

Dart에서는 uninitialized memory 개념 자체가 없으니 명시적으로 null값을 초기화해주는 건 "아무 의미가 없따" (하지만 내가 마음이 편하니 의미가 있는 거 아닌가요?)

There's no concept of "uninitialized memory" in Dart and no need to explicitly initialize a variable to null to be "safe". Adding = null is redundant and unneeded.

-공식문서 내용 발췌-

결론

C,C++과 같은 언어처럼 직접 메모리를 관리하지 않고 Dart가 가비지 컬렉션, 메모리 관리를 자동으로 해주기 때문에 의도치 않은 uninitialized memory가 거의 발생하지 않는다. 또한 null safety도 있으니 걱정말고 명시적 선언을 자제하도록 하자!

0
Subscribe to my newsletter

Read articles from pendant.k directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

pendant.k
pendant.k

iOS / Flutter Developer