Flutter 편집하기

귀하는 로그인되어 있지 않습니다. 이대로 편집하면 귀하의 IP 주소가 편집 기록에 남게 됩니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
4번째 줄: 4번째 줄:


2021년 3월 3일에 열린 Flutter Engaged 행사에서는 Flutter 2를 발표했다. 베타 상태였던 웹과 데스크톱 환경 개발을 정식으로 지원하는 것이 주요한 변화다. 데스크톱과 웹, 모바일을 연계해서 각각의 환경에 최적화된 기능을 제공하는 앱을 만들 수 있을 것으로 기대하고 있다. 특히 우분투 [[리눅스]] 개발사인 캐노니컬이 그동안 Flutter를 우분투에 포팅하기 위해서 공동 개발을 진행해 왔는데, 앞으로 우분투용 앱 개발을 위한 기본 도구로 Flutter를 쓸 것이라고 발표했다.<ref>[https://venturebeat.com/2021/03/03/google-launches-flutter-2-0-to-target-developers-across-all-platforms/ "Google launches Flutter 2.0 to target developers across all platforms"], VentureBeat, 3 March 2021.</ref> 또한 [[Dart]] 언어 차원의 [[널 안전성]] 지원도 공식화했다. 다만 이 때문에 [[널 안전성]]에 대비하지 않은 코드와 패키지들이 문제를 일으킬 수 있으므로 서둘러 기존 프로젝트를 Flutter 2로 이식하려고 하지 말고 [[Dart]]의 [[널 안전성]] 지원을 충분히 이해하고 패키지들이 안정화될 때까지 기다릴 필요가 있다.
2021년 3월 3일에 열린 Flutter Engaged 행사에서는 Flutter 2를 발표했다. 베타 상태였던 웹과 데스크톱 환경 개발을 정식으로 지원하는 것이 주요한 변화다. 데스크톱과 웹, 모바일을 연계해서 각각의 환경에 최적화된 기능을 제공하는 앱을 만들 수 있을 것으로 기대하고 있다. 특히 우분투 [[리눅스]] 개발사인 캐노니컬이 그동안 Flutter를 우분투에 포팅하기 위해서 공동 개발을 진행해 왔는데, 앞으로 우분투용 앱 개발을 위한 기본 도구로 Flutter를 쓸 것이라고 발표했다.<ref>[https://venturebeat.com/2021/03/03/google-launches-flutter-2-0-to-target-developers-across-all-platforms/ "Google launches Flutter 2.0 to target developers across all platforms"], VentureBeat, 3 March 2021.</ref> 또한 [[Dart]] 언어 차원의 [[널 안전성]] 지원도 공식화했다. 다만 이 때문에 [[널 안전성]]에 대비하지 않은 코드와 패키지들이 문제를 일으킬 수 있으므로 서둘러 기존 프로젝트를 Flutter 2로 이식하려고 하지 말고 [[Dart]]의 [[널 안전성]] 지원을 충분히 이해하고 패키지들이 안정화될 때까지 기다릴 필요가 있다.
2022년 5월 11일에는 Flutter 3을 발표했다. macOS와 [[리눅스]]를 안정 버전으로 지원하며 특히 macOS는 인텔 CPU와 애플 실리콘 양쪽 모두를 네이티브로 지원할 수 있게 되었다. 또한 캐주얼 게임을 지원함으로써 모바일, 데스크톱, 웹에 이르는 플랫폼의 캐주얼 게임을 단일 소스코드로 만들 수 있다. 구글은 핀볼을 비롯한 몇 가지 샘플 게임을 직접 해볼 수 있도록 제공하고 있다.


Flutter 2부터는 [[Dart (프로그래밍 언어)#널 안전성|Dart의 널 안전성]]을 지원하며, Flutter 2.2부터는 새로운 프로젝트를 만들면 널 안전성을 적용한 코드가 만들어진다.
Flutter 2부터는 [[Dart (프로그래밍 언어)#널 안전성|Dart의 널 안전성]]을 지원하며, Flutter 2.2부터는 새로운 프로젝트를 만들면 널 안전성을 적용한 코드가 만들어진다.
13번째 줄: 11번째 줄:
===기기에 독립된 사용자 인터페이스===
===기기에 독립된 사용자 인터페이스===


지금까지 모바일을 겨냥한 [[크로스 플랫폼]] [[프레임워크]]는 [[아파치 코르도바]]처럼 웹 뷰를 사용하되 여기에 사용되는 자원을 각 기기에 미리 심는 방식, 즉 앱이 로컬 웹 서버로 돌아가도록 해서 웹 앱보다는 빠르고 OS 관계 없이 똑같은 인터페이스를 제공하거나<ref>하지만 운영체제의 기본 웹브라우저를 사용하므로 웹브라우저에 따라 모양이 좀 다를 수는 있다.</ref>, 리액트 네이티브나 [[자마린]]처럼 각 OS의 네이티브 기능을 최대한 활용해서 인터페이스는 조금 차이가 나지만 빠른 속도를 추구하는 방법이 있는데, Flutter는 이들 둘과는 아예 다르다. 각 OS의 네이티브 그래픽 기능을 최대한 활용하되 각 OS의 유저 인터페이스를 무시하고 몽땅 Flutter가 자체 제공한다. 즉, 각 OS는 그림 그릴 캔버스만 제공하고 그 위에 뭘 표현할지는 Flutter의 렌더링 엔진인 Skia<ref>Skia는 Flutter의 전유물은 아니다. 별도의 프로젝트로 운영하고 있으며, 크롬, 크롬OS, 안드로이드도 사용하고 있으며 구글 바깥에서도 파이어폭스, [[리브레오피스]] 같은 소프트웨어가 그래픽 렌더링에 Skia 엔진을 사용하고 있다.</ref>가 다 그려버리는 것. 그 때문에 OS에 관계 없이 똑같은 모습의 유저 인터페이스를 제공한다. Flutter는 두 가지 인터페이스 디자인을 기본 제공한다. OS에 따라 디자인을 달리 하는 것도 가능해서 안드로이드에서는 머티리얼, iOS에서는 쿠퍼티노 인터페이스<ref>[[애플]]이 아니라 [[구글]]에서 자사의 머티리얼 디자인과 구별하기 위해 붙인 이름이다. 애플 폰사가 쿠퍼티노에 있기 때문에 이런 이름을 붙였다.</ref> 를 사용하는 식으로 할 수도 있고 그 반대로도 할 수 있다! 같은 앱에서 입맛에 맞게 어떤 부분은 머티리얼, 어떤 부분은 쿠퍼티노 디자인을 적용할 수도 있다. 다만, 똑같은 기능을 하는 인터페이스라고 해도 모양이나 크기가 다를 수 있으므로 이를 감안해야 한다. 네이티브 UI를 활용하는 것에 비해서 속도 면에서 불리하지 않은가 싶을 수 있는데 테스트 결과를 보면 상당히 준수하게 나온다. 렌더링 엔진인 Skia는 [[C++]]로 구현했는데 최적화를 무척 잘 했는지 성능이 아주 좋다. 그리고 지금도 계속 최적화를 하고 있어서 업데이트 될 때마다 어느 정도나 성능을 향상시켰는지 공지한다.
지금까지 모바일을 겨냥한 [[크로스 플랫폼]] [[프레임워크]]는 [[아파치 코르도바]]처럼 웹 뷰를 사용하되 여기에 사용되는 자원을 각 기기에 미리 심는 방식, 즉 앱이 로컬 웹 서버로 돌아가도록 해서 웹 앱보다는 빠르고 OS 관계 없이 똑같은 인터페이스를 제공하거나<ref>하지만 운영체제의 기본 웹브라우저를 사용하므로 웹브라우저에 따라 모양이 좀 다를 수는 있다.</ref>, 리액트 네이티브나 [[자마린]]처럼 각 OS의 네이티브 기능을 최대한 활용해서 인터페이스는 조금 차이가 나지만 빠른 속도를 추구하는 방법이 있는데, Flutter는 이들 둘과는 아예 다르다. 각 OS의 네이티브 그래픽 기능을 최대한 활용하되 각 OS의 유저 인터페이스를 무시하고 몽땅 Flutter가 자체 제공한다. 즉, 각 OS는 그림 그릴 캔버스만 제공하고 그 위에 뭘 표현할지는 Flutter의 렌더링 엔진인 skia가 다 그려버리는 것. 그 때문에 OS에 관계 없이 똑같은 모습의 유저 인터페이스를 제공한다. Flutter는 두 가지 인터페이스 디자인을 기본 제공한다. OS에 따라 디자인을 달리 하는 것도 가능해서 안드로이드에서는 머티리얼, iOS에서는 쿠퍼티노 인터페이스<ref>[[애플]]이 아니라 [[구글]]에서 자사의 머티리얼 디자인과 구별하기 위해 붙인 이름이다. 애플 폰사가 쿠퍼티노에 있기 때문에 이런 이름을 붙였다.</ref> 를 사용하는 식으로 할 수도 있고 그 반대로도 할 수 있다! 같은 앱에서 입맛에 맞게 어떤 부분은 머티리얼, 어떤 부분은 쿠퍼티노 디자인을 적용할 수도 있다. 다만, 똑같은 기능을 하는 인터페이스라고 해도 모양이나 크기가 다를 수 있으므로 이를 감안해야 한다. 네이티브 UI를 활용하는 것에 비해서 속도 면에서 불리하지 않은가 싶을 수 있는데 테스트 결과를 보면 상당히 준수하게 나온다. 렌더링 엔진인 skia는 [[C++]]로 구현했는데 최적화를 무척 잘 했는지 성능이 아주 좋다. 그리고 지금도 계속 최적화를 하고 있어서 업데이트 될 때마다 어느 정도나 성능을 향상시켰는지 공지한다.


다만 Flutter 웹은 [[HTML]]와 CSS, [[자바스크립트]]<ref>Flutter가 나오기 전부터 [[Dart]]는 [[자바스크립트]]로 컴파일할 수 있는 기능을 제공했다.</ref>를 사용한다. 이쪽은 이 두 가지만 가지고도 어지간히 다 할 수 있기도 하고<ref>아파치 코르도바가 내장한 [[HTML]]을 UI에 사용하는 방식으로 크로스 플랫폼 모바일 앱을 구현할만큼 HTML과 CSS만 있으면 웬만한 UI는 다 구현할 수 있다.</ref> 웹 표준을 무시하면 매장당하는 문제도 있다. Flutter를 웹 개발에 쓰면 사실상 [[HTML]]나 CSS 코딩 없이 [[Dart]]만으로 다 만들 수 있다.<ref>애초에 Flutter의 구조가 웹 구조에 힌트를 얻은 것이기도 하다. [[자바]] 기반 아파치 위켓 웹 [[프레임워크]]는 모든 것을 위젯으로 보고 모든 구성요소를 위젯 트리 구조로 구성하며, [[XML]] 같은 것을 쓰지 않고 UI도 코드로 몽땅 처리하는 데다가 stateless와 stateful 개념을 가지고 있어서 많은 면에서 Flutter와 닮아 있다.</ref>
다만 Flutter 웹은 [[HTML]]와 CSS, [[자바스크립트]]<ref>Flutter가 나오기 전부터 [[Dart]]는 [[자바스크립트]]로 컴파일할 수 있는 기능을 제공했다.</ref>를 사용한다. 이쪽은 이 두 가지만 가지고도 어지간히 다 할 수 있기도 하고<ref>아파치 코르도바가 내장한 [[HTML]]을 UI에 사용하는 방식으로 크로스 플랫폼 모바일 앱을 구현할만큼 HTML과 CSS만 있으면 웬만한 UI는 다 구현할 수 있다.</ref> 웹 표준을 무시하면 매장당하는 문제도 있다. Flutter를 웹 개발에 쓰면 사실상 [[HTML]]나 CSS 코딩 없이 [[Dart]]만으로 다 만들 수 있다.<ref>애초에 Flutter의 구조가 웹 구조에 힌트를 얻은 것이기도 하다. [[자바]] 기반 아파치 위켓 웹 [[프레임워크]]는 모든 것을 위젯으로 보고 모든 구성요소를 위젯 트리 구조로 구성하며, [[XML]] 같은 것을 쓰지 않고 UI도 코드로 몽땅 처리하는 데다가 stateless와 stateful 개념을 가지고 있어서 많은 면에서 Flutter와 닮아 있다.</ref>
43번째 줄: 41번째 줄:
===그밖에===
===그밖에===


각 OS의 네이티브에 붙어 있는 기능을 써야 할 때에는 그 부분만 네이티브로 개발해서 Flutter에 붙일 수도 있다. Flutter는 이를 위한 인터페이스를 제공한다. 단, 네이티브 부분은 [[안드로이드]]라면 [[자바]]나 [[코틀린]], iOS라면 오브젝티브C나 스위프트와 같이 각자의 네이티브 개발 언어를 써야 붙여줘야 한다. 카메라나 GPS처럼 플랫폼을 가리지 않고 대다수 하드웨어가 공통으로 제공하는 기능은 Flutter 지원 패키지로도 웬만큼은 다룰 수 있다.<ref>단, 플랫폼에 따라 기능이나 동작은 조금씩 차이가 있을 수 있다.</ref>
각 OS의 네이티브에 붙어 있는 기능을 써야 할 때에는 그 부분만 네이티브로 개발해서 Flutter에 붙일 수도 있다. Flutter는 이를 위한 인터페이스를 제공한다. 단, 네이티브 부분은 [[안드로이드]]라면 [[자바]]나 [[코틀린]], iOS라면 오브젝티브C나 스위프트와 같이 각자의 네이티브 개발 언어를 써야 붙여줘야 한다. 카메라나 GPS처럼 공통으로 제공하는 하드웨어는 Flutter 지원 패키지로도 웬만큼은 다룰 수 있다.


Flutter의 사용자층이 넓어지면서 Flutter는 물론 [[Dart]]의 기능을 확장해 주는 패키지들도 빠른 속도로 늘어나고 있다. 패키지 관리를 위해서 [[자바스크립트]]가 npm, [[파이썬]]이 pip을 사용하는 것처럼 Flutter의 프로그래밍 언어인 [[Dart]]도 Pub을 제공한다. [https://pub.dev pub.dev] 웹사이트에서 패키지를 검색해 볼 수 있으며 필요한 패키지를 Pub으로 설치 및 관리할 수 있다. 필요한 패키지는 pubspec.yaml 파일에 추가해서 'flutter pub get' 명령으로 받아올 수 있다. 비주얼 스튜디오 코드나 안드로이드 스튜디오는 pubspec.yaml 파일 변경을 감지해서 자동으로 pub get 명령을 실행하거나 명령을 실행할지 물어본다.
Flutter의 사용자층이 넓어지면서 Flutter는 물론 [[Dart]]의 기능을 확장해 주는 패키지들도 빠른 속도로 늘어나고 있다. 패키지 관리를 위해서 [[자바스크립트]]가 [[npm]], [[파이썬]]이 pip을 사용하는 것처럼 Flutter의 프로그래밍 언어인 [[Dart]]도 Pub을 제공한다. [https://pub.dev pub.dev] 웹사이트에서 패키지를 검색해 볼 수 있으며 필요한 패키지를 Pub으로 설치 및 관리할 수 있다. 필요한 패키지는 pubspec.yaml 파일에 추가해서 'flutter pub get' 명령으로 받아올 수 있다. 비주얼 스튜디오 코드나 안드로이드 스튜디오는 pubspec.yaml 파일 변경을 감지해서 자동으로 pub get 명령을 실행하거나 명령을 실행할지 물어본다.


==성능==
==성능==
88번째 줄: 86번째 줄:
코드 스타일 면에서는 [[자바스크립트]]의 그 악명 높은 [[콜백 지옥]]<ref>이게 워낙 심각하다 보니 [[자바스크립트]]도 문제 해결에 많은 노력을 기울였고 ES6, ES7을 거치면서 promise 지원이나 await, async 같은 비동기 키워드 지원으로 상당 부분을 해소했다.</ref>을 방불케 하는 들여쓰기 지옥이 있다. 위젯을 만들 때에는 속성을 생성자의 매개변수로 전달하는 방식을 사용하는데, Flutter의 레이아웃은 위젯의 트리 구조로 이루어진다. 자식 위젯은 보통 부모 위젯의 child(단일 위젯) 또는 children(위젯의 배열) 속성으로 전달하는데, 레이아웃이 복잡해지면 그만큼 위젯의 계층 수도 늘어나고, 그러면 부모 위젯 생성자의 chlid 속성에 자식 위젯의 생성자가 들어가고, 그 자식 위젯의 생성자 child 속성에 손자 위젯의 생성자가 들어가고... 이런 식으로 이어진다. 또한 위젯의 여백을 준다든가, 테두리 모양을 바꾼다든가, 위젯들을 정렬한다든가, 사용자 입력 반응 기능이 없는 위젯에 이러한 기능을 부여한다든가 할 때에도 위젯을 사용하므로 위젯의 계층 수가 두 자릿수로 갈 수 있으며 이렇게까지 가면 [[콜백 지옥]] 저리가라 할 정도의 들여쓰기 지옥을 맛볼 수 있다. 이를 피하려면 build() 안에 모든 위젯 렌더링 코드를 넣지 말고 Widget 객체를 돌려주는 몇 개의 메서드로 쪼갠 다음 이를 build()에서 부르거나, 여러 클래스에 걸쳐 쓰인다면 별도로 위젯 클래스를 만들어서 분리하는 방법도 있다.
코드 스타일 면에서는 [[자바스크립트]]의 그 악명 높은 [[콜백 지옥]]<ref>이게 워낙 심각하다 보니 [[자바스크립트]]도 문제 해결에 많은 노력을 기울였고 ES6, ES7을 거치면서 promise 지원이나 await, async 같은 비동기 키워드 지원으로 상당 부분을 해소했다.</ref>을 방불케 하는 들여쓰기 지옥이 있다. 위젯을 만들 때에는 속성을 생성자의 매개변수로 전달하는 방식을 사용하는데, Flutter의 레이아웃은 위젯의 트리 구조로 이루어진다. 자식 위젯은 보통 부모 위젯의 child(단일 위젯) 또는 children(위젯의 배열) 속성으로 전달하는데, 레이아웃이 복잡해지면 그만큼 위젯의 계층 수도 늘어나고, 그러면 부모 위젯 생성자의 chlid 속성에 자식 위젯의 생성자가 들어가고, 그 자식 위젯의 생성자 child 속성에 손자 위젯의 생성자가 들어가고... 이런 식으로 이어진다. 또한 위젯의 여백을 준다든가, 테두리 모양을 바꾼다든가, 위젯들을 정렬한다든가, 사용자 입력 반응 기능이 없는 위젯에 이러한 기능을 부여한다든가 할 때에도 위젯을 사용하므로 위젯의 계층 수가 두 자릿수로 갈 수 있으며 이렇게까지 가면 [[콜백 지옥]] 저리가라 할 정도의 들여쓰기 지옥을 맛볼 수 있다. 이를 피하려면 build() 안에 모든 위젯 렌더링 코드를 넣지 말고 Widget 객체를 돌려주는 몇 개의 메서드로 쪼갠 다음 이를 build()에서 부르거나, 여러 클래스에 걸쳐 쓰인다면 별도로 위젯 클래스를 만들어서 분리하는 방법도 있다.


용량도 아직은 문제인데, 자체적으로 사용자 인터페이스를 렌더링하는 Skia 엔진이 들어가므로 운영체제의 UI 관련 라이브러리를 불러다 쓰면 되는 네이티브보다는 덩치가 클 수밖에 없다. 릴리즈 모드로 컴파일 하면 Skia 중에 실제 앱에서 쓰는 부분만 포함시키는 방식으로 크기를 줄이긴 하지만 그래도 네이티브와는 차이가 꽤 난다. 구글도 이 점은 알고 있기 때문에 버전을 올려 나가면서 앱의 크기를 줄이는 데 많이 신경쓰고 있다. 이런 문제는 다른 [[크로스 플랫폼]]도 안고 있다. 예를 들어 .NET [[프레임워크]]의 [[크로스 플랫폼]] 버전인 모노 [[프레임워크]]를 안고 들어가야 하는 [[자마린]] 역시 'Hello world!' 하나 보여주는 앱도 용량이 장난 아니다.
용량도 아직은 문제인데, 자체적으로 사용자 인터페이스를 렌더링하는 skia 엔진이 들어가므로 운영체제의 UI 관련 라이브러리를 불러다 쓰면 되는 네이티브보다는 덩치가 클 수밖에 없다. 릴리즈 모드로 컴파일 하면 skia 중에 실제 앱에서 쓰는 부분만 포함시키는 방식으로 크기를 줄이긴 하지만 그래도 네이티브와는 차이가 꽤 난다. 구글도 이 점은 알고 있기 때문에 버전을 올려 나가면서 앱의 크기를 줄이는 데 많이 신경쓰고 있다. 이런 문제는 다른 [[크로스 플랫폼]]도 안고 있다. 예를 들어 .NET [[프레임워크]]의 [[크로스 플랫폼]] 버전인 모노 [[프레임워크]]를 안고 들어가야 하는 [[자마린]] 역시 'Hello world!' 하나 보여주는 앱도 용량이 장난 아니다.


==개발 환경==
==개발 환경==
가온 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 가온 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소 편집 도움말 (새 창에서 열림)

이 문서에서 사용한 틀: