[FLUTTER] 다트 주요 라이브러리 둘러보기 - 3 / A Tour of the Dart Libraries

in #dart6 years ago

출처 : https://www.dartlang.org/guides/libraries/library-tour

  • 다트 라이브러리의 주요 기능의 사용 방법 및 예시를 볼 예정 입니다.
  • TL;DR : 최대한 내용을 요약하여 표현했습니다.
  • 좀 더 자세하고 상세한 내용을 보고 싶으시면 위 원문 링크를 참조 바랍니다.

플러터란 ? 구글에서 개발한 크로스 플랫폼 앱 개발 프레임워크며, 언어는 구글이 개발한 Dart 를 사용합니다. 안드로이드, iOS, Web, Desktop 을 지원하며 구글의 차기 OS Fuchsia의 메인개발환경이 된다고 하네요 :)

이전 글

5. URIs

Uri 클래스는 URL에서 사용할 문자열을 인코딩하고 디코딩하는 함수를 제공합니다. 이러한 함수는 URI에 특수한 문자 (예 : &와 =)를 처리합니다.

5.1 완전한 URI 인코딩 및 디코딩

/, :, &, # 등과 같은 단어를 인코딩 디코딩 처리 해준다. (URL 호출시 해당 단어를 치환해 주는 효과)

var uri = 'http://example.org/api?foo=some message';

var encoded = Uri.encodeFull(uri);
assert(encoded ==
    'http://example.org/api?foo=some%20message');

var decoded = Uri.decodeFull(encoded);
assert(uri == decoded);

5.2 URI components 를 활용한 인코딩 및 디코딩

모든 특수문자를 인코딩 디코딩 처리 해준다.

var uri = 'http://example.org/api?foo=some message';

var encoded = Uri.encodeComponent(uri);
assert(encoded ==
    'http%3A%2F%2Fexample.org%2Fapi%3Ffoo%3Dsome%20message');

var decoded = Uri.decodeComponent(encoded);
assert(uri == decoded);

5.3 URI 파싱

URI 정보를 파싱하여 Uri 개체 정보에 담아 리턴한다

var uri =
    Uri.parse('http://example.org:8080/foo/bar#frag');

assert(uri.scheme == 'http');
assert(uri.host == 'example.org');
assert(uri.path == '/foo/bar');
assert(uri.fragment == 'frag');
assert(uri.origin == 'http://example.org:8080');

5.4 URI 정보 생성

Uri 속성값을 입력받아 생성한다

var uri = Uri(
    scheme: 'http',
    host: 'example.org',
    path: '/foo/bar',
    fragment: 'frag');
assert(
    uri.toString() == 'http://example.org/foo/bar#frag');

6. 날짜와 시간

DateTime 객체는 특정 시점입니다. 표준 시간대는 UTC 또는 현지 표준 시간대입니다.

// 현재 날짜와 시간 정보를 가져온다 
var now = DateTime.now();

// 현지 표준 시간대 기준으로 DateTime 을 생성한다 
var y2k = DateTime(2000); // January 1, 2000

// 년,월,일 지정 
y2k = DateTime(2000, 1, 2); // January 2, 2000

// UTC 로 지정 
y2k = DateTime.utc(2000); // 1/1/2000, UTC

// 밀리세컨드 기준 날자와 시간을 지정 (unix epoch)
y2k = DateTime.fromMillisecondsSinceEpoch(946684800000,
    isUtc: true);

// iso 8601 기준 날자 파싱 
y2k = DateTime.parse('2000-01-01T00:00:00Z');

// 1/1/2000, UTC
var y2k = DateTime.utc(2000);
assert(y2k.millisecondsSinceEpoch == 946684800000);

// 1/1/1970, UTC
var unixEpoch = DateTime.utc(1970);
assert(unixEpoch.millisecondsSinceEpoch == 0);

날짜 및 시간 연산

var y2k = DateTime.utc(2000);

// 1년 추가 
var y2001 = y2k.add(Duration(days: 366));
assert(y2001.year == 2001);

// 30일 빼기 
var december2000 = y2001.subtract(Duration(days: 30));
assert(december2000.year == 2000);
assert(december2000.month == 12);

// 두 날짜 사이의 간격 계산 
// Duration Object 정보를 반환
var duration = y2001.difference(y2k);
assert(duration.inDays == 366); // y2k was a leap year.

7. 유틸리티 클래스

7.1. object 비교

Comparable 인터페이스를 구현하여 일반적으로 객체를 다른 객체와 비교할 수 있습니다.
compareTo () 메서드는 작은 경우에는 0을, 같은 경우에는 0을, 큰 경우에는 0보다 큰 값을 반환합니다.

class Line implements Comparable<Line> {
  final int length;
  const Line(this.length);

  @override
  int compareTo(Line other) => length - other.length;
}

void main() {
  var short = const Line(1);
  var long = const Line(100);
  assert(short.compareTo(long) < 0);
}

7.2 map key 구현

Dart에서는 기본적으로 hashcode를 제공합니다. 또한 hashCode 를 getter 통해 재정의 할 수 있습니다. 그런 경우 == 연산자를 재정의해야 할 수도 있으며, 동일한 객체는 동일한 해시 코드를 가져야합니다. 해시 코드는 고유 할 필요는 없지만 잘 분산되어 있어야 합니다.

class Person {
  final String firstName, lastName;

  Person(this.firstName, this.lastName);

  // Effective Java(책이름) 11장에 나와 있는 전략을 활용하여 hashcode 재정의 
  @override
  int get hashCode {
    int result = 17;
    result = 37 * result + firstName.hashCode;
    result = 37 * result + lastName.hashCode;
    return result;
  }

  // 해쉬코드를 재정의(override) 한 경우 == 연산자를 구현해야 됩니다.
  @override
  bool operator ==(dynamic other) {
    if (other is! Person) return false;
    Person person = other;
    return (person.firstName == firstName &&
        person.lastName == lastName);
  }
}

void main() {
  var p1 = Person('Bob', 'Smith');
  var p2 = Person('Bob', 'Smith');
  var p3 = 'not a person';
  assert(p1.hashCode == p2.hashCode);
  assert(p1 == p2);
  assert(p1 != p3);
}

7.3 반복(Iteration)

Iterable 및 Iterator 클래스는 for-in 루프를 지원하며, Iterator를 구현(implements)한 경우, 실제 반복 기능을 정의하여야 됩니다.

class Process {
    // 프로세스를 나타냅니다.
}

// Iterator를 구현한 ProcessIterator 예시
class ProcessIterator implements Iterator<Process> {
  @override
  Process get current => ...
  @override
  bool moveNext() => ...
}

// Iterable 서브클래스를 상속 받은 이후 iterator 를 지정하면 iterate 구문을 활용할 수 있습니다.
class Processes extends IterableBase<Process> {
  @override
  final Iterator<Process> iterator = ProcessIterator();
}

void main() {
  
  // Iterable 개체는 for-in 구문을 사용할 수 있습니다.
  for (var process in Processes()) {
    // process 를 통해 뭔가를 수행 
  }
}

7.4 예외(Exceptions)

예외는 미리 계획하고 잡을 수있는 조건이며, 오류는 기대하지 않거나 계획하지 않은 조건입니다.

  • NoSuchMethodError (그런 메소드 없음) : 대상 개체가 null이거나 호출한 메소드 구현이 이뤄지지 않은 경우 오류를 던질 수 있습니다.

  • ArgumentError (아규먼트 오류) : 의도치 않은 구문이 발생한 경우 오류를 던질 수 있습니다.

Exception 인터페이스를 구현하여 사용자 정의 예외를 정의 할 수 있습니다.

class FooException implements Exception {
  final String msg;

  const FooException([this.msg]);

  @override
  String toString() => msg ?? 'FooException';
}

맺음말

이번 시간에는 URI, 날짜처리, 유틸리티 클래스에 대해 알아 봤습니다. 다음시간에는 비동기(async)관련 내용을 살펴 보도록 하겠습니다.

  • 이전 시간에 배운 A Tour of the Dart Language 1 2 3 4 는 여유 되시면 반복 학습 부탁 드립니다. 위 내용이 학습된 상태에서 본 내용을 습득해야 이해가 빠른편인지라 :)

읽기 힘든 글 읽어주셔서 (또는 눈팅 이라도) 감사합니다

관련 글 링크

@flutters : 제가 작성한 글 중 fluter 관련 글만 모아서 리스팀 처리

관련글(영문)

연재글

설치/설정


aaronhong_banner.jpg