iOS 하다가 플러터를 하려니 새삼 다른 개념들에 눈이 휘둥그레 !
그래도 같은 모바일 앱 생태계니 스위프트 코드랑 비슷하겠거니 생각했는데..
다트로 구성된 코드를 처음 봤을 때의 느낌 :
좀. 너무 어색했다. 그.. 형태도 좀 이상하고 왜 문장 끝에 ; 를 써요.. void main 이 뭐에요....이거 완전 옛날 언어 아니야~~!? 라는 생각을 햇습니다... 최신인데도...ㅜㅜ ㅋㅋㅋ
그러니까 이게 뭔지 좀 짚고 가보자. 플러터/다트가 뭐고 얘네 특징이 뭔지
플러터
한 번의 코딩으로 여러 플랫폼에서 작동하는 애플리케이션을 개발할 수 있게 해주는 SDK로,
무려 '구글'에서 만든거다.
대신 네이티브와 같은 퍼포먼스를 이끌어내지 못한다. 네이티브에서 쓸 수 있었던 기능도 제한되고, 네이티브에서 신기술이 나와도 바로 차용하지 못한다 (멀티 플랫폼을 구현하는 친구들의 유구한 단점들임)
대신에 플러터는 쉽고 빠르게 구현이 가능하다고 한다
강사님의 말을 빌리자면
플루터는 70점 짜리의 퍼포먼스의 앱을 만들 수 있다. 아주 빠르고 쉽게
라고 하셨다.
너무 매력적인듯함. 아주 나에게 딱맞음
다트
이게 이제 플러터에서 쓰는 언어인데
이 친구 신기한 점들이 있다.
1) AOT 와 JIT 컴파일 방식을 모두 쓴다.
스위프트도 이래서 익숙했는데 이게 뭔지 자세히 설명하자면
JIT(Just-In-Time) 컴파일
JIT 컴파일은 프로그램 실행 중에 코드가 컴파일되는 방식이야. Java, C#, JavaScript 등이 있음
JIT의 장점
즉시 반영: 코드 수정 후 애플리케이션을 다시 시작하지 않고도 변경 사항을 즉시 반영할 수 있어 (ex. 플러터 핫 리로드)
디버깅 용이성: 개발 중에 실행 중인 애플리케이션을 바로 디버깅할 수 있어. 코드를 수정하고 바로 실행 결과를 확인하면서 문제를 빠르게 해결할 수 있음
AOT(Ahead-Of-Time) 컴파일
AOT 컴파일은 프로그램이 실행되기 전에, 즉 빌드 타임에 코드가 미리 컴파일되는 방식이야. C, C++, Rust, Swift 빌드 후 등등이 있음
AOT의 장점
빠른 실행 시간: 코드가 미리 컴파일되어 있어서, 애플리케이션이 실행될 때 바로 실행할 수 있어. 이는 초기 실행 시간을 크게 단축시켜.
최적화된 성능: AOT 컴파일러는 코드 최적화를 빌드 타임에 수행하기 때문에,실행 속도와 성능을 높여줌
2) Null Safety 하다
널 세이프티..가 먼데? -? 하신다면
Null Safety는 변수에 null 값을 허용하지 않음으로써 null 참조 오류를 방지하는 프로그래밍 언어의 기능이자 특징임
보통 변수는 이렇게 세개의 경우가 있어 -> 값이 있을 때 / 값이 없을 때 / 값 자체를 가지고 있지 않을때(NULL)
근데 이렇게 세개를 가지고 있으면 개발자가 휴먼 에러를 내기 너무 쉽잖아? 그래서 변수에 NULL값을 허용하지 않음으로써 ! NULL 참조오류를 방지한다 ! 라고 볼 수가 있습니다 ~
(근데 이것 때문에 더 복잡해진면도 있다고 생각함...)
아무튼, 이 null Safety 개념이 Dart의 late의 개념과 아주 밀접하게 적용되어있는데
코드를 봅시다.
late String description;
void main() {
description = "This is a description.";
print(description);
}
변수를 선언할 때 즉시 초기화할 수 없는 상황이 있어용. 이럴 때 late 키워드를 사용하면, 변수를 null로 초기화하지 않고 나중에 초기화할 수 있음!
이렇게 하면 null safety를 유지하면서도 초기화 시점을 제어할 수 있다~ 이말이에요
나는 Swift를 하다 와서 그런가 Swift의 lazy 와 혼동되더라구
둘의 차이점을 비교해보자면 ~
- Dart late: 변수를 나중에 초기화할 수 있도록 하여 null safety를 유지하는 데 사용돼. 변수를 명시적으로 초기화하는 시점을 제어할 수 있어.
- Swift lazy: 변수를 처음 접근할 때 초기화하여, 초기화 비용이 큰 작업을 지연시키는 데 사용돼. 초기화가 필요할 때까지 실행을 미루는 방식이야.
이 두 키워드는 각각의 언어에서 변수 초기화 시점을 제어하는 유사한 목적을 가지지만, 사용 목적과 동작 방식에서 차이가 있어. Dart의 late는 null safety와 밀접하게 연관되어 있으며, Swift의 lazy는 주로 초기화 비용을 지연시키기 위해 사용돼.
더 쉽게 말하면
- Swift의 lazy: 필요할 때까지 기다렸다가 변수를 만들어요.
- Dart의 late: 나중에 변수를 만들겠다고 약속해요.
3) 병렬처리
Dart는 단일 스레드 사용을 기본적으로 생각한다는거야 !!
왜냐면 굳이 스레드를 여러가지를 쓰는 코드를 써도 그만큼의 퍼포먼스가 안나오기 떄문에 ㅋㅋ
Concurrency를 진행할때도(isolate라는 코드이용) 단일 코어에서 빠르게 작업을 전환해서 병렬처리처럼 보이게 한다는 것이 너무 신기했음
Swift와 좀 다르지..
둘을 비교한다면
다트는 스레드를 직접 사용하지 않고 독립된 메모리 공간을 가진 isolate로 작업을 처리한다면,
스위프트는 시스템이 관리하는 작업 큐(GCD)를 통해 멀티스레딩을 구현해.
GCD(grand Central Dispatch)가 뭐냐
개발자는 GCD를 통해 작업 큐에 작업을 추가하고,
시스템이 스레드 관리를 하도록 맡겨.
시스템이 스레드 풀을 관리하고, 작업을 효율적으로 실행해.
개발자가 스레드를 직접 생성하고 관리하지 않음으로써, 복잡한 스레드 관리 작업을 피할 수 있어.
따라서, GCD를 사용하면 개발자가 직접 스레드를 관리하는 것처럼 보일 수 있지만, 실제로는 시스템이 대부분의 스레드 관리 작업을 수행해. 개발자는 작업을 큐에 추가하고, 동기화 문제를 처리하는 데 집중하면 돼
이러한 ~ 특징점들이 있었다.
재밌습니다. 앞으로 플러터가 보여줄 아키텍쳐들과 무궁무진한 코드들이
궁금?안궁금?궁금?합니다 ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ
'Flutter > Flutter' 카테고리의 다른 글
mainColor를 const로 고정해주고 싶었을 뿐인데 (0) | 2024.08.30 |
---|---|
위젯 만들 때 마다 계속 나오는 @override와 super.key는 뭐지? (2) | 2024.08.26 |
왜 자꾸 const를 쓰라고 하는거지? (0) | 2024.08.26 |
1. Postman 사용해보기 (0) | 2024.08.21 |
개발자의 스레드 관리는 비효율적 in 플러터 (2) | 2024.08.21 |