Flutter 스터디 21 Flutter 2.0과 Null safety 널 세이프티
조금 매운맛 리스트 내 뉴스 Flutter 2.0과 Null safety(널세이프티) pt1
Flutter 2.0
1. 구글이 폐기한 227개의 product는 모두 생산성을 담당
2. 전세계적으로 flutter 사용 중
3. 구글의 fuchsia의 푸시와 flutter의 의미
Flutter는 같은 코드로 mac, windows, linux, chrome 등 어떤 플랫폼을 통해서 배포하든 한결같은 UX 제공
- Null : 값이 아직 정해지지 않은 것
예시) Food favorite = null; = 좋아하는 음식이 없다.
food 타입의 변수명이 favorite인 변수
favorit 변수는 food 타입이면서 nullable 타입임
하지만 null은 음식값이 될수 없어서 오류를 야기함
그래서 주로 null 체크를 따로 하게 코딩함
하지만 이것을 매번 할 수 없음. 까먹을수도 있고.
이때 도입된 것이 Null Safety
- 변수를 생성할때 null 값을 절대 가질수 없게 Null Safety를 기본값으로 지정하자는 것
만약 Null Safety 안에서 int age를 생성했다면
age는 int 타입을 가져야하는 primitive 타입의 변수로써
int age; or int age =null;
위와 같이 선언할수 없게 됨
- 컴파일 단계에서 Null 값이 할당될수 없도록 해서 실행조차 못하게 하는 것
조금 매운맛 리스트 내 뉴스 Null safety(널세이프티) 완벽하게 이해하기
pt2
한번 정리
Null safety
1) 모든 변수는 null이 될 수 없으며, non-nullable 변수에는 null 값을 할당할 수 없음
2) non-nullable 변수를 위한 null .check가 필요 없음
3) "Class 내의 변수"는 반드시 선언과 동시에 초기화를 시켜야함
하지만 Food favorite = null; = 좋아하는 음식이 없다. 예시처럼 null 값이 필요할때가 있음
이처럼 개발 시에도 선언하자마자 할당되는 것이 아니라 나중에 할당되는 것이 있음
해결책 1) 타입 뒤 ?
int? age;
> ? : Nullable type 의미
즉, age는 Nullable type이다.
해결책 2) (나중에 변수값이 할당되는 경우) 타입 앞 late
class Person { //클래스 이름은 대문자.
String name = 'John';
late int age;
int sum(int age, int num){
this.age = age;
int total = age + num;
return total + age;
}
}
void main(){
Person p1 = new Person(); //Person : class, p1 : instance
print(p1.sum(100,50));
}
> 늦게 변수값을 초기화 하겠다.
해결책 3) nullable 변수가 항상 non-nullable value 값을 가질것이라고 확신이 든다면 nullable 변수에 ! 붙이기
void main(){
int x = 50;
int? y;
if(x>0){
y=x;
}
int value = y;
print(value);
}
> 이때 int value = y; 에서 y에 빨간줄 생김.
> nullable int 타입의 y 변수는 int 타입 value 변수에 할당될 수 없음
즉, nullable value 값은 non-nullable에 할당될 수 없음
int value = y!;
> y는 항상 non-nullable value 값을 가질 것이라고 ! (느낌표, Bang mark) 붙여주기
해결책 4) required
void main(){
print(add());
}
int add({int a, int b}){
int sum = a + b;
return sum;
}
> 오류 남.
> 왜냐하면 add 메소드의 인자값은 int 형으로 null 변수를 가질 수 없는 타입이기 때문
int add({required int a, required int b}){
> required 추가
> but 인자값 전달하라고 컴파일 에러 발생
void maint(){
print(add(a:null, b:3));
}
> 둘 중 하나라도 null 값 전달되면 컴파일 에러 발생
int add({required int? a, required int b}){
> ? 물음표로 null 값일 수 있다고 알려주면
> 또, null 값으로 덧셈연산 실행할 수 없기에 null 체크 필요
void main(){
print(add(a:null, b:3));
}
int add({required int? a, required int b}){
if (a==null){
return b;
}
int sum = a + b;
return sum;
}
> 끝.. 휴
문제 연습 1)
문제 2)
문제 3)
문제 4)
문제 5)
문제 6)
문제 7) Late and lazy
class Person{
int age = calculation();
void printAge(){
print('age');
}
}
int calculation(){
print('calculate');
return 30;
}
void main(){
Person p = Person();
p.printAge();
print(p.age);
}
> main에서 person 인스턴스 생성할 때, calculation 메소드도 호출 됨
만약 late를 추가하면
late int age = calculation();
> main에서 person 인스턴스 생성할 때, calculation 메소드는 실행되지 않음
age 변수가 처음으로 참조 될때 실행된다는 의미
Lazy initialization
변수의 초기화가 게으르게 또는 필요에 따라서 천천히 진행된다.
+ 개인적으로 공부했던 null safety
Flutter 4 클래스와 위젯, AppBar 아이콘 (null safety 조금)
순한맛 12 예시) 스마트폰 스마트폰을 만들려면 설계도가 필요 > 어느 곳에 어떤 부품이 들어가야 하면 어떤 기능이 들어가야할지 정확하게 설계되어야 함. > 이러한 설계도를 바탕으로 수천대의
kbagsa.tistory.com