Gemini

null safety 는 null값을 참조할 수 없도록 하는것!

 

만약 null값을 참조한다면 런타임에러가 발생 즉, 앱을 사용중에 에러가 난다는 뜻

컴파일할 때 잡는게 중요해

nullsafety가 하는 일이다

 

null safety가 없는 코드

bool isEmpty(String string) => string.length == 0;

main(){

 isEmpty(null);

}

결과 -> NoSuchMethodError

 

다트에서는 어떤 변수가 null이 될수 있을을 정확히 표시해야함

void main(){

 String? name = 'name'; // String?은 nullable이라 칭함, 즉 string이 될수도 있고 또는 null이 될수있

 name = null;

 

 if(name != null){

  name.isNOtEmpty;

 }

 // 위의 코드를 이렇게 바꿀수 있음

 //name?.isNotEmpty;

 

}

컴파일러에서 name이 null이 될 수도 있다는걸 알게되

 

결론적으로 어떤 데이터가 null일때 참조하지 않도록.

 

 

✅ 예제 먼저 보기

String? name = null; print(name?.isNotEmpty); // 출력: null

🔍 해석

📌 1. ?.는 "null이면 넘겨"라는 뜻

  • name?.isNotEmpty는 이렇게 읽어요:

"name이 null이 아니면 → isNotEmpty 실행
name이 null이면 → 그냥 null 반환"


📌 2. isNotEmpty는 뭐야?

  • isNotEmpty는 String에 있는 속성이에요.
  • "hello".isNotEmpty → true
  • "" (빈 문자열).isNotEmpty → false

📌 3. 그런데 name이 null이면?

  • 그냥 name.isNotEmpty를 쓰면, null일 때 에러 납니다!
String? name = null; print(name.isNotEmpty); // ❌ 런타임 에러! name이 null이니까

📌 그래서 Dart에서는 안전하게 이렇게 씁니다:

name?.isNotEmpty
  • name이 null이면 → null 반환 (에러 ❌)
  • name이 문자열이면 → isNotEmpty 결과(true/false) 반환

💡 요약 표

코드의미결과
name?.isNotEmpty name이 null 아니면 isNotEmpty 실행 null 또는 true/false
name.isNotEmpty name이 null이면 에러! 런타임 에러 가능
 

🧪 실습 예제

void main() {
 String? name;
 
// name이 null → 결과도 null
 print(name?.isNotEmpty); // 출력: null
 
 name = '';
 print(name?.isNotEmpty); // 출력: false
 
 name = 'Dart';
 print(name?.isNotEmpty); // 출력: true
}

📌 결론

표현의미
?. null이면 그냥 null 반환해줘
isNotEmpty 문자열이 비어 있지 않으면 true

 

 

dynamic이 정말 꼭 필요한 순간은 "타입을 컴파일 시점에 미리 알 수 없을 때",
즉, 런타임에 타입이 결정되는 경우에 써야함

 

dynamic은 어떤 타입이든 담을 수 있는 변수를 말함

🧠 대표적인 예시 3가지

📌 1. JSON을 다룰 때 (API 응답)

import 'dart:convert';
 
void main() {
 String jsonStr = '{"name": "ha", "age": 20}';
 dynamic data = jsonDecode(jsonStr); // dynamic으로 나옴
 
 print(data['name']); // "ha"
 print(data['age']); // 20
}
  • JSON의 구조는 코드를 짤 때는 모름
  • 실제 앱이 실행되고 나서 서버에서 뭘 보내줄지 정해짐
  • 그래서 dynamic을 써야 에러 없이 처리 가능

 

📌 2. 정말 다양한 타입이 섞인 리스트

List<dynamic> mixed = ['hi', 123, true, 3.14];
for (var item in mixed) {
 print(item.runtimeType); // 각각의 타입을 실행 중에 확인
}
  • 여기서는 String, int, bool, double 다 섞여 있음
  • 어떤 타입이 들어올지 모를 때는 List<dynamic>이 유일한 선택

 

📌 3. 플러터 위젯에서 타입을 모르고 받아야 할 때

void printAnything(dynamic input) {
 print(input);
}
  • 이건 모든 타입을 받아야 할 때 (디버깅용, 로깅용 등)
  • String, int, List, Widget 등 다 받을 수 있어야 함
  • Object도 되지만, dynamic은 타입 검사 없이 자유롭게 쓸 수 있음

 

+ Recent posts