Dart, Record에 대하여

Uno·2024년 1월 26일
0

dart

목록 보기
7/7
post-thumbnail

<골든래빗에서 제공 받은 도서로 일부 발췌한 내용이 있습니다.>
책: 코드팩토리의 플러터 프로그래밍 2판

Dart 3.0 에 추가된 Record 기능에 대해서 알아보고자 한다.

Record

Record의 정의는 다음과 같다.

  • 서로 다른 타입의 데이터를 모아 놓은 것
  • 각각의 타입마다 이름이 있어서 접근이 가능한 데이터 타입

포지셔널 파라미터를 이용한 레코드

void main() {
	// 정확한 위치에 어떤 타입의 값이 입력될지 지정할 수 있습니다.
	// (String, int)는 첫 번째 값은 String 타입이고 두 번째 값은 int 타입입니다.
	(String, int) minji = ('민지', 20);
}
  • 레코드는 다음과 같이 정의한다.

그리고 print문을 통해 접근하는 방식을 보면 다음과 같다.

void main() {
	(String, int) minji = ('민지', 20);
	print(minji) // ("민지", 20)
	print(minji.$1); // "민지"
	print(minji.$2); // 20
}

네임트 파라미터를 이용한 레코드

void main() {
	({String name, int age}) minji = (name: '민지', age: 20);
	print(minji); // (name: '민지', age: 20)
}

Record를 사용하면, 여러 타입을 하나의 타입으로 묶어서 사용할 수 있다.

예를들어, 사람의 속성에는 이름과 나이가 있으니, 이 둘을 nameage 로 묶어서 표현한 것이 위 예시이다.

데이터 클래스(혹은 구조체) vs 레코드

여기서 궁금증이 생긴다.

Q. Person 이라는 Class 나 Struct 를 만들어서 사용하면 되지 않을까?

class Person {
	final String name;
	final int age;
	Person({required this.name, required this.age});
}

이 데이터 클래스와 위에 있는 레코드에는 이름이 있고 없고의 차이말고는 기능상 차이는 보이지 않는다.

데이터 클래스는 데이터의 불변성이 있도록 구현할 수는 있지만, Record는 불변성 말고 가능성이 없다. 무조건 불변성이 유지된다. 데이터를 바꾸고 싶다면, 데이터 전체를 다시 구성해야한다. 그러므로 함수형 프로그래밍에 유리하다.

프로그래밍 언어마다 다르겠지만, Heap 영익 아닌 Stack 영역에 저장되는 점이 레코드의 장점으로 동작할 수 있다.

그리고 객체 리터럴이라는 이름이 공식명칭이긴하나, Record라고 불린다. (JavaScript 에서)

let person = {
	"name": "민지",
	age: 20,
};

consolo.log(person.name); // "민지"

정리하면 다음과 같다.

  • (프로그래밍 언어에 따라) 저장되는 메모리 영역 차이가 발생한다.
  • 레코드는 초기화 메서드를 사용하지 않아도 된다.
  • 레코드는 불변성을 보장할 수 있다보니, 함수형 프로그래밍에서 자주 사용되곤 한다.
  • 클래스는 확장이 가능하지만 레코드는 불가능하다.

언제 사용할까

사실 어떤 문법을 배우면 제일 중요한 것이, 언제 사용하는지이다.

레코드

  • 해당 데이터가 아주 짧은 생명주기를 가질 때, 사용하길 권장한다. 왜냐하면, 이름을 지정하지 않은 경우를 생각해보면 그 코드 이해하기 위한 많은 맥락을 읽어야하고 오해할 가능성이 존재하기 때문이다.
  • 불변성을 명시적으로 나타내고 싶을 때, 사용하면 좋다. + 함수형프로그래밍에서 좋다.
  • 절대 상속할 일이 없을 때, 사용하면 좋다.

데이터 클래스

  • 상속이 필요할 때, 써야한다.
  • 데이터의 생명주기가 전역범위에 가까울수록 데이터 클래스로 정의하는 것이 좋다.
  • 객체 속성인 참조를 활용한 기능구현이 필요하다면, 데이터 클래스를 사용한다.
  • 다형성이 필요할 경우 데이터 클래스를 사용한다.
profile
iOS & Flutter

0개의 댓글