Dart 레코드를 함수 반환값으로 쓰고 구조 분해로 받아 확인하는 방법

2026. 10. 24. 11:00·Flutter
728x90

왜 이 내용을 정리하나

Flutter 앱에서 비동기 호출이나 입력 검증을 하면 함수가 여러 값을 돌려줘야 하는 경우가 자주 생긴다. 예를 들어 서버 응답의 상태 코드와 본문을 함께 받거나, 폼 검증 결과와 에러 메시지를 한 번에 돌려주는 식이다. 이전에는 리스트나 맵에 값을 담거나, 별도의 클래스를 만들어 감싸는 방식을 많이 썼다. Dart 3부터 도입된 레코드(record)를 쓰면 이런 값을 가볍게 묶어 반환할 수 있고, 구조 분해로 바로 변수에 나눠 받을 수 있다. 이 노트에서는 레코드를 함수 반환값으로 쓰는 방법과 구조 분해로 받아 값을 확인하는 흐름을 정리해 본다.

개념 설명

레코드는 여러 값을 쉼표로 묶어 만든 불변(immutable) 값이다. 위치 기반 필드는 (int, String)처럼 쓰고, 이름 기반 필드는 ({int code, String body})처럼 중괄호 안에 이름을 붙여 쓴다. 위치 기반 필드는 $1, $2로 접근하고, 이름 기반 필드는 .code처럼 이름으로 접근한다.

반환 타입을 레코드로 선언하면 함수는 여러 값을 하나의 값처럼 돌려준다. 호출하는 쪽에서는 구조 분해 문법으로 final (a, b) = f();처럼 받으면 각 값이 변수에 나뉘어 들어간다. 이름 기반 레코드는 final (code: c, body: b) = f();처럼 필드 이름을 맞춰 받는다.

구조 분해에서 값의 종류를 확인하려면 패턴 매칭의 case나 if case를 함께 쓸 수 있다. 특정 조건을 만족하는 레코드만 골라 처리할 때 유용하다.

코드 예제

import 'dart:convert';

({int status, String message}) parseResponse(String raw) {
  final decoded = jsonDecode(raw);
  if (decoded is Map && decoded.containsKey('status')) {
    return (status: decoded['status'] as int, message: 'ok');
  }
  return (status: -1, message: 'invalid format');
}

(int, int) splitRange(int start, int end) {
  return (start, end - start);
}

void main() {
  final (status: s, message: m) = parseResponse('{\'status\': 200}');
  print('status=$s, message=$m');

  final (begin, length) = splitRange(10, 25);
  print('begin=$begin, length=$length');

  final result = parseResponse('broken');
  if (result case (status: -1, message: final msg)) {
    print('실패: $msg');
  } else {
    print('성공: ${result.status}');
  }
}

이 코드는 parseResponse가 이름 기반 레코드를 반환하고, main에서 final (status: s, message: m)로 바로 나눠 받는다. splitRange는 위치 기반 레코드를 반환하며 (begin, length)로 받는다. 마지막 부분의 if case는 status가 -1인 경우만 골라 실패 메시지를 출력한다. 실행하면 status=200, message=ok, begin=10, length=15, 실패: invalid format이 차례로 출력된다.

참고로 JSON 문자열 안의 작은따옴표는 Dart 문자열 이스케이프로 처리했다. 실제 값이 필요한 환경이라면 jsonDecode 결과의 타입을 한 번 더 확인하는 편이 안전하다.

헷갈리는 점

레코드는 클래스가 아니므로 메서드가 없고 상속도 안 된다. 필드 이름이 필요한 큰 데이터 구조에는 클래스가 더 맞다. 레코드는 함수에서 두세 개의 값을 가볍게 묶어 돌려주는 용도에 적합하다.

위치 기반과 이름 기반을 섞어 쓸 수 있지만, 구조 분해할 때 순서나 이름이 맞지 않으면 컴파일 에러가 난다. 반환 타입을 명시해 두면 호출부에서 실수를 줄일 수 있다.

레코드는 불변이므로 생성 후 필드 값을 바꿀 수 없다. 값을 바꾸려면 새 레코드를 만들어 반환해야 한다.

정리

Dart 레코드는 함수 반환값으로 여러 값을 가볍게 묶어 주는 방법이다. 위치 기반과 이름 기반 두 형태가 있고, 구조 분해로 바로 변수에 나눠 받을 수 있다. if case와 함께 쓰면 값의 형태를 확인하면서 분기하기도 쉽다. 복잡한 데이터 구조에는 클래스를 쓰고, 가벼운 반환값에는 레코드를 쓰는 기준으로 나누면 된다. 이 노트에서는 레코드 반환, 구조 분해, 패턴 확인의 흐름을 정리해 봤다.

#Flutter #Dart #레코드 #구조분해 #패턴매칭

728x90
LIST

'Flutter' 카테고리의 다른 글

Flutter MaterialApp theme의 primaryColor가 push된 라우트에도 적용되는지 코드로 확인하는 방법  (0) 2026.10.25
Dart 명명된 매개변수에서 required와 기본값을 함께 쓸 때의 동작 확인  (0) 2026.10.24
Flutter Column과 Row로 화면을 배치하는 방법  (0) 2026.10.23
Flutter에서 StatelessWidget과 StatefulWidget을 나누는 기준  (0) 2026.10.23
Flutter 시작하기 - SDK 다운로드 및 환경 설정 가이드  (1) 2025.09.03
'Flutter' 카테고리의 다른 글
  • Flutter MaterialApp theme의 primaryColor가 push된 라우트에도 적용되는지 코드로 확인하는 방법
  • Dart 명명된 매개변수에서 required와 기본값을 함께 쓸 때의 동작 확인
  • Flutter Column과 Row로 화면을 배치하는 방법
  • Flutter에서 StatelessWidget과 StatefulWidget을 나누는 기준
Mr. Joo
Mr. Joo
  • Mr. Joo
    삽질의 시작
    Mr. Joo
  • 전체
    오늘
    어제
    • 분류 전체보기 (277) N
      • Python (12) N
      • 개발 요약 (10)
      • Flutter (82) N
      • Android (9)
      • Swift (14) N
      • React (22) N
      • 인공지능 (4)
      • 대학원 (3)
      • CS (10)
      • 개발 뉴스 (108)
      • IT 기기 (1)
      • 알면 유용한 정보 (2)
  • 인기 글

  • 태그

    Swift
    Flutter
    앱 개발
    파이썬
    오늘의 기술 뉴스
    플러터
    Dart 기초
    android
    상태관리
    개발 뉴스
    오늘의 이슈
    앱
    기술
    기술 뉴스
    오늘의 뉴스
    개발
    이슈
    react
    뉴스
    DART
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
Mr. Joo
Dart 레코드를 함수 반환값으로 쓰고 구조 분해로 받아 확인하는 방법
상단으로

티스토리툴바