Dot shorthands(점 축약 문법)

.foo 점 축약 문법은 타입 이름을 생략할 수 있습니다. 컴파일러가 문맥으로부터 대상 타입을 추론할 수 있다면 더 간결한 Dart 코드를 작성할 수 있습니다. 열거형 값, 정적 멤버, 생성자에 접근할 때 타입.foo를 전부 적지 않아도 됩니다.

간단히 요약하면 다음과 같습니다. 점 축약 표현은 아래 형식으로 시작할 수 있으며, 뒤에 다른 연산을 연쇄 호출할 수 있습니다.

  • 식별자 .myValue
  • 생성자 .new()
  • 상수 생성 const .myValue()

예시

enum Status { none, running, stopped, paused }

class Point {
  final int x, y;
  Point(this.x, this.y);
  Point.origin() : x = 0, y = 0;
}


void main() {
    // 이름 있는 생성자 축약
    Point origin = .origin(); // Point.origin()과 동일
  
    // 열거형 축약
	Status currentStatus = .running; // Status.running과 동일

	// 정적 메서드 축약
	int port = .parse('8080'); // int.parse('8080')과 동일

}Code language: Dart (dart)

문맥 타입(Context type)

점 축약 문법은문맥 타입을 통해 컴파일러가 해당 타입 멤버를 추론하도록 합니다.

문맥 타입: 표현식이 놓인 위치 기준으로 Dart가 이곳에 기대하는 데이터 타입을 의미합니다.

예: Status currentStatus = .running

컴파일러는 변수가 Status 타입임을 인지하므로 .runningStatus.running으로 해석합니다.

어휘 구조와 문법

정적 멤버 축약은.로 시작하는 표현식입니다. 문맥으로 타입을 확정할 수 있으면 정적 멤버, 생성자, 열거 상수를 축약해서 접근할 수 있습니다.

적용 가능한 상황

1. 열거형

값 할당이나 switch 비교 시 열거 타입이 명확하므로 축약 문법 활용하기 좋습니다.

enum LogLevel { debug, info, warning, error }

String colorCode(LogLevel level) {
  return switch (level) {
    .debug => 'gray',
    .info => 'blue',
    .warning => 'orange',
    .error => 'red',
  };
}

void main() {
   // 호출 예시
   String warnColor = colorCode(.warning); //LogLevel.warning으로 자동 인식
}Code language: Dart (dart)

2. 이름 지정 생성자 / 팩토리 생성자

제네릭 클래스 생성자에 타입 매개변수를 전달하는 경우도 지원합니다.

class Point {
  final double x, y;
  const Point(this.x, this.y);
  const Point.origin() : x = 0, y = 0;

  factory Point.fromList(List<double> list) => Point(list[0], list[1]);
}



void main() {
    Point origin = .origin();
	Point p1 = .fromList([1.0, 2.0]);

	// 제네릭 클래스
	List<int> intList = .filled(5, 0); // List.filled(5,0)
}Code language: Dart (dart)

3. 매개변수 없는 생성자 .new

.new는 클래스의 기본 무명 생성자를 축약 호출하는 문법입니다. 상태 클래스의 필드를 대량 초기화할 때 유리하며 제네릭 매개변수도 자동 추론됩니다.

// 축약 사용 전
late final AnimationController _animationController = AnimationController(vsync: this);
final ScrollController _scrollController = ScrollController();

// 축약 사용 후
late final AnimationController _animationController = .new(vsync: this);
final ScrollController _scrollController = .new();
final GlobalKey<ScaffoldMessengerState> scaffoldKey = .new();
Map<String, Map<String, bool>> properties = .new();Code language: Dart (dart)

4 정적 멤버(정적 메서드, 정적 필드)

int httpPort = .parse('80');        // int.parse('80')
BigInt bigIntZero = .zero;          // BigInt.zeroCode language: Dart (dart)

5 상수 표현식

상수 문맥 안에서는 참조 대상 멤버가 컴파일 타임 상수라면 축약 표현을 사용할 수 있습니다.

enum Status { none, running }
class Point {
  final double x, y;
  const Point(this.x, this.y);
  const Point.origin() : x = 0.0, y = 0.0;
}

const Status defaultStatus = .running;
const Point myOrigin = .origin();
const List<Point> keyPoints = [.origin(), .new(1.0, 1.0)];Code language: Dart (dart)

연쇄 호출

축약 표현 뒤에 인스턴스 메서드나 속성을 연쇄해서 호출할 수 있습니다. 컴파일러가 먼저 문맥으로 축약 대상을 분석하고, 이후 연쇄 호출의 반환 타입은 호환되어야 합니다.

String lowerH = .fromCharCode(72).toLowerCase();
// String.fromCharCode(72).toLowerCase()
print(lowerH); // hCode language: JavaScript (javascript)
void main() {
    String lowerH = .fromCharCode(72).toLowerCase();
	// String.fromCharCode(72).toLowerCase()
	print(lowerH); // h
}Code language: Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
h
Code language: CSS (css)

Dot shorthands(점 축약 문법)

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다