Flutter (앱 개발)/Dart 코드 첨부 파일

[Dart 변수와 데이터 타입] null safety란? Dart의 null 안전성 이해하기(명령 프롬프트 첨부 파일 제공)

Ize𓆜 2025. 2. 24. 14:41
728x90
728x90

 

 

null safety란?

Dart의 null 안전성 이해하기 🚀🔍

 

Dart는

null safety (널 안전성) 기능을 제공하여

null로 인한 오류를 방지하고

코드 안정성을 높입니다.


Flutter 개발에서

null safety를 이해하고

올바르게 활용하면,

앱 충돌을 방지하고

유지보수를 쉽게 할 수 있습니다.

 

이번 포스팅에서는

Dart의 null safety 개념과 활용법

예제와 함께 정리하겠습니다. 🚀

 


먼저

 

더 많은 정보, 혹은


순서대로 포스팅을 보고 싶다면


아래 노션을 확인해주세요. 

 



https://mongmung-i.notion.site/Flutter-1a39b1e2cdaa80319a0fc2a89281dc71?pvs=4

 

Flutter 어플 개발 일지 | Notion

Made with Notion, the all-in-one connected workspace with publishing capabilities.

mongmung-i.notion.site

https://mongmung-i.notion.site/19f9b1e2cdaa80a984ade6141a87fd29?pvs=4

 

창업 트랙 사전 캠프 𓆲 | Notion

이 곳은 창업 트랙 사전 캠프 진행 사항을 정리하는 곳입니다.

mongmung-i.notion.site

 

 


Ⅰ. 서론: null safety가 중요한 이유 🤔

 

null 값이란? null이 무엇을 의미하는가?

 

 

null(널)은

 '아무것도 없는 상태'를 

의미하는 특별한 값입니다.


Dart에서는 기본적으로 

모든 변수가 null 값을

 가질 수 없도록 설계되어 있지만,


명시적으로

nullable 변수(? 사용)를 선언하면

null을 허용할 수 있습니다.

 

 

💡 null 값은 언제 발생할까?

변수가 초기화되지 않은 경우
네트워크 요청에서 데이터가 없을 경우
데이터베이스에서 값을 가져오지 못한 경우

➡ null 값이 발생하면, 프로그램이 비정상적으로 종료될 위험이 있음! 🚨

 

예를 들어, 아래 코드에서 name 변수는

초기화되지 않았으므로 null 값을 가집니다.

void main() {
  String? name;
  print(name); // 출력: null
}

즉, null 값은 변수가 '아직 값이 할당되지 않은 상태'를 나타냄을 의미합니다.

 

null을 조심해야 하는 이유?

  • null 값을 잘못 사용하면 앱이 비정상적으로 종료될 수 있음
  • null을 예상하지 못하고 연산을 수행하면 NullPointerException이 발생할 수 있음
  • Flutter UI에서 null 값이 그대로 사용되면 빈 화면 또는 오류 발생 가능

 

💡 Dart에서는

이러한 문제를 해결하기 위해

null safety 기능을 제공하며,


null 값이 발생할 수 있는 상황을

미리 방지할 수 있도록 돕습니다. 🚀

 

이제 null safety 개념을 살펴보면서, 어떻게 null을 안전하게 다룰 수 있는지 알아보겠습니다! 🎯


null로 인한 오류 방지의 필요성

 

null 값이 포함된 변수를 잘못 참조하면 NullPointerException 발생
Dart의 null safety는 이러한 오류를 원천적으로 방지
Flutter 앱에서 안정적인 상태 관리를 가능하게 함

이제 Dart의 null safety 개념을 하나씩 살펴보겠습니다! 🎯


Ⅱ. 본론: Dart의 null safety 개념과 활용법 🏗️

 

Step 1: null safety란? (기본 개념 이해)

 

 

null safety란 

Dart에서 null 값을

 안전하게 다룰 수 있도록 

설계된 기능입니다.


기본적으로 모든 변수는 

null 값을 가질 수 없으며, 

null을 허용하려면

 ?를 사용해

 nullable 변수로 선언해야 합니다.



null safety가 없던 시절에는, 

변수를 선언하고 나서 

값이 초기화되지 않았거나,


네트워크 요청에서

 예상치 못한 null 값이 반환될 경우

 프로그램이 비정상적으로 

종료될 위험이 있었습니다.


Dart는 

이러한 문제를 해결하기 위해

 null safety를 도입하여

개발자가 명확하게

null을 다룰 수 있도록 했습니다.

 

 

Dart는 null safety를 통해 null 오류를 방지함
모든 변수는 기본적으로 null을 허용하지 않음 (non-nullable by default)

void main() {
  String text = null;  // ❌ 오류 발생 (null 할당 불가)
}

기본적으로 null을 허용하지 않으므로, null을 사용하려면 ?를 명시해야 함! 🎯

 

   명시를 안할 경우 아래와 같습니다. 

 

 

💡 왜 null safety가 중요한가?

  • 프로그램 실행 중 null 값이 발생하면 앱이 충돌할 가능성이 높음
  • null 안전성을 통해 컴파일러가 오류를 사전에 감지하여 앱을 더 안정적으로 실행할 수 있음
  • Flutter UI에서 null safety를 활용하면, NullPointerException을 방지하여 유지보수가 쉬워짐

 

Dart에서 null을 안전하게 다루려면 ?, !, ??, late 등의 키워드를 활용해야 합니다. 🚀


Step 2: nullable(?) vs non-nullable 변수

 

 

기본적으로 Dart의 모든 변수는

non-nullable(널을 허용하지 않음)입니다.


즉, null 값을 가지려면

?를 명시적으로 추가해야 합니다.

 

nullable 변수 (? 사용)

void main() {
  String? message = null; // ✅ null 할당 가능
  print(message); // 출력: null
}

  • nullable 변수는 null을 가질 수 있으며, 사용하기 전에 반드시 null 체크 필요

 

non-nullable 변수 (null 허용 X)

void main() {
  String message = 'Hello'; // ✅ null이 아닌 값만 할당 가능
  print(message);
}

 

  • non-nullable 변수는 반드시 초기화되어야 하며, null을 저장할 수 없음
  • 컴파일러가 null 할당을 막아주므로 안전한 코드 작성 가능

🚀 nullable 변수를 사용하면 null 값 처리를 명확하게 관리 가능! 🎯

 

💡 언제 nullable 변수를 사용해야 할까?

  • 네트워크에서 데이터를 받아올 때 (서버 응답이 없을 경우 null이 될 수 있음)
  • 사용자가 입력하지 않은 값을 미리 선언해야 할 때
  • 초기값 없이 선언하지만, 나중에 값이 설정될 경우

nullable 변수는 null 체크가 필수적이며, 안전한 코드 작성을 위해 ??, ??= 등의 연산자를 함께 사용해야 합니다. 🎯

 

 


null 값 다루기 (!, ??, ??= 연산자 활용) 보완 설명

 

 

Dart에서는 null 값을 다룰 때, 

다양한 연산자를 활용할 수 있습니다.


null safety를 효과적으로 사용하려면

 !, ??, ??= 연산자의 동작 방식을 이해해야 합니다.

 

 

✔ ! 연산자 (null이 아님을 보장할 때 사용)

void main() {
  String? name;
  print(name!.length); // ❌ 오류 발생 (name이 null일 경우 런타임 오류 발생)
}

 

  • ?? 연산자는 변수가 null이면 기본값을 제공하는 역할을 합니다.
  • UI에서 null 값을 표시할 때 기본 텍스트를 제공하는 용도로 자주 사용됩니다.

 

✔ ?? 연산자 (null이면 기본값 사용)

void main() {
  String? name;
  print(name ?? '기본 이름'); // 출력: 기본 이름
}

 

 

  • ?? 연산자는 변수가 null이면 기본값을 제공하는 역할을 합니다.
  • UI에서 null 값을 표시할 때 기본 텍스트를 제공하는 용도로 자주 사용됩니다.

 

✔ ??= 연산자 (null일 경우 새로운 값 할당)

void main() {
  String? message;
  message ??= '새로운 값'; // message가 null이면 '새로운 값' 할당
  print(message); // 출력: 새로운 값
}

 

  • ??= 연산자는 null일 경우 새로운 값을 할당하는데 유용합니다.

 

 

💡 null safety 연산자를 활용해야 하는 상황

  • 사용자 입력이 null일 경우 기본값을 제공 (??)
  • 변수 초기화가 확실하지 않은 경우 기본값을 설정 (??=)
  • 값이 null이 아닐 것이라고 확신하는 경우 (!) - 단, 사용 시 주의!

이 연산자를 적절히 사용하면 null로 인한 오류를 예방할 수 있음! 🚀

 


Step 4: late 키워드 사용법 (변수를 나중에 초기화하기) 보완 설명

 

late 키워드는 변수를 선언할 때

 즉시 초기화하지 않고, 

나중에 값을 할당할 수 있도록 

도와주는 기능입니다.


기본적으로 non-nullable 변수는

 반드시 초기화해야 하지만, 

Flutter UI에서는

 값이 나중에 설정되는 

경우가 많기 때문에

 late를 활용하면 유용합니다.

 

 

✔ late 변수 선언 후 나중에 값 할당

void main() {
  late String name;
  name = 'Flutter';
  print(name); // Flutter
}

 

  • late 키워드는 변수를 나중에 초기화할 필요가 있을 때 유용합니다.
  • 단, late 변수를 초기화하지 않고 사용하면 오류 발생합니다.

 

✔ 클래스에서 late 사용 예제

 

class User {
  late String name;

  void setName() {
    name = 'Alice';
  }

  void printName() {
    print(name);
  }
}

void main() {
  User user = User();
  user.setName();
  user.printName(); // Alice
}

late 선언 예제.txt
0.00MB

 

  • 클래스 내에서 변수를 미리 선언하지만, 실제 값은 특정 함수에서 설정하는 경우 유용합니다.

 

💡 late 키워드를 활용하는 경우

  • Flutter에서 UI 요소가 빌드된 후 값이 할당될 경우
  • 네트워크 요청을 통해 데이터를 받아온 후 변수를 설정할 경우
  • 초기화 시점이 중요할 때 (예: 사용자 로그인 후 값이 설정됨)

 

late를 적절히 활용하면 null safety를 유지하면서도 변수를 유동적으로 초기화할 수 있음! 🚀


Step 5: null safety를 활용한 안전한 코드 작성 보완 설명

 

Dart의 

null safety 기능을 잘 활용하면 

Flutter UI에서도 

안정적인 코드를 작성할 수 있습니다.

 

✔ 함수에서 nullable 변수를 다룰 때

String? getUserName() {
  return null;
}

void main() {
  String userName = getUserName() ?? 'Guest';
  print(userName); // Guest
}

  • ?? 연산자를 사용하여 null이 반환되면 기본값을 설정할 수 있습니다.

 

✔ Flutter UI에서 null safety 활용 예제

Widget build(BuildContext context) {
  String? title;
  return Text(title ?? '기본 제목'); // title이 null이면 기본 제목 출력
}
  • Flutter UI에서는 nullable 변수를 직접 사용하면 오류가 발생할 수 있으므로, 항상 기본값을 설정하는 것이 중요합니다.
  • 해당 코드는 Futter 프레임워크에서 제공하는 클래스 Flutter 관련 패키지를  import하지 않으면 정상적으로 작동하지 않습니다. 
  • dart pad에서는 작동하지 않습니다. 
  • null safety가 이런 형태라는 것만 아시면 좋을 것 같네요. 

 

 

💡 null safety를 활용하면 얻을 수 있는 장점

  • 앱이 예기치 않게 종료되는 상황을 예방
  • 컴파일러가 null 관련 오류를 사전에 감지하여 버그를 줄일 수 있음
  • Flutter UI에서 안정적인 상태 관리를 쉽게 구현할 수 있음

 

null safety를 적극 활용하면 코드 안정성과 유지보수성이 향상됨! 🚀


Ⅲ. null safety를 효과적으로 활용하는 방법 ✅

 

null 안전성을 고려한 코드 스타일

 

변수에 ?를 붙일지 여부를 명확하게 판단
null 값을 다룰 때는 ??, ??=, late를 적극 활용
null safety를 활용하여 안정적인 Flutter UI 구현


null safety를 사용하면 얻을 수 있는 장점

 

null 관련 오류 방지 → 앱 충돌을 최소화
Dart의 null safety는 성능 최적화에도 기여
Flutter 개발에서 UI 상태 관리가 쉬워짐

null safety를 적극 활용하면 코드 안정성과 유지보수성이 향상됨! 🚀

 

즉, Dart는 기본적으로

null을 허용하지 않습니다.

(non-nullable by default)

nullable 변수(?),

null 확인 연산자(??, ??=),

late 키워드를 활용하여

null 안전성 유지할 수 있습니다.

또한 

Flutter UI에서 null safety를 활용하면

앱 충돌을 방지하고

코드의 안정성을 높일 수 있습니다.

728x90
728x90