널 세이프티(Null Safety)는 개발자가 널 에러를 피할 수 있도록 도와주는 다트 프로그래밍 언어의 기능입니다.
이 기능은 사운드 널 세이프티 인 다트(Sound Null Safety in dart)라고 불리며, 이를 통해 개발자는 코드 작성 시점에 널 에러를 잡을 수 있습니다.
1. Null Safety란?
- Null Safety는 Dart 언어의 기능으로, null로 인해 발생할 수 있는 오류를 방지합니다.
- Sound Null Safety:
- Dart 컴파일러가 코드 분석 시, null이 될 수 있는 타입과 null이 될 수 없는 타입을 엄격하게 구분합니다.
- 컴파일 단계에서 null 관련 에러를 확인하므로 런타임 중 발생할 수 있는 Null Pointer Exception을 예방합니다.
Sound Null Safety in dart 이란 (Sound Type System)
런타임 중에 null 포인터 예외를 방지하기 위해 Dart 컴파일러가 코드를 분석하고 컴파일할 때 타입 시스템에서 엄격한 규칙을 적용하는 것을 의미합니다.
정리하면, Dart 컴파일러가 코드를 분석하고, null이 될 수 있는 타입과 null이 될 수 없는 타입을 분명히 구분해 주기 때문에, 우리가 실수로 null을 넣거나 반환하게 되면 빌드(컴파일) 시점에 오류를 발견할 수 있습니다.
이를 사운드 널 세이프티(Sound
런타임 중에 null 포인터 예외를 방지하기 위해 Dart 컴파일러가 코드를 분석하고 컴파일할 때 타입 시스템에서 엄격한 규칙을 적용하는 것을 의미합니다.
정리하면, Dart 컴파일러가 코드를 분석하고, null이 될 수 있는 타입과 null이 될 수 없는 타입을 분명히 구분해 주기 때문에, 우리가 실수로 null을 넣거나 반환하게 되면 빌드(컴파일) 시점에 오류를 발견할 수 있습니다.
이를 사운드 널 세이프티(Sound Null Safety)라고 하며, 런타임에서의 null 참조 에러 를 효과적으로 예방해줍니다.
2. 옵셔널 타입(Optional Type)
Dart에서는 null을 허용하는 타입과 허용하지 않는 타입을 명확히 구분합니다.
- Null 허용 타입: String?, int?, 등.
- ?를 붙여 해당 변수에 null을 할당할 수 있도록 표시합니다.
- Null 비허용 타입: String, int, 등.
- null 할당 불가.
? 옵셔널 타입
String? => String 옵셔널 타입은 String과 다름 null 허용됨
int, 등등 다른 데이터타입들또한 옵셔널 타입으로 사용할 수 있다.
void main() {
String name = '길동'; // null 불가
int age = 30; // null 불가
String? nullableName; // null 허용
int? nullableAge; // null 허용
print('name: ${name}');
print('age: ${age}');
print('nullableAge: ${nullableAge}'); // null 출력
}
//Null Safety 란?
// 개발자가 널 에러를 피할 수 있도록 도와주는 다트 언어에 기능이다.
//코드의 시작점
void main() {
String name = '길동';
int age = 30;
//String? 스트링 옵셔널 타입이다. => 스트링 타입이랑 다음
//옵셔널 타입은 null값 허용가능
String? nullableName;
int? nullableAge;
print('name : ${name}');
print('age : ${age}');
//print('nullableName : ${nullableName.length}'); 컴파일 시점에 오류를 미리 확인할 수 있다.
print('nullableAge : ${nullableAge}');
//방어적 코드
if (nullableName != null) {
print(nullableName.length);
}
} //end of main
자바와 다르게. 컴파일 시점에 오류가 먼저 확인되어지고, 자바에서 tryCatch나 방어적 코드 사용할 필요없이 ? 의 옵셔널을 사용하여 널을 안전하게 관리할 수 있음
4. Null 관련 주요 연산자
Dart에서는 null을 안전하게 다루기 위해 다음과 같은 연산자를 제공합니다.
4.1. 널 체크 연산자 (?.)
- 용도: 객체가 null인지 확인하고, null이 아닐 경우에만 프로퍼티나 메서드에 접근
- 예시
String? userName = null;
int? userNameLength = userName?.length; // null 체크 후 접근
print('사용자 이름 길이: ${userNameLength}'); // 출력: null
4.2. 널 병합 연산자 (??)
- 용도: 값이 null일 경우, 기본 값을 제공.
- 예시:
String? userName = null;
String finalUserName = userName ?? '홍길동'; // 기본값 '홍길동'
print('사용자 이름: ${finalUserName}'); // 출력: 홍길동
4.3. 널 체크와 병합 연산자 함께 사용
- 용도: null 여부 확인 후, 기본 값을 설정.
- 예시:
String? userName = null;
String upperOrNoName = userName?.toUpperCase() ?? 'No Name';
print('결과: ${upperOrNoName}'); // 출력: No Name
optional을 값을 가진 값의 ?. 로 객체에 접근할 경우, null 값이여도 문제없이 컴파일 에러에서 벗어날 수 벗어날 수 있음
?? 으로 해당 값이 null인 경우, default value값을 지정해서 넣을 수 있다.
//널 체크 연산자 (?.) 와 널병합연산자(??) 에 대해서 알아보자
//코드의 시작점
void main() {
//1. 널 체크 연산자
String? userName = getNullableUserName();
int? userNameLength = userName?.length; // null체크 연산자
print('사용자 이름의 길이 : ${userNameLength}');
print('0---------------------');
//2. 널 병합 연산자
String finalUserName = userName ?? '홍길동';
// userName의 값이 null인 경우, ?? 이후의 값을 default로 초기화됨
print('사용자 finalUserName : ${finalUserName}');
print('----------------------');
//3. ?. 와 ??를 함께 사용하는 예시
String upperOrNoName = userName?.toUpperCase() ?? 'upper';
print('?. 와 ?? 를 함께 사용 : ${upperOrNoName}');
} //end of main
//함수를 만들기
//선택적 명명 매개변수
String? getNullableUserName({String? name}) {
return name;
}
6. Java와의 차이점
- Java에서는 null 에러를 방지하기 위해 try-catch 또는 방어적 코드를 작성해야 하지만, Dart에서는 Null Safety를 통해 이러한 작업을 간소화할 수 있습니다.
- 옵셔널 타입(?)과 null 관련 연산자를 사용해 null 문제를 컴파일 단계에서 해결 가능합니다.
정리
- Null Safety는 Dart의 강력한 기능으로, 컴파일 단계에서 null 에러를 사전에 방지합니다.
- 옵셔널 타입(?), 널 체크 연산자(?.), 널 병합 연산자(??) 등을 사용하면, null 처리를 간결하고 안전하게 구현할 수 있습니다.
- Null Safety를 통해 런타임 에러를 줄이고 안정적인 애플리케이션을 개발할 수 있습니다.
이 글이 여러분의 Dart 개발에 도움이 되길 바랍니다! 😊
'Flutter' 카테고리의 다른 글
[Flutter 13] Null 억제 연산자(!) 와 late (0) | 2025.01.06 |
---|---|
[ Flutter] 안드로이드 스튜디오 flutter SDK 버전 바꾸기 (0) | 2025.01.06 |
[플러터 11] Dart 클래스와 인스턴스 (0) | 2025.01.03 |
댓글