티스토리 뷰

Dart & Flutter

Dart 공부 정리 20200204

낭초비 2020. 2. 4. 07:30
반응형

오늘 공부는 Dart.dev의 Generics(링크) 부터 시작.

Dart 2.7 이하의 기초 지식과 문법에 대한 내용이다. 

 

   Generics

  • < ... > notation은 generic type을 표시하는 것
  • 적당히 명시된 generic type은 더 나은 코드를 가져다 줌
  • 코드 중복을 줄일 수 있음 

Using parameterized type with constructors

constructor를 사용할때  1개 또는 그이상의 type을 명시하고 싶을 경우, class name 뒤에 <...> 안에 타입을 적어 넣어라 

 

Restricting the parameterized type

generic type을 구현할 때, 파라미터로 올 수 있는 type을 제한하고 싶을 수 도 있다. 이럴 때 extends 키워들를 이용해서 제한 할 수 있다. 

 

Using generic methods

초기에는 다트의 generic은 class에 사용하는 것으로 제한되어 있었지만, 새로운 문법인 generic method는 method와 function에 type argument를 사용할 수 있게 한다. 

 

 

   Libraries and visibility

  • import와 library 지시어는 모듈화 되고 공유 가능한 코드 베이스를 만드는데 도움을 준다. 
  • library는 단순히 API를 제공하는 것뿐만 아니라, privacy의 단위이기도 하다. underscore(_) 로 시작하는 identifier는 library안에서만 visible할 수 있기 때문이다. 
  • 모든 dart app은 library이다. 심지어 library 지시어를 사욯지 않아도.

Using libraries

한 라이브러리의 네임 스페이스가 다른 라이브러리의 범위에서 사용되는 방법을 import 키워드를 사용하여 지정.  

dart: 은 built-in library를 사용할 때의 URI

package: 는 package manager에 의해 제공되는 라이브러리를 명시할 때 사용하는 URI

URI 는 Uniform Resource Idendifier의 약자. URL은 Uniform Resource Locator)의 약자로 URI의 일반적인 종류 중 하나

 

Specifying a library prefix

두개의 라이브러리를 import하여 사용할때 각각의 라이브러리에 포함된 identifier 중에 충돌이 생기는(같은 이름) 것이 있을 경우, prefix를 설정하여 해결 할 수 있음

 

Importing only part of a library

라이브러리의 일부분만 사용하고자 할 경우에는, show 키워드나 hide 키워드를 사용해서 선택적으로 라이브러리를 import할 수 있음

 

Lazily loading a library

라이브러리가 필요로 할 때까지 라이브러리의 loading을 지연 시킬 수 있다. 이것의 장점은 초기 startup time을 줄일수 있으며, 드물게 사용되는 기능을 로드할 때 적용하기 좋으며, A/B 테스트를 수행하기 위해서 알고리즘의 대체 구현을 시도할 때 유용하다. ( 이기능은 Web app에 한해서만 사용가능. flutter는 이런 기능이 없음)

import 시에 deffered as 키워드를 사용한다. 그리고 load가 필요할 때 loadLibrary( )를 호출해야 한다. 그리고 load가 될때까지 프로그램을 중지하기 위해 await 키워드를 사용해야 한다

 

Implementing libraries

링크의 내용을 참고. (링크)

 

 

   Asynchrony support

  • dart 라이브러리는 Future과 Stream 오브젝트를 반환하는 함수들로 가득함
  • 이러한 함수들은 비동기식임. 이들은 시간이 많이 걸리는 작업 (예 : I / O)을 설정 한 후 해당 작업이 완료 될 때까지 기다리지 않고 반환됨
  • asyncawait 키워드는 비동기식 프로그래밍을 지원하며, 동기식과 비슷해 보이는 비동기식 코드를 작성하게 도와줌

Handling Futures

만약 completed Futuer의 결과가 필요하다면 asyncawait 키워드를 사용하거나, Future API를 사용해라.

await 를 사용하기 위해서는 코드가 반드시 async function  안에 있어야 한다. 

 

async 함수가 시간을 소비하는 작업을 수행할지라도, 이함수는 이러한 작업을 기다리지 않는다. 대신, async 함수는 그것의 첫번째 await 표현식을 만날때까지만 실행한다. 그리고나서 Future object를 반환하고 await 표현식이 끝난(완료) 후에야 다시 실행을 계속한다. 

 

async함수 내에서 await는 여러번 사용할 수 있다. 

 

await 표현식에서 표현식의 값은 대개 Future 이다. 그렇지 않은 경우에는 값이 자동적으로 Future에 감싸여진다. 이 Future 객체는 객체를 반환하겠다는 약속을 나타낸다. await 표현식의 값은 반환 된 객체이다. await 표현식은 해당 오브젝트가 사용 가능할 때까지 일시 정지한다.

 

await 키워드를 사용할때는 항상 그것이 async 함수내에서 사용되었는지 확인 해라. 

 

Declaring async functions

async 함수는 함수의 body가 async 수정자로 표시된 함수를 의미한다. 

async 키워드를 함수에 사용할 경우 그 함수는 Future를 반환한다는 의미이다. 

함수의 body에서 Future API를 사용할 필요는 없다. dart가 필요에 따라서 Future object를 생성한다. 만약 함수가 의미있는 값을 반환하지 않을 경우 반환 타입을 Future<void>로 지정해라. 

 

Handling Streams

Stream으로 부터 값을 받아올때는 async 와 asynchronous for 루프(await for) 를 사용하거나, Stream API를 사용해라 

 

await for를 사용하기 전에 코드가 더 명확 해지고 모든 스트림의 결과를 기다릴 수 있는지 확인해라. 예를 들어 UI 프레임 워크는 끝없는 이벤트 스트림을 보내기 때문에 일반적으로 UI 이벤트 리스너에 대해 await for를 사용해서는 안된다

 

stream을 기다리는 것을 멈추기 위해서는 break나 return 문을 사용해라

 

await for 문 또한 async함수 내에서 사용되어야 하므로 await for가 사용되는 곳이 async 함수 내부 인지 를 확인해라

 

 

   Generators

일련의 값을 느리게 생성해야하는 경우 generator 함수 사용을 고려해라. 다트는 두 종류의 generator 함수를 기본적으로 지원한다.

Synchronous generator : Iterable object를 반환

synchronous generator 함수를 구현하기 위해서는 함수의 body에 sync* 를 표기하고,  값을 전달하기 위해 yield 문을 사용해야 함 (return 대신에 yield를 사용한다는 말인듯)

 

Asynchronous generator : Stream object를 반환

asynchronous generator를 구현하기 위해서는 함수의 body에 async*를 표기하고, yield문을 이용해서 값을 전달해야 한다. (return 대신에 yield를 사용한다는 말인듯)

 

만약에 generator가 반복적이라면, yield*를 사용해서 성능을 개선시킬 수 있다. 

 

 

   Callable classes

당신의 dart class의 instance가 함수처럼 호출 될 수 있기 위해서는 call( ) 메소드를 구현해야 한다. 

 

   Isolates

대부분의 컴퓨터뿐만아니라 모바일 플랫폼에서 멀티 코어 CPU를 가지고 있다. 이러한 코어를 모두 활용하기 위해 개발자는 전통적으로 동시에 실행되는 shared-memory 스레드를 사용한다. 그러나 공유 상태의 동시성은 오류가 발생하기 쉬우며 복잡한 코드로 이어질 수 있다.

 

모든 Dart 코드는 스레드 대신 isolates의 내부에서 실행된다. 각 isolate는 자체 메모리 힙이 있으므로, 다른 isolate에서 isolate의 상태에 액세스 할 수 없다.

 

   Typedefs

다트에서 function도 오브젝트 이다. typedef 또는 function-type 는 function type에 field를 선언하거나 return type을 명시할 때 사용할 수 있는 이름을 부여한다. 

typedef는 단순한 별명같은 것이므로, 어떤 함수의 type을 체크하는 용도로 사용될 수 있다.

 

   Metadata

당신의 코드에 대해서 추가적인 정보를 전달하기 위해서는 metadata를 사용해라. metadata annotation은 @ 문자로 시작하며 그 뒤에 compile-time constant에 대한 참조나, 상수 생성자에 대한 호출이 온다.  

자신만의 metadata를 정의할 수 있다. 

 

   Comments

Single-line comments 는  //

Multi-line comments 는 /* */

Documentation comment 는 ///  또는 /** 

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함