Gemini
전체 글
- Ai 2025.09.25
- Dart 문법 Nullable Variables 2025.06.02
- Dart 문법 Dynamic Type 2025.06.02
Ai
2025. 9. 25. 23:14
Dart 문법 Nullable Variables
2025. 6. 2. 19:38
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 |
Dart 문법 Dynamic Type
2025. 6. 2. 19:16
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은 타입 검사 없이 자유롭게 쓸 수 있음