1개는 알고있는 상태이기에 그 외의 개수에 의문이 든 것이라 생각하고 작성하지 않는다.
간혹 list를 다루는 글들을 보다보면 점이 2개, 3개 붙어있는 요상한 친구들이 보이는데 의미를 몰라 코드 해석을 정확히 할 수 없었다.
이에 대해 찾아보고 정리했다.
2개 (cascade notation)
생성한 object 자신의 멤버를 이어서 호출할 수 있도록 해준다.
출력 결과를 보면 알겠지만 paint1과 paint2는 같은 의미로 작성된다.
위 예제에선 없지만 멤버 함수도 호출된다.
하지만 알아둬야 할 것은 마지막에 호출한 멤버 함수의 return을 받거나 중간에 호출한 멤버 함수의 return을 받아 중간에 사용하는 것이 아니다.
제대로 이해 못하고 아래 예시 코드를 짜니 문제가 발생했다.
출력하면 에러가 발생한다.
ImageMaker가 OwnImage로 될 수 없다는 에러이다.
혹시 중간에 값이 반환되는 함수가 껴있으면 마법같은 일을 해줄까 했지만 역시나 아니다. (글을 쓰다가 다시 생각해보니 당연히 안되야 하는게 맞는것 같다. 이게 동작한다면 코드 읽기가 어려워 질 여지가 있어보인다.)
첫 예제에서 같은 의미라고 했던 것들을 다시 보면 이 에러가 당연한 것이다.
에러를 발생시킨 구문만 보면 아래처럼 바뀐다
//OwnImage image =
// ImageMaker()..setShape('circular')..setUrl('image path')..build(); 이 문장은 실제론 아래처럼 동작
OwnImage image = ImageMaker();
image.setShape('circular');
image.setUrl('image path');
image.build();
일단 첫 문장부터 에러인 것이다.
당연히 ImageMaker는 OwnImage를 상속받은 것도 아니기 때문에 에러이다.
만약 첫 .. 에 ?.. (null-aware)를 입력하면 생성자로 생성된 인스턴스 앞에 ?가 붙으며 동작하는 것과 같다.
첫 예제 코드를 예시로 하면 아래와 같다.
Paint paint1 = Paint();
?..color = Colors.white;
..strokeCap = StrokeCap.round;
..strokeWidth = 5.0;
// 위 아래 같은 의미의 코드
Paint paint1 = Paint();
paint1?.color = Colors.white;
paint1?.strokeCap = StrokeCap.round;
paint1?.strokeWidth = 5.0;
3개 (spread operator)
Dart 2.3에서 소개된 연산자
한 list의 값들을 다른 list로 쉽게 이동시킬 수 있는 연산자이다.
list 말고도 set, map과 같은 collection도 가능하다.
단, map은 map이면서 같은 제너릭타입끼리(또는 dynamic인 경우)만 가능한 것으로 보인다.(물론 list나 set을 키 또는 값 자체로 넣는 (내 입장에서) 변태짓을 하면 작동하긴 한다.)
list2에 값을 넣을 때 ...list1을 썼는데 list2에 list1의 값들을 그대로 넣는단 의미이다.
...?(null-aware) 로 널이면 들어가지 않도록 할 수도 있다.
set에 list를 넣을 수도 있다.
아래는 map 사용한 것이다.
참고
cascade notation
spread operator
'개발 > Dart' 카테고리의 다른 글
Object dynamic var 차이 (0) | 2022.08.02 |
---|---|
Built-in Type (0) | 2022.07.26 |
factory 키워드 (싱글턴 패턴) (0) | 2022.05.26 |