Flutter/Dart

다트 자료형, Dart Built-in Types

호기심이 많은 mayleaf 2021. 8. 29. 01:07

안녕하세요 오늘은 다트 자료형에 대해서 다뤄보겠습니다.

자료형이란 자료의 형식입니다.

자료의 형태는 많은 종류가 있는데 아래 코드에서 먼저 보고 지나가도록 하겠습니다.

int number = 1; // 정수
double detailKg = 87.3; // 실수
String myName = 'mayleaf'; // 스트링
bool amIMayleaf = false; // 진리값
List<int> numbers = [1, 2, 3, 3, 5]; // 정수를 담은 리스트
Set avatarset = {1, 6, 3, 4}; // 정수를 담은 집합
Map<String, String> json = {'black': 'out', 'get the job': 'done'}; // <String, String>맵

이렇게 수많은 자료형들이 존재합니다.

숫자 , numbers

먼저 숫자들을 다뤄보려고 하는데요. 숫자형 타입들은 두 가지 종류가 있습니다

int와 double인데요.

 

int는 정수이며 표현 범위는 64비트를 사용하고 있고, 최대 표현 범위는 플랫폼마다 다릅니다.

네이티브 플랫폼에서의 최대 표현범위는 -2^63 ~ 2^63-1.

웹 플랫폼에서의 최대 표현범위는  -2^53 ~ 2^53 -1까지의 범위를 가지고 있습니다.

double은 실수형 타입입니다.

64비트 부동소수저을 사용하는 실수이며, IEEE 754 표준을 따릅니다.

 

int와 double 둘 다  num의 서브 타입인데요. num 타입은 사칙연산을 지원하며, abs():절댓값 구하기, ceil():올림, floor():내림 등의 함수가 있습니다. 만약에 num 타입에서 원하는 연산을 찾지 못한다면 dart:math라는 라이브러리에서 찾아보시면 됩니다.

문자열, strings

다트의 문자열은 UTF-16 를 사용합니다.

문자열을 다루는 방법에 대해서는 아래 예제 코드를 보면서 설명드리겠습니다.

String quote = 'mayleaf';
String doubleQuote = "mayleaf";
String multiLine = ''' i have
good friends
and bad friends''';
String multiLineWithDoubleQuote = """ I
have friends
that's true""";
String introduce = 'My name is $quote'; // My name is mayleaf
String expression = 'I have ${3*2} friends'; // I have 6 friends
String noodle = 'I have 5' + '2 friends'; // I have 52 friends

문자열 리터럴을 사용할 때에는 따옴표와 큰따옴표를 둘 다 사용할 수 있습니다.

여러 줄에 걸친 문자열을 만들고 싶다면 따옴표나 큰따옴표를 세 개 이어서 쓰면 됩니다.

문자열 내삽법(string interpolation)이 있어 introduce나 expression처럼  문자열 안에 원하는 변수를 넣어 문장을 만들 수 있습니다.

string 끼리 이어 붙이기 위해서(concatination)  + 연산을 사용할 수 있습니다.

 

그런데 저 introduce는 어느 시점에 초기화되나요?

리터럴 데이터는 컴파일 시간에 결정되는 상수라고 말씀드렸는데요. 문자열 내삽법을 사용하는 string의 경우 안에 보이는 표현식이 숫자나, null, bool이라는 것을 확인하고, 컴파일 시간 상수인 경우 컴파일 시간 상수로 사용합니다.

Booleans

다트에는 진리 값이 존재하는데요. 값이 참, 거짓으로만 구분되는 값입니다.

진리값 리터럴은 참, 거짓만 존재합니다.

Lists

거의 모든 언어에 있는 자료형이 바로 배열일 텐데요. 다트에서는 배열이 list입니다.

리스트를 다루는 법은 아래 예제 코드를 보면서 보겠습니다.

var airLines = ['a101', 'a102', 'a103', 'a104']; // list 리터럴 표현법
 
var bAirLines = ['b101', 'b102', 'b103', 'b104'];
 
var emptyAirLines = [];
 
var totalAirLines = [
  ...airLines, // spread 연산
  ...bAirLines,
  ...?emptyAirLines, // null-aware spread 연산
];
var totalAirLinesInKorea = [
  if(emptyAirLines.isNotEmpty) emptyAirLines, // emptyAirLines는 비어있기 때문에 추가 되지 않음
  for (var line in airLines) 'k-$line',
  for (var line in bAirLines) 'k-$line',
];

리스트를 리터럴 연산으로 만들기 위한 방법은 [] 표기를 사용하는 것인데요. 일반적인 다른 언어에서의 배열과 비슷합니다.

리스트에서 사용할 수 있는 연산은 많은 것이 있습니다. 대부분의 연산은 직관적이기 때문에 인텔리 센스를 사용하고 있다면 쉽게 파악하실 수 있을 거라고 생각합니다. 

 

그래서 두 종류의 연산만 소개하도록 하겠습니다.

그중 첫 번째가 spread 연산입니다. 리스트를 사용하면서 가장 편리하다고 생각하는 연산인데요.

totalAirLines를 보면 이 연산이 어떻게 사용되는지 볼 수 있습니다. 예제 코드처럼 보통 여러 리스트를 합칠 때 이런 spread 연산을 많이 사용합니다. 그런데 emptyAirLines처럼 빈 리스트에 spread 연산을 사용하면 에러가 납니다.

그래서 emptyAirLines처럼 spread 연산을 사용하려는 리스트가 비어있을 수 있다는 걸 아는 상황에서는 null-aware spread(...?) 연산을 사용하면 에러를 피할 수 있습니다.

※이런 spread연산 와 비슷한 연산을 가진 언어로 자바스크립트가 있습니다. 이 문법이 자바스크립트의 object destructuring 연산과 비슷하다는 생각이 듭니다.

 

두 번째는 collection ifcollection for입니다.

totalAirLinesInKorea를 보면 어떻게 사용하는지 알 수 있는데요.

collection if는 내부의 조건이 만족되면 리스트 내부에 원소가 추가되고 아니라면 추가되지 않습니다.

collection for는  for의 조건이 만족되는 동안 해당되는 리턴을 반환합니다.

 

둘 다 유용한 기능이며, 간단한 코드를 작성하는 데에 도움이 되니 기억해두면 좋을 것 같습니다.

Sets

다트에서의 집합은 우리가 아는 그 집합입니다. 원소 사이에 순서가 없고, 각각의 원소는 유일한 값을 가지죠.

집합, Set을 다루는 방법 역시 코드를 보며 확인하겠습니다.

var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'}; //literal 쓰는 법

var elements = <String>{};
elements.add('fluorine'); // 원소 하나를 집합에 추가하는 방법
elements.addAll(halogens); // halogens에 있는 모든 원소를 집합에 추가하는 방법

 

리터럴 집합은 중괄호를 통해서 사용할 수 있습니다.

집합에 원소를 추가하기 위해서는 add연산을 사용할 수 있고, 다른 컬렉션의 정보를 집합에 추가하기 위해서는 addAll연산을 사용하면 됩니다.

※집합에서도 spread 연산과, collection if, collection for 연산은 동일하게 사용 가능합니다.

Maps

일반적으로 맵은 키:값을 연결시키는 객체입니다. 키와 값 모두 어떤 타입이어도 상관없고요. 키는 반드시 한 객체에 하나만 쓰일 수 있고, 동일한 키를 여러 번 추가하거나 설정할 수 없습니다.

var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
}; // literal map

var gifts = Map<String, String>();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

var nobleGases = Map<int, String>();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';

var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

Map의 경우 굉장히 쓰임새가 많습니다. 필요한 정보를 유연하게 저장할 수 있기 때문에 앞으로 굉장히 많이 사용하게 될 예정입니다.

이 또한 직관적으로 사용 가능하기 때문에 더 자세한 설명이 필요하다고 생각되지 않습니다.

마무리

다트의 문법을 다루는 글을 시리즈로 적고 있습니다.

좋은 글을 꾸준히, 더 다듬어진 상태로 사람들이 볼 수 있도록 하고 싶습니다.

글을 읽으시면서 궁금한 내용이 있거나, 하고 싶은 말씀이 있으시면 댓글로 남겨주시기 바랍니다.

'Flutter > Dart' 카테고리의 다른 글

다트 자료형, Dart Built-in Types  (0) 2021.08.29
다트 변수, Dart Variable  (1) 2021.08.28
Dart 기본 예제  (0) 2021.08.27
Dart 개요 번역  (0) 2021.08.26