코드팩토리의 플러터 프로그래밍 2판 책을 참고하여 공부용으로 작성한 게시글입니다.
📌 널 안정성
// 자료형? : null을 가질 수 있는 변수임을 명시
double? num1 = 1;
// ?가 붙지 않은 자료형에는 null 저장 불가능
double num2 = null; => 에러
// ?? : 변수의 값이 null일때만 뒤의 명령어 실행되도록 함
num1 ??= 3; //null 이 아니기 때문에 대입연산 실행안됨
num1 = null;
num1 ?? = 4; //null 이기 때문에 대입연산이 실행됨
print(num1) => 4
1. ?
: 널 타입 선언
// 변수가 null을 가질 수 있음을 선언
String? name; // name은 null일 수 있음
String title; // title은 반드시 non-null이어야 함
// 클래스의 속성에서도 사용 가능
class Person {
String? nickname; // null 가능
String lastName; // null 불가능
}
2. !
: 널이 아님을 보증
String? nullableName = "John";
String nonNullName = nullableName!; // "이 값은 절대 null이 아님을 보증합니다"
// 주의! null일 경우 런타임 에러 발생
String? dangerousName = null;
print(dangerousName!); // Runtime Error!
// 안전한 사용법
if (dangerousName != null) {
print(dangerousName!); // null 체크 후 사용
}
3. ??
: 왼쪽 값이 널이면 오른쪽 사용
// null일 경우 대체값 제공
String? name;
String displayName = name ?? "Guest"; // name이 null이면 "Guest" 사용
// 연쇄 사용 가능
String? first;
String? second;
String result = first ?? second ?? "Default";
4. ??=
: 왼쪽값이 널일때만 오른쪽 값 할당
// 값이 null일 때만 할당
String? name;
name ??= "John"; // name이 null이면 "John" 할당
print(name); // "John"
name ??= "Jane"; // name이 이미 null이 아니므로 할당되지 않음
print(name); // 여전히 "John"
5. ?.
: 왼쪽 값이 null 이아니면 객체의 속성에 접근
class User {
String? email;
}
User? user;
// null이 아닐 때만 속성 접근
print(user?.email); // user가 null이면 null 반환
// 체이닝 가능
class Address {
String? street;
}
class Person {
Address? address;
}
Person? person;
print(person?.address?.street); // 안전한 체인 접근
6. null 안전성 if 패턴 매칭문
if (someValue case var x?) {
// someValue가 null이 아니면 여기로 들어옴.
// non-null 값이 x에 대입됨
} else {
// someValue가 null이면 패턴 매칭이 실패해서 여기로 옴.
}
if (변수 case 매칭데이터자료형 변수?)
앞부분에 선언한 변수가 case 뒤의 변수에 대입되어서 타입이 확인된다.
패턴 매칭은 다음과 같이 쓰기도 한다.
if (shape case Circle(radius: var r) when r >= 5) {
// shape가 Circle 타입이고 radius가 5 이상이면 매칭
}
#코드팩토리의플러터프로그래밍2판 #공부용
'◼️Flutter' 카테고리의 다른 글
[Flutter Dart] if, switch, for, while (0) | 2025.01.25 |
---|---|
[Flutter Dart] is 연산자 타입 비교 (0) | 2025.01.25 |
[Flutter Dart] 컬렉션 Set (0) | 2025.01.25 |
[Flutter Dart] 컬렉션 Map (0) | 2025.01.25 |
[Flutter Dart] 컬렉션 List (0) | 2025.01.25 |