3. • 목 적 : Flutter가 만들어진 이유와 중요한 개념인 Null safety를 이해할 수 있다.
4. 0.1. Fuchsia 프로젝트
- 구글의 안드로이드, 크롬 OS에 이은 차세대 OS
- Zircon 마이크로 커널을 기반
- 2016년 공식 발표 없이 Github에 코드 게시
0.1.1. Fuchsia란
5. 0.1. Fuchsia 프로젝트
- OS의 핵심 기능(프로세스, 메모리, 파일 시스템, 입출력, 프로세스 간 통신)을 관리하는 곳
0.1.2. Kernel
단일 커널(Monolithic kernel) 마이크로 커널(Micro kernel)
설명 모듈들이 구분 없이 하나로 구성되어 있는 구조
프로세스 관리, 메모리 관리 등과 같이 반드시 커널에
있어야 하는 기능만 모듈로 남아 있는 구조
장점 모듈 간의 통신비용이 줄어 효율적인 운영이 가능
- 커널이 가벼움
- 서버 개발이 용이
- OS의 기능 변경이 쉬움
- 실시간 시스템에 활용하기 좋음
단점
- 버그나 오류 처리의 어려움
- 업데이트 시간이 오래 걸림
- 다양한 환경의 시스템에 적용이 힘듦
- 크고 복잡한 현대의 OS에 적합하지 않음
- 단일 커널보다 속도가 느림
- 프로세스 간 통신 발생을 최소화하여야 함
예시 Android → 안드로이드 파편화 Fuchsia
6. 0.1. Fuchsia 프로젝트
0.1.3. Fuchsia의 등장 이유
- IoT(Internet of Things)를 고려하여 만들어진 OS
- 스마트폰, 컴퓨터 등 모든 OS를 하나로 통합 (범용 오픈 소스 운영 체제)
- 음성 명령에 최적화 (RTOS: Real Time Operating System) → AI 음성
cf. Android: 터치 디스플레이에 최적화
- 안드로이드의 파편화
7. 0.1. Fuchsia 프로젝트
0.1.4. 안드로이드의 파편화
- 파편화(Fragmentation): 기기의 앱 구동 환경이 제각각 분열되어 있는 것
- 하드웨어와 OS 버전의 다양성이 많지 않은 iOS에 비해 파편화 정도가 심함
- 여러가지 문제를 일으킴
e.g., 기기의 다양성으로 인한 UI 해상도 문제
<안드로이드의 파편화>
https://brunch.co.kr/@mobiinside/893
8. 0.2. Flutter
0.2.1. Flutter 소개
- 구글에서 2018년 새롭게 소개된 크로스 플랫폼 모바일 앱 개발 프레임워크
- Fuchsia의 사용자 인터페이스와 애플리케이션을 만들기 위해 사용
- 프로그래밍 언어로는 Dart를 사용
- 인터페이스와 사용자 경험을 하나로 통일 → 자동으로 인터페이스 렌더링
- Flutter 홈페이지: https://flutter.dev/
9. 0.2. Flutter
0.2.2. Flutter의 특징
- 컴포넌트와 유사하게 뷰를 묘사하는 다트 클래스로는 위젯이 있다.
- 다트 언어의 경우 컴퓨터로 앱을 개발 할 때 JIT(Just In Time) 컴파일러를 사용해
실시간으로 코드를 컴파일하고 실행할 수 있다. → hot reload
10. 0.3. Null safety
0.3.1. Null
void whatIsYourFood(Food f){
if(f==null){
print('need a food name');
}else{
String cooker = f.recipe.toString();
print(cooker);
}
}
- 아직 값이 정해지지 않은 것
→ 번거로움 그렇지만 if를 집어넣지 않으면 에러가 뜰 수 있음
→ 음식의 이름이 null로 되면 안되기 때문
11. 0.3. Null safety
0.3.2. null safety
- 모든 변수는 null이 될 수 없으며, non-nullable 변수에는 null값을 할당할 수 없음
- non-nullable 변수를 위한 null check가 필요 없음
- Class 내의 변수는 반드시 선언과 동시에 초기화를 시켜야 함
→ null값이 없으면 어떻게 표현해야 되나?
→ 그리고 변수의 값이 선언하자마자 할당되는 것이 아니라 나중에 할당하는 경우는 어떻게
해야 되나?
12. 0.3. Null safety
0.3.2. null safety의 구체적인 예시
0.3.2.1. null aware operator - ?
class Animal{
String? name;
}
void main(){
Animal animal = Animal();
print(animal.name);
}
- 선언과 동시에 값을 할당하지 않을 때 사용
- 값을 초기화 하지 않아도 에러 없음
- 초기화 하지 않으면 null로 자동 초기화
13. 0.3. Null safety
0.3.2. null safety의 구체적인 예시
0.3.2.2. null assertion operator - !
void main(){
int x = 50;
int? y;
if (x > 0){
y = x;
}
int value = y!;
print(value);
}
- 코드의 흐름상 null이 아님을 확신할 수 있을 때만 사용
- 잘못 사용하면 런타임 에러 발생
14. 0.3. Null safety
0.3.2. null safety의 구체적인 예시
0.3.2.3. late initialized - late
class Animal{
late String name;
}
void main(){
Animal animal = Animal();
animal.name = "rabbit";
print(animal.name);
}
- 선언과 동시에 값을 할당하지 않을 때 사용
- late로 선언된 변수는 이용하기 위해 나중에 초기화를 해야 함
15. 0.3. Null safety
0.3.2. null safety의 구체적인 예시
0.3.2.3. late initialized - late
late를 사용하지 않았을 경우 late를 사용했을 경우
class Person{
int age = calculation();
void printAge(){
print('age'); // 2
}
}
int calculation(){
print('calculate'); // 1
return 30; // 3
}
void main(){
Person p = Person();
p.printAge();
print(p.age);
}
class Person{
// lazy initialization
late int age = calculation();
void printAge(){
print('age'); // 1
}
}
int calculation(){
print('calculate'); // 2
return 30; // 3
}
void main(){
Person p = Person();
p.printAge();
print(p.age);
}
- 상용하지 않을 수도 있는 함수를 미리 사용하지 않게 함
16. 0.3. Null safety
0.3.2. null safety의 구체적인 예시
0.3.2.4. not optional - required
void main(){
print(add(a:8, b:32));
}
int add({required int a, required int b}){
int sum = a + b;
return sum;
}
- 함수에서 named, optional parameter을 설정할 때 non-nullable로 지정하기 위해 사용
- 타입 앞에 붙여서 사용함
추가 null-safety 예시: https://dart.dev/codelabs/null-safety