- 다트 라이브러리의 주요 기능의 사용 방법 및 예시를 볼 예정 입니다.
- TL;DR : 최대한 내용을 요약하여 표현했습니다.
- 좀 더 자세하고 상세한 내용을 보고 싶으시면 위 원문 링크를 참조 바랍니다.
플러터란 ? 구글에서 개발한 크로스 플랫폼 앱 개발 프레임워크며, 언어는 구글이 개발한 Dart 를 사용합니다. 안드로이드, iOS, Web, Desktop 을 지원하며 구글의 차기 OS Fuchsia의 메인개발환경이 된다고 하네요 :)
이전 글
- [FLUTTER] 다트 주요 라이브러리 둘러보기 - 2 / A Tour of the Dart Libraries
- [FLUTTER] 다트 주요 라이브러리 둘러보기 - 1 / A Tour of the Dart Libraries
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 관련 글만 모아서 리스팀 처리
관련글(영문)
연재글
- [FLUTTER] 다트 주요 라이브러리 둘러보기 - 2 / A Tour of the Dart Libraries
- [FLUTTER] 다트 주요 라이브러리 둘러보기 - 1 / A Tour of the Dart Libraries
- [FLUTTER] DART 언어 기초과정 - 4 / A Tour of the Dart Language
- [FLUTTER] DART 언어 기초과정 - 3 / A Tour of the Dart Language
- [FLUTTER] DART 언어 기초과정 - 2 / A Tour of the Dart Language
- [FLUTTER] DART 언어 기초과정 - 1 / A Tour of the Dart Language