Dart(플러터) 'record' 200% 활용하기

악어·2023년 12월 22일
1

Dart 문법

목록 보기
7/7
post-thumbnail

dart에도 tuple이나 dictionary같은게 있나?

플러터로 개발을 하고 있는 사람도
은근 잘 모르는 문법들이 있다.

sealed class나 interface, tuple과 비슷한 record 등..
오늘은 이중 내가 가장 많이 활용한
record의 활용법을 소개하려한다.

참고로 record는 dart 3.0부터 활용 가능하다.
아직 2 버전대의 dart를 쓰고 있다면
다음 링크를 참고해서 업그레이드하자.


dart 3.0 적용하기(윈도우)



기본 활용법

먼저 record는 tuple이나 dictionary와 비슷하면서도 다르다.
기본적인 사용은 다음과 같다.

const (int, String) record = (1, "문자열");
  
print(record);
print(record.$1);
print(record.$2);

// (1, "문자열")
// 1
// 문자열

위와 같이 소괄호로 타입과 함께 지정할 수 있고,
각 요소는 $number 꼴로 접근 가능하다.



다음과 같이 함수의 return으로도 활용될 수 있다.

(int, int) changeOrder(int a, int b) {
  return (b, a);
}

final (a, b) = changeOrder(1, 3);
  
print(a);    // 3
print(b);    // 1

각 결과값을 a, b 변수에 바로 저장해
활용할 수 있음을 확인할 수 있다.



응용

언제나 새로운 문법을 봤을때,
기본 활용법만 보면 그닥 유용해 보이지 않는다.
고급 활용이 곁들여져야 좀 쓸만해지는법.
dart의 record는 dictionary처럼 키를 지정할 수 있다는게 매력적이다.

const ({int index, String name, int height}) record = (index: 1, name: "개발자 악어", height: 188);
  
print(record);
print("인덱스: ${record.index}");
print("이름: ${record.name}");
print("키: ${record.height}");


// (height: 188, index: 1, name: 개발자 악어)
// 인덱스: 1
// 이름: 개발자 악어
// 키: 188

뭔가 굉장히 쉽게 하나의 object를 만들어낸 느낌이다.
실제로 product수준에서 활용해봤을때,
record의 가장 큰 매력은 불필요한 object나
class 생성을 줄여 코드를 간소화 시켜준다는 점이었다.



코드를 적어 나가다보면,
분명 이 스크린에서밖에 안쓸거같은데,
이 파일에서밖에 안쓸거같은데,
굳이 새 클래스를 파고 파일을 작성하고 해야하나?
하는 생각이 들때가 많다.

이럴때 typedef와 record를 적절하게 활용해주면
코드의 간소화와 가독성을 늘리는데 도움이 된다.

다음은 실제 카페자리에 사용된 코드이다.



typedef WallSocketRates = List<({int floor, double rate})>;
typedef RestroomInfos = List<({int floor, String text})>;


@freezed
class CafeInfoModificationState with _$CafeInfoModificationState {
  factory CafeInfoModificationState({
  
  	...

  	required final WallSocketRates wallSocketRates,
    required final RestroomInfos restroomInfos,

  	...
        
  }) = _CafeInfoModificationState;
  

  factory CafeInfoModificationState.empty() => CafeInfoModificationState(
  
    ...
  
    wallSocketRates: [(floor: 1, rate: 0.0)],
    restroomInfos: [(floor: 1, text: "남/여 화장실")],
    
    ...
    
  );
}

구린 작명센스는 잠깐 미뤄두고,
해당 코드는 사용자가 카페의 잘못된 정보를
제보하는 스크린에 들어갈 State를 정의하는 부분이다.

사용자는 해당 카페 층별 콘센트 보급율을 제보할 수 있고,
각 층 화장실 정보도 제보할 수 있다.(남자 화장실 / 여자 화장실 등)



이 때 카페마다 층 정보가 다르기 때문에,
사용자가 어떤 카페의 정보를 제보하러 왔는지에 따라
층의 갯수가 달라진다.

층의 수의 따라 유동적인 대응을 위해 정보를 list 형식으로 저장한다.
또한, 각 층은 층정보(지하 1층이면 -1, 3층이면 1 등)와
콘센트 보급율 정보를 담아야 하므로,
object를 하나 파서 이 object의 list를 저장하는 것이 맞다.


그런데 object나 class를 따로 하나 만드는게 귀찮고,
만들어봤자 여기서밖에 안쓸거 같다면?

그냥 여기서만 쓸 record를 쓰는게 편하다.
필요하지 않다면 typedef도 필요없다.



많이쓰자..!!

혼자서 개발하고 혼자 보는 경우가 많은
초보 개발자 입장에서, record는 정말 쓸일이 많았다.
몰랐던 사람이 있다면 꼭 사용해보는걸 추천한다.

profile
냅다 회사부터 세워버린 개발자

0개의 댓글