Flutter

[Dart] 캐스케이드 연산자(Cascade notation)란?

참깨빵위에참깨빵_ 2023. 8. 5. 21:01
728x90
반응형

캐스케이드 연산자는 .. 연산자를 사용해서 특정 인스턴스의 속성이나 멤버 함수를 연속해서 사용할 수 있게 하는 연산자다. 자바로 치면 빌더 패턴을 통한 메서드 체이닝이 비슷한 형태고, 코틀린이면 apply, run, also 같은 범위 지정 함수가 비슷한 형태다.

공식문서의 캐스케이드 연산자에 대한 설명은 아래와 같다.

 

https://dart.dev/language/operators#cascade-notation

 

Operators

Learn about the operators Dart supports.

dart.dev

캐스케이드(.., ?..)를 사용하면 같은 객체에 대해 일련의 작업을 수행할 수 있다. 인스턴스 멤버에 접근하는 것 외에도 같은 객체에서 인스턴스 메서드를 호출할 수도 있다. 이렇게 하면 임시 변수를 만드는 단계가 줄어들고 더 유동적인 코드를 작성할 수 있다
var paint = Paint()
  ..color = Colors.black
  ..strokeCap = StrokeCap.round
  ..strokeWidth = 5.0;
생성자 Paint()는 Paint 객체를 리턴한다. 캐스케이드 표기법을 따르는 코드는 반환될 수 있는 모든 값을 무시하고 이 객체에서 작동한다. 캐스케이드를 쓰지 않으면 아래 코드와 같은 형태가 된다
var paint = Paint();
paint.color = Colors.black;
paint.strokeCap = StrokeCap.round;
paint.strokeWidth = 5.0;
캐스케이드가 작동하는 객체가 null일 수 있는 경우 첫 번째 연산자에 null-shorting 캐스케이드(?..)를 사용한다. "?.."로 시작하면 해당 null 객체에서 연속 작업이 시도되지 않는다
querySelector('#confirm') // Get an object.
  ?..text = 'Confirm' // Use its members.
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'))
  ..scrollIntoView();
캐스케이드를 중첩할 수도 있다
final addressBook = (AddressBookBuilder()
      ..name = 'jenny'
      ..email = 'jenny@example.com'
      ..phone = (PhoneNumberBuilder()
            ..number = '415-555-0100'
            ..label = 'home')
          .build())
    .build();
실제 객체를 반환하는 함수에서 캐스케이드를 구성하도록 주의하라. 아래 코드는 에러가 발생하는 코드다. sb.write() 호출은 void를 리턴하며 void에서 캐스케이드를 구성할 수 없다
var sb = StringBuffer();
sb.write('foo')
  ..write('bar'); // Error: method 'write' isn't defined for 'void'.

 

다른 예제 코드를 확인해 본다.

 

class Person {
  late String name;
  late int age;

  void hello() {
    print('안녕하세요! $age살인 $name입니다');
  }
}

void main() {
  var person = Person()
    ..name = "김철수"
    ..age = 14
    ..hello();
}

 

원래라면 person 참조를 통해 변수에 값을 설정하거나 함수를 호출하는 등 작업을 해야 하지만 캐스케이드 연산자를 쓰면 person이란 객체를 연달아 사용하지 않아도 되는 걸 볼 수 있다.

반응형