Dart 공식문서와 노마드코더 Dart 시작하기 강의를 보고 내용을 정리하였습니다.
List
리스트를 정의하는 방법은 두가지이다.
1. var
void main() {
var numbers = [1, 2, 3, 4];
}
2. 타입 명시
아래 코드는 int 타입
으로 이루어진 List
라는 의미이다.
void main() {
List<int> nums = [1, 2, 3, 4];
}
만약 int
로 이루어진 List
라고 정의를 한 뒤 다른 타입을 추가하려고 하면 오류가 발생한다.
같은 타입의 자료형만 추가할 수 있다.
void main() {
var numbers = [1, 2, 3, 4];
numbers.add('jea'); // Error: The argument type 'String' can't be assigned to the parameter type 'int'
print(numbers);
}
Dart에선 쉼표의 유, 무에 따라 포맷팅이 된다.
쉼표를 붙이면 쉼표를 기준으로 줄 바꿈이 되고, 붙이지 않으면 줄 바꿈 되지 않는다.
void main() {
var hasFive = true;
// 쉼표 붙이기 전 (포맷팅 전)
var numbers = [1, 2, 3, 4];
}
void main() {
var hasFive = true;
// 쉼표 붙이기 -> var numbers = [1, 2, 3, 4,]; 이렇게 작성 후 저장하면 아래 처럼 포맷팅 됨
var numbers = [
1,
2,
3,
4,
];
}
Collection if
List
내에서 if문
을 처리하면서 존재 할 수도, 안할 수도 있는 요소를 가지고 올 수 있다. (조건문 처리)
- collection if
적용 전
void main() {
var hasFive = true;
var numbers = [1, 2, 3, 4];
if (hasFive) {
numbers.add(5);
}
}
- collection if
적용 후
리스트 내부에 if문을 작성하여 코드를 더욱 간결하게 작성할 수 있다.
void main() {
var hasFive = true;
var numbers = [
1,
2,
3,
4,
if (hasFive) 5,
];
print(numbers); // [1, 2, 3, 4, 5]
}
Collection for
List
내에서 반복문을 처리해준다.
- collection of
적용 전
void main() {
var oldFriends = ['치킨', '피자'];
var newFriends = [
'nico',
'lynn',
];
for(var friend in oldFriends) {
newFriends.add('💕' + friend);
}
print(newFriends); // [nico, lynn, 💕 치킨, 💕 피자]
}
- collection of
적용 후
void main() {
var oldFriends = ['치킨', '피자'];
var newFriends = [
'nico',
'lynn',
for (var friend in oldFriends) "💕 $friend",
];
print(newFriends); // [nico, lynn, 💕 치킨, 💕 피자]
}
Set
중복되지 않는 자료구조이다.
JavaScript에도 Set
자료구조가 있다.
List vs Set
// List
void main() {
var numbers = [1, 2, 3, 4];
numbers.add(1);
numbers.add(1);
numbers.add(1);
print(numbers); // [1, 2, 3, 4, 1, 1, 1]
}
// Set
void main() {
var numbers = {1, 2, 3, 4};
numbers.add(1);
numbers.add(1);
numbers.add(1);
print(numbers); // {1, 2, 3, 4}
}
Map
JavaScript와 TypeScript의 Object와 비슷한 자료구조이다.
자바스크립트에도 Map
자료구조가 존재한다.
void main() {
var player = {
'name': '재영',
'xp': 20.99,
'superpower': false,
};
}
위 코드를 IDE를 통해 player의 type
을 확인해보면 Map<String, Object>
로 되어있는 것을 확인할 수 있다.
객체의 key는 String
타입, value는 Object
타입으로 이루어져 있다고 되어있는 것이다.
이처럼 Map의 타입을 정하기 위해서는 Map<key타입, value타입>
으로 작성하면 된다.
이 때 Object는 TS의 any
와 같다고 보면 된다.
Dart에서 모든 것이 Object
이기 때문에 모두 포괄할 수 있다.
중첩된 타입을 적을수도 있다.
void main() {
Map<List<int>, bool> temp = {
[1, 2, 3]: true,
};
}
Map 생성자
를 사용하면 다음과 같다.
void main() {
var gifts = Map<String, String>();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';
print(gifts); // {first: partridge, second: turtledoves, fifth: golden rings}
}
만약 api구조의 데이터와 같이 key와 value의 데이터를 가지는데, 특정 형태를 가질 땐 클래스로 만드는 것을 추천한다고 한다.
왜 그런지 생각해봤을 때 Map 생성자
를 사용하여 gifts
가 추가되는 것을 보면
쉽게 데이터가 변경될 수 있어서 오류가 나기 참 좋을 것 같다는 생각이 들었다.
만약 구조가 정해져 있는 데이터를 다룬다면 클래스로 구조를 명확하게 만들어서
코드를 수정하거나 업데이트할 때 오류를 좀 더 줄일 수 있지 않을까 싶다.
추가로 찾아보니 Map
은 동적으로 데이터를 추가하거나 삭제할 수 있기 때문에 컴파일러가 타입 안정성을 보장할 수 없는데,
클래스
를 사용하면 필드가 불변이거나 수정 가능한지 여부를 명확하게 지정할 수 있어서
컴파일러가 코드의 타입 안정성을 더욱 보장할 수 있다고 한다.
String interpolation
String interpolation은 문자열 보간이라고 하는데,
string에 변수를 사용하는 방법을 뜻한다.
자바스크립트에서 Template Literals(템플릿 리터럴)과 사용법이 같은 듯 다르다.
- 변수가 이미 존재할 때
void main() {
var name = '재영';
var greeting = 'Hello~ I\'m $name';
print(greeting); // Hello~ I'm 재영
}
자바스크립트에선 $
뒤에 중괄호로 변수를 감싸주어 사용하는데,
Dart에선 중괄호 없이 $
뒤에 변수를 사용한다.
- 계산이 필요한 변수일 때
void main() {
var name = '재영';
var age = 20;
var greeting = 'Hello~ I\'m $name. And ${age+2} years old!';
print(greeting); // Hello~ I'm 재영. And 22 years old!
}
계산이 필요한 변수라면 이 땐 중괄호로 감싸주어 사용한다.
'Mobile App > Flutter | Dart' 카테고리의 다른 글
다트[Dart] | Flutter가 Dart를 사용하는 이유 + Dart 기본(1) (0) | 2023.04.25 |
---|---|
Flutter/Dart를 공부하려는 이유 (0) | 2023.04.10 |