Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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 31
Archives
Today
Total
관리 메뉴

nomad-programmer

[Programming/Dart] 유용한 기법 (계단식 표기법, 컬렉션 if, 컬렉션 for, null) 본문

Programming/Dart

[Programming/Dart] 유용한 기법 (계단식 표기법, 컬렉션 if, 컬렉션 for, null)

scii 2020. 10. 6. 23:09

다트의 버전이 올라가면서 유용한 기능이 계속해서 추가되고 있는데, 이러한 기능들을 잘 사용하면 좀 더 간결한 코드를 작성하는 데 도움이 된다. 계단식 표기법, 컬렉션 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# 언어에서의 개념과 같다.
Comments