flutter에서는 Null safety를 지원하는 dependency를 사용하게 된다.
Null 아직 값이 정해지지 않은 것
Dart 예측 불가능한 결과를 내지 않는다. 항상 결과 값이 있다.
변수들은 null 값을 가질수 없다. 변수를 생성할때 Null safety를 기본값으로 설정한다.
int age; 또는 int age = null; 안됨
- 모든 변수는 null이 될 수 없으며, non-nullable(null을 허용하지 않는 자료형) 변수에는 null 값을 할당할 수 없다.
- 변수에 값이 할당되기 전까지는 참조해서 사용할수 없다.
- non-nullable 변수를 위한 null check가 필요 없다.
- Class 내의 변수는 반드시 선언과 동시에 초기화를 시켜야함
class Person(
int age; //오류. 변수가 초기화 안됨.
int age = 20;//변수 초기화 됨.
)
변수 초기화 상태. 오류 없음
class Person {
String name;
String nameChange(String name){
this.name = name;
return name.toUpperCase();
}
}
void main(){
Person p = Person();
//p.name = 'james';
print(p.nameChange(p.name));
}
Person 클래스에 name 변수가 참조되기 전에 어떠한 값도 할당받지 않았기 때문에 print(p.nameChange(p.name));오류가 난다.
class Person {
String name;
String nameChange(String name){
this.name = name;
return name.toUpperCase();
}
}
void main(){
Person p = Person();
//if문으로 null check
if(p.name == null){
print('need a name')
}else{
print(p.nameChange(p.name));
}
}

name은 클래스 안에 있는 인스턴스 변수이므로 선언후에 바로 초기화를 해주어야 한다.
변수 초기화를 위해서 생성자를 만들어 주거나 'late' 키워드를 붙여준다.
p 연산자인 p.name이 null 값을 가질수 없으므로 이 연산은 항상 false가 된다.
조건문의 의미가 없으니 수정하거나 통째로 삭제하는게 좋다.
하지만 Null safety 기능에서도 변수에 null 값을 허용할 수가 있다.
Null safety가 기본값으로 설정되어 있지만 변수를 선언 할 때에 컴파일러에게 변수에 null이 들어올수 있게 선언하는 방법이 있다.
class Person {
//타입뒤에 ?를 붙이면 String 값 또는 null 값이 들어올수 있다
String? name;
String nameChange(String name){//에러. 인자값으로 String만 받을수 있음. String과 null 안됨.
}
String nameChange(String? name){//허용
this.name = name;
return name.toUpperCase();//에러. name에 null은 들어올수 있지만 null은 호출 될 수 없음.
//허용. name을 null check
if(name == null){
print('need a name')
}else{
return name.toUpperCase();
}//if end
}//nameChange end
}//class end
void main(){
Person p = Person();
if(p.name == null){
print('need a name')
}else{
print(p.nameChange(p.name));
}
}
class Person {
int age; //초기화 하지 않았기 때문에 에러.
int sum(int age, int num){
this.age = age;
int total = age + num;
return total+age;
}
}//class end
void main(){
Person p = Person();
print(p.sum(100, 50));
}
main 함수에서 p 인스턴스가 생성되고 이를 통해서 호출된 sum 함수가 print 함수로 출력될때 age 변수에 값이 100으로 할당되고 있다.
선언과 동시에 변수값이 할당되어야 하는게 아닌 나중에 할당되어야 한다.
이럴땐 변수의 타입 앞에 late 키워드를 넣어주면 된다.
class Person {
late int age; //허용.
int sum(int age, int num){
this.age = age;
int total = age + num;
return total+age;
}
}//class end
void main(){
Person p = Person();
print(p.sum(100, 50));
}
void main(){
int x = 50;
int? y;
if(x > 0){
y=x;
}
int value = y; //에러.
int value = y!; //허용
print(value);
}
int타입의 value 변수에 y 변수를 넣지 못한다. nullable value 값은 non-nullable value 값에 할당이 될수 없음.
즉, null값을 허용하는 y변수는 기본적으로 null safety가 되어있는 value 변수에 들어갈수가 없다.
그래서, value 변수에 있는 nullable 변수인 y는 항상 non-nullable(null을 허용하지 않는 자료형) value값을 가질것이라 선언해야 한다.
nullable 변수가 항상 non-nullable(null을 허용하지 않는 자료형) 값을 가진다는 확신이 있다면 nullable 변수에 !을 추가해주면 된다.
void main(){
print(add());
}
//오류
int add({int a, int b}){
int sum = a+b;
return sum;
}
add 함수의 인자값은 int형으로 null 변수를 가질수 없다.
void main(){
print(add(a: 4, b: null));
}
int add({required int a, required int b}){
int sum = a+b;
return sum;
}
add 함수의 인자값 앞에 required를 붙이면 add 함수에 반드시 인자값을 전달해주어야 하기 때문에 컴파일 에러.
add 함수에 인자 값중에 하나만 전달되거나, 둘중 하나라도 null값이 전달되어도 컴파일 에러.
void main(){
print(add(a: 4, b: null));
}
int add({required int? a, required int b}){
int sum = a+b;
return sum;
}
add 함수 a 타입에 ?을 넣어주면 null 값으로는 덧셈 연산을 할 수 없기때문에 에러.
void main(){
print(add(a:null, b:5));
}
int add({required int? a, required int b}){
if(a == null){
return b;
}
int sum = a+b;
return sum;
}
a 변수가 null이면 b만 반환하라는 조건값이 들어가면 오류 없음.
'flutter' 카테고리의 다른 글
| [flutter] Collection과 Generic (0) | 2024.01.24 |
|---|---|
| [flutter] Navigator (0) | 2024.01.22 |
| [flutter] Column Widget과 Row Widget (0) | 2024.01.22 |
| [flutter] Container widget (0) | 2024.01.22 |
| [flutter] toastMessage (0) | 2024.01.21 |