일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 깃
- Unity
- 구조체
- 도커
- dart 언어
- c언어
- Flutter
- Data Structure
- 유니티
- c# winform
- Python
- c# 추상 클래스
- C언어 포인터
- 플러터
- 포인터
- HTML
- docker
- c# 윈폼
- C++
- C# delegate
- git
- Houdini
- jupyter lab
- vim
- github
- jupyter
- 다트 언어
- Algorithm
- gitlab
- c#
- Today
- Total
nomad-programmer
[Programming/Dart] 유용한 기법 (계단식 표기법, 컬렉션 if, 컬렉션 for, null) 본문
다트의 버전이 올라가면서 유용한 기능이 계속해서 추가되고 있는데, 이러한 기능들을 잘 사용하면 좀 더 간결한 코드를 작성하는 데 도움이 된다. 계단식 표기법, 컬렉션 if, 컬렉션 for, null을 다루는 연산자를 알아보자.
계단식 표기법 .. 연산자
계단식 표기법(cascade notation) .. 연산자를 사용하면 동일 객체에서 일련의 작업을 수행할 수 있다. 컬렉션의 add() 메소드는 void를 반환하고 remove() 메소드는 bool을 반환하지만 '..' 연산자를 사용하면 메소드를 수행한 객체의 참조를 반환한다.
다음은 리스트에 6을 추가하고 2를 제거하여 출력하는 코드이다.
void main() {
final items = [1, 2, 3, 4, 5];
var result = items;
result.add(6);
result.remove(2);
print(result);
}
/* 결과
[1, 3, 4, 5, 6]
*/
.. 연산자를 사용하면 다음과 같이 표현할 수 있다.
void main() {
final items = [1, 2, 3, 4, 5];
print(items..add(6)..remove(2));
}
/* 결과
[1, 3, 4, 5, 6]
*/
매번 리스트가 반환되어 임시 변수를 만드는 단계가 절약되고 더 유동적인 코드를 작성할 수 있다.
컬렉션 if
조건에 의해 컬렉션의 값을 조정하거나 다르게 사용하고 싶을 때 일반적인 방법은 다음과 같다.
void main() {
bool promoActive = false;
if(promoActive){
print([1, 2, 3, 4, 5, 6]);
}
else{
// 출력
print([1, 2, 3, 4, 5]);
}
}
다트에서는 컬렉션 내부에 if문이나 for문을 사용할 수 있다 (이 때 { } 블록은 사용할 수 없음). 컬렉션 if를 사용하면 임시 변수를 작성하지 않아도 되며 좀 더 유동적인 코드를 작성할 수 있다.
void main() {
bool promoActive = false;
print([1, 2, 3, 4, 5, if(promoActive) 6]);
}
/* 결과
[1, 2, 3, 4, 5]
*/
컬렉션 for
다음과 같이 컬렉션 문법 안에서 for 문을 사용할 수 있다.
void main() {
List<int> list = [1, 2, 3];
List<String> strList = [
'#0',
for(int i in list) '#$i'
];
// #0, #1, #2, #3
strList.forEach(print);
}
null 처리에 관한 기능
값이 없다는 의미의 null은 에러를 유발하기 쉽다. 값이 null인 객체에 접근해 조작하면 프로그램은 에러를 내면서 중지하게 된다.
String name = null;
print(name.length); // 에러
위 코드를 실행하면 에러가 발생한다.
다트는 null을 처리할 수 있는 여러 가지 방법을 제공한다.
참고로 다트에서는 C#과 마찬가지로 모든 것이 객체이다. 심지어 int, double, bool 같은 타입도 모두 클래스이다. 이러한 타입들은 모두 null 값을 가질 수 있다 (C#은 참조형식만 null을 가질 수 있다. 값 형식이 가지려면 ?를 붙여야 함). 그러므로 다트에서 모든 타입은 null일 수 있다.
일반적으로 프로그래밍에서는 if 문을 사용하여 null인지 아닌지 검사한다.
if(name != null) {
print(name.length);
}
그런데 다트에서 제공하는 ?. 연산자를 사용하면 null 여부를 간단히 판단할 수 있다. 객체의 프로퍼티나 메소드에 접근할 때 . 연산자 대신 ?. 연산자를 사용하면 객체가 null 일 때 에러를 발생하는 대신 null 을 반환한다 (C#과 같다).
print(name?.length);
?? 연산자는 객체가 null일 때 작동을 간단히 구현하는 데 사용한다. 예를 들어 객체가 null이 아니면 길이를, null이면 0을 반환하는 코드는 일반적으로 다음과 같이 작성한다.
if(name != null) {
print(name.length);
}
else {
print(0);
}
하지만 ?? 연산자를 사용하면 다음과 같이 간단히 작성할 수 있다.
print(name?.length ?? 0);
name이 null이면 0을 출력한다.
?. 연산자 그리고 ?? 연산자 모두 C#에서 사용되어지는 연산자들이며 C# 언어에서의 개념과 같다.
'Programming > Dart' 카테고리의 다른 글
[Programming/Dart] Stream : async*, yield (0) | 2020.10.10 |
---|---|
[Programming/Dart] 비동기 프로그래밍 : futures, async, await (2) | 2020.10.10 |
[Programming/Dart] 함수형 프로그래밍 (Functional Programming) (2) | 2020.10.06 |
[Programming/Dart] Collection (0) | 2020.10.06 |
[Programming/Dart] 객체 지향 프로그래밍 (Object-Oriented Programming) (0) | 2020.10.06 |