관리 메뉴

IT Story

Dart Cascade Operator 본문

Programming/Dart

Dart Cascade Operator

#root 2025. 4. 3. 14:34

Dart Cascade Operator (.., ?..) 완벽 가이드

Dart의 Cascade Operator (.., ?..)는 동일한 객체에 대한 여러 연산을 체이닝(Chaining) 방식으로 수행할 수 있도록 도와주는 강력한 기능입니다. 이를 활용하면 코드가 간결해지고 가독성이 향상됩니다.


1. Cascade Operator란?

 

Dart의 Cascade Operator는 객체를 여러 번 참조할 때 유용한 문법입니다. 이를 통해 중복된 코드 작성을 피할 수 있으며, 메서드 호출 및 필드 값을 설정하는 작업을 간결하게 표현할 수 있습니다.

Cascade Operator에는 두 가지 유형이 있습니다.

  • .. (Double Dot): 널이 아닌 객체에 대해 연산을 수행
  • ?.. (Null-aware Cascade): 널일 수 있는 객체에 대해 안전하게 연산 수행

 

 

2. Cascade Operator의 사용법

 

2.1 기본 예제

아래 예제에서 Cascade Operator를 사용하지 않는 경우와 사용하는 경우를 비교해 보겠습니다.

(1) Cascade Operator 없이 객체 설정

class Person {
  String? name;
  int? age;

  void setName(String name) {
    this.name = name;
  }

  void setAge(int age) {
    this.age = age;
  }

  void introduce() {
    print('My name is $name and I am $age years old.');
  }
}

void main() {
  var person = Person();
  person.setName('Alice');
  person.setAge(25);
  person.introduce();
}

위 코드는 person 객체를 생성한 후, 각각의 메서드를 호출하여 name과 age 값을 설정합니다. 하지만 객체를 계속해서 반복 참조해야 하기 때문에 코드가 길어지고 가독성이 떨어집니다.


 

(2) Cascade Operator 사용

void main() {
  var person = Person()
    ..setName('Alice')
    ..setAge(25)
    ..introduce();
}

🔹 차이점:

  • .. 연산자를 사용하여 동일한 객체(person)에서 여러 메서드를 한 번에 호출
  • 객체를 반복 참조하지 않아 코드가 짧고 직관적

 

3. Cascade Operator의 주요 활용법

3.1 객체 필드 초기화

객체를 생성할 때 여러 필드를 한 번에 설정할 수 있습니다.

class Car {
  String? brand;
  String? model;
  int? year;

  void showInfo() {
    print('Car: $brand $model, Year: $year');
  }
}

void main() {
  var myCar = Car()
    ..brand = 'Tesla'
    ..model = 'Model 3'
    ..year = 2023
    ..showInfo();
}

 

3.2 메서드 체이닝

여러 메서드를 한 번에 호출할 때 유용합니다.

class Counter {
  int value = 0;

  void increment() => value++;
  void decrement() => value--;
  void printValue() => print('Counter: $value');
}

void main() {
  var counter = Counter()
    ..increment()
    ..increment()
    ..decrement()
    ..printValue();
}

 

4. Null-aware Cascade (?..) 사용법

?.. 연산자는 객체가 null일 가능성이 있을 때 안전하게 메서드나 필드 접근을 수행할 수 있습니다.

 

4.1 Null-aware Cascade 예제

class User {
  String? username;
  void greet() => print('Hello, $username');
}

void main() {
  User? user = null;

  user
    ?..username = 'Charlie'
    ?..greet(); // 실행되지 않음 (user가 null이므로)
}

🔹 설명:

  • user가 null이므로 ?.. 뒤의 코드가 실행되지 않음
  • NullPointerException을 방지

 

 

5. Cascade Operator와 메서드 체이닝 차이점

메서드 체이닝Cascade Operator는 비슷해 보이지만 차이점이 있습니다.

 

5.1 메서드 체이닝과 비교

class Builder {
  String message = '';

  Builder append(String text) {
    message += text;
    return this;
  }

  void show() {
    print(message);
  }
}

void main() {
  var builder = Builder()
    .append('Hello ')
    .append('World!')
    ..show(); // 메서드 체이닝 + Cascade Operator 혼합 사용 가능
}

📌 차이점:

  • 메서드 체이닝: 각 메서드가 this를 반환해야 연속 호출 가능
  • Cascade Operator: 반환 값이 없어도 객체 상태를 변경 가능

 

6. Cascade Operator의 장점과 단점

장점

  1. 코드 가독성 향상
    • 객체를 여러 번 참조하지 않아 깔끔한 코드 작성 가능
  2. 중복 코드 감소
    • object.property = value; 같은 반복적인 코드가 줄어듦
  3. 메서드 체이닝과 함께 사용 가능
    • 더 직관적인 코드 스타일 가능

단점

  1. 메서드의 반환값을 사용할 수 없음
    • ..은 객체를 반환하므로, 메서드가 return 값을 반환할 때는 사용할 수 없음
  2. 디버깅이 어려울 수 있음
    • 연속적인 호출에서 어느 부분이 실패했는지 찾기 어려울 수 있음

 

 

7. 실전 예제: JSON 파싱과 Cascade Operator 활용

import 'dart:convert';

class Product {
  String? name;
  double? price;
  
  Product({this.name, this.price});
  
  void show() => print('Product: $name, Price: $price');
}

void main() {
  String jsonString = '{"name": "Laptop", "price": 1299.99}';
  Map<String, dynamic> jsonMap = jsonDecode(jsonString);

  var product = Product()
    ..name = jsonMap['name']
    ..price = jsonMap['price']
    ..show();
}

📌 설명:

  • JSON 데이터를 디코딩한 후, Cascade Operator를 활용해 Product 객체를 초기화
  • 객체 설정과 메서드 호출을 간결하게 처리

 

 

8. 결론

Dart의 Cascade Operator (.., ?..) 는 객체의 필드 설정과 메서드 호출을 간결하게 만들어주는 강력한 기능입니다.

  • .. 연산자는 객체가 null이 아닐 때 여러 연산을 연속적으로 실행
  • ?.. 연산자는 객체가 null일 경우 안전하게 실행을 중단

이를 적절히 활용하면 가독성이 좋고 유지보수가 쉬운 코드를 작성할 수 있습니다.
특히, 객체 초기화, JSON 데이터 매핑, 빌더 패턴 등 다양한 상황에서 유용하게 활용할 수 있습니다. 🚀

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

Dart 비동기 프로그래밍  (0) 2025.04.07
Dart 컬렉션  (0) 2025.04.04
Dart Static  (0) 2025.04.03
Dart Generic  (0) 2025.04.03
Dart Abstract  (0) 2025.03.28