dart:core 핵심 라이브러리

dart:core는 Dart에서 자동으로 암시적 가져오기되는 표준 핵심 라이브러리로 언어 동작에 필수적인 기본 기능을 제공합니다. 모듈별로 핵심 기능과 예제 코드를 정리했습니다.

다시 말해 개발자가 직접 가져오기 코드를 작성하지 않아도 라이브러리가 자동으로 로드됩니다.

1. 콘솔 출력

최상위 함수 print()는 객체의 toString() 메서드를 자동 호출하여 문자열을 출력합니다.

void main() {
  var tea = "milk tea";
  print(tea);
  print('I drink $tea.');
}Code language: Dart (dart)

2. 숫자 타입: num / int / double

  1. 상속 관계: intdouble 모두 num을 상속받음
  2. 문자열 → 숫자 변환: parse(). int는 진법 radix 지원
  3. 숫자 → 문자열 변환:
  • toString(): 기본 변환
  • toStringAsFixed(n): 소수점 n자리 유지
  • toStringAsPrecision(n): 유효숫자 n자리
void main() {
  // 문자열에서 숫자로 변환
  assert(int.parse('42') == 42);
  assert(int.parse('42', radix:16) == 66);
  assert(double.parse('0.5') == 0.5);

  // 숫자에서 문자열로 변환
  assert(123.456.toStringAsFixed(2) == '123.46');
  assert(123.456.toStringAsPrecision(2) == '1.2e+2');
}Code language: Dart (dart)

3. 문자열 String & 정규식 RegExp

  • String은 불변(Immutable) (수정 메서드는 모두 새 문자열 반환) UTF-16 코드 유닛으로 저장됨
  • 자주 사용하는 기능: 검색, 자르기, 분할, 대소문자 변환, 공백 제거
void main() {
  var str = 'Never odd or even';
  // 검색
  assert(str.contains('odd'));
  assert(str.startsWith('Never'));
  assert(str.endsWith('even'));
  assert(str.indexOf('odd') == 6);

  // 자르기, 분할
  assert(str.substring(6,9) == 'odd');
  var parts = 'a b c'.split(' ');

  // 공백 정리, 빈 값 확인
  assert('  abc  '.trim() == 'abc');
  assert(''.isEmpty);
  assert('  '.isNotEmpty);

  // 대소문자
  assert('dart'.toUpperCase() == 'DART');

  // 문자열 연결은 StringBuffer 사용 권장(성능 향상)
  var sb = StringBuffer();
  sb.write('Hello ');
  sb.writeAll([ 'A','B','C' ], ',');
  print(sb.toString());
}Code language: Dart (dart)

정규식 RegExp

void main() {
  var reg = RegExp(r'\d+'); // 연속된 숫자 매칭
  var text = 'llamas live 15 to 20 years';

  assert(reg.hasMatch(text));
  // 전역 매칭 순회
  for(var m in reg.allMatches(text)){
    print(m.group(0));
  }
  // 치환
  var res = text.replaceAll(reg, 'XX');
  print(res);
}Code language: Dart (dart)

참고: 코드 유닛 자체가 사용자가 보이는 문자가 아닙니다. 이모지 조합 같은 복잡한 유니코드 문자는 서드파티 characters 패키지를 사용하는 것을 권장합니다.

4. 컬렉션 (List / Set / Map)

1. List: 순서 유지, 중복 허용, 인덱스 접근 지원

void main() {
  var fruits = [ 'apple','orange' ];
  fruits.add('kiwi');
  fruits.addAll([ 'grape' ]);
  fruits.removeAt(0);
  fruits.sort((a,b)=>a.compareTo(b)); //정렬

  // 제네릭 제약
  var strList = <String>[];
}Code language: Dart (dart)

2. Set: 순서 없음, 요소 중복 불가, 인덱스 접근 불가

void main() {
  var set = <String>{};
  set.addAll([ 'gold','xenon' ]);
  set.add('gold'); //중복 추가는 무시됨
  assert(set.contains('xenon'));

  // 교집합 연산
  var set2 = Set.from([ 'xenon','argon' ]);
  var inter = set.intersection(set2);
}Code language: Dart (dart)

3. Map: 키-값 컬렉션, 키는 유일해야 함

void main() {
  var map = {54: 'xenon'};
  print(map[54]);
  assert(map.containsKey(54));
  map.remove(54);

  // 키가 없을 때만 값 할당
  map.putIfAbsent('name', () => 'Dart');

  // 순회
  map.forEach((k,v)=>print('$k:$v'));
}Code language: Dart (dart)

4. Iterable 공통 컬렉션 연산 (List/Set은 Iterable 구현)

자주 사용하는 고차 함수: forEach, map, where, any, every

void main() {
  var list = [ 'green','black','chamomile' ];
  list.forEach(print);

  // map은 지연 평가, toList 호출 시 즉시 실행
  var upperList = list.map((e)=>e.toUpperCase()).toList();

  // 필터링
  var filter = list.where((e)=>e == 'chamomile');
  assert(list.any((e)=>e == 'chamomile'));
  assert(!list.every((e)=>e.contains('tea')));
}Code language: Dart (dart)

5. URI 주소 처리 (Uri)

URL 인코딩/디코딩, 파싱, 주소 조합에 활용

  1. encodeFull: 공백 등만 이스케이프, / : ? & 등 URL 기호 유지
  2. encodeComponent: 모든 특수문자 이스케이프 (파라미터 값 인코딩에 적합)
void main() {
  // URL 파싱
  var uri = Uri.parse('https://example.org:8080/foo?lang=dart#frag');
  print(uri.scheme);
  print(uri.host);
  print(uri.queryParameters);

  // URL 생성
  var newUri = Uri.https('example.org','/foo', {'lang':'dart'});
}Code language: Dart (dart)

6. 날짜 및 시간 DateTime & Duration

  • DateTime: 특정 시점, 로컬 타임존 / UTC 지원
  • Duration: 시간 간격, 시간 가감 및 차이 계산에 사용
void main() {
  var now = DateTime.now();
  var y2k = DateTime.utc(2000);

  // 시간 가감
  var nextYear = y2k.add(const Duration(days:366));
  var diff = nextYear.difference(y2k);
  print(diff.inDays);

  // 타임스탬프 (밀리초, Unix epoch 1970-01-01 UTC 기준)
  print(y2k.millisecondsSinceEpoch);
}Code language: Dart (dart)

주의: 서머타임 환경에서 일 단위 시간 이동은 오류가 발생하기 쉬우므로 UTC 시간 사용을 우선하세요.

7. 유틸리티 인터페이스 및 기본 클래스

1. Comparable: 객체 비교 기능 구현, 정렬에 활용

class Line implements Comparable<Line> {
  final int length;
  const Line(this.length);
  @override
  int compareTo(Line other) => length - other.length;
}Code language: Dart (dart)

2. 사용자 정의 Map 키: ==hashCode 재정의

규칙: 동등한 객체는 동일한 hashCode 값을 가져야 한다

class Person {
  final String first, last;
  Person(this.first,this.last);

  @override
  int get hashCode => Object.hash(first, last);

  @override
  bool operator ==(Object other) =>
      other is Person && other.first == first && other.last == other.last;
}Code language: Dart (dart)
  • 3. Iterable + Iterator

Iterable을 구현하면 for-in 반복문을 사용할 수 있으며, 순회 로직을 직접 정의할 수 있습니다.

8. 예외 처리 메커니즘

  • Error: 심각한 오류, 일반적으로 포착하지 않음 (예: NoSuchMethodError)
  • Exception: 예상 가능한 예외로 포착 가능하며, 사용자 정의 예외를 생성할 수 있음
class FooException implements Exception {
  final String? msg;
  const FooException([this.msg]);
  @override
  String toString() => msg ?? 'FooException';
}Code language: Dart (dart)

9. 약한 참조 및 파이널라이저

  • WeakReference: 약한 참조, GC의 객체 회수를 막지 않음
  • Finalizer / NativeFinalizer: 객체 회수 후 콜백 실행, 네이티브 자원 해제
  • Finalizable: 객체가 일찍 GC로 회수되는 것을 방지

dart:core 핵심 라이브러리

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다