`covariant`와 `oldWidget`의 의미와 역할: Flutter에서 타입과 변수의 관계 이해하기

pharmDev·2024년 11월 27일

Flutter에서 상태(Stateful Widget)를 업데이트할 때 사용되는 didUpdateWidget 함수에서 자주 마주치는 코드 중 하나가 다음과 같은 선언입니다:

covariant _CustomVideoPlayer oldWidget;

이 문법은 Dart와 Flutter를 처음 접하는 사람들에게 다소 생소할 수 있습니다.
하지만 이것은 Flutter의 설계와 Dart의 타입 시스템을 이해하는 데 중요한 개념입니다.
이 포스팅에서는 이 선언의 의미필요성을 상세히 설명하고, 이를 쉽게 이해할 수 있도록 예제와 비유를 들어 설명합니다. 😊


1. covariant의 역할

covariant는 Dart에서 타입을 더 구체적으로 지정할 수 있게 하는 키워드입니다.
Flutter의 didUpdateWidget 함수는 기본적으로 부모 클래스인 Widget 타입을 사용합니다.
하지만, 우리가 정의한 위젯(예: _CustomVideoPlayer)의 고유 속성에 접근하려면, 더 구체적인 타입이 필요합니다.

문제

기본적으로 didUpdateWidget의 매개변수는 Widget 타입입니다:

void didUpdateWidget(covariant Widget oldWidget) {
  // ...
}

이 상태에서 _CustomVideoPlayer라는 위젯의 고유 속성(예: video)에 접근하려고 하면, 에러가 발생합니다:

if (oldWidget.video.path != widget.video.path) { // 에러 발생
  initializeController();
}

에러: The getter 'video' isn't defined for the type 'Widget'.

해결

covariant 키워드를 사용하면, Dart에게 "이 oldWidget_CustomVideoPlayer 타입임을 보장한다"고 알려줄 수 있습니다:

void didUpdateWidget(covariant _CustomVideoPlayer oldWidget) {
  if (oldWidget.video.path != widget.video.path) {
    initializeController();
  }
}

이렇게 하면 _CustomVideoPlayer 타입의 고유 속성에 안전하게 접근할 수 있습니다.
따라서 불필요한 타입 캐스팅을 없애고 코드 가독성을 높이는 효과를 얻을 수 있습니다.


2. _CustomVideoPlayer는 클래스인데 왜 타입이라고 하나요?

Dart에서는 클래스 이름이 변수 선언 시 타입으로도 사용됩니다.
즉, 클래스는 객체를 생성하기 위한 설계도이지만, 동시에 객체의 타입 역할을 하기도 합니다.

예제

class _CustomVideoPlayer {
  final String videoPath;
  _CustomVideoPlayer(this.videoPath);
}

// 객체 생성
_CustomVideoPlayer player = _CustomVideoPlayer('path/to/video.mp4');

여기서:

  • _CustomVideoPlayer클래스로서 객체를 생성하기 위한 설계도입니다.
  • 동시에, player 변수의 타입으로 사용되었습니다.
    Dart는 이 변수가 _CustomVideoPlayer 타입임을 보장합니다.

3. oldWidget이라는 이름의 의미

Flutter에서는 이전 상태의 위젯을 의미하는 변수에 관례적으로 oldWidget이라는 이름을 사용합니다.
이는 현재 위젯(widget)과 이전 위젯(oldWidget)을 비교하기 쉽게 하기 위한 네이밍 규칙입니다.

왜 필요할까?

didUpdateWidget 함수는 이전 위젯과 현재 위젯을 비교할 수 있는 기능을 제공합니다.
이 함수 내에서 oldWidget은 이전 위젯을, widget은 현재 위젯을 가리킵니다.

예제


void didUpdateWidget(covariant _CustomVideoPlayer oldWidget) {
  super.didUpdateWidget(oldWidget);

  // 이전 위젯과 현재 위젯의 동영상 경로를 비교
  if (oldWidget.videoPath != widget.videoPath) {
    initializeController();
  }
}

이 코드는 이전 위젯의 동영상 경로현재 위젯의 동영상 경로를 비교합니다.
경로가 다르면, 새로운 동영상 데이터를 로드하기 위해 initializeController()를 호출합니다.
_CustomVideoPlayer에서 videoPath가 정의되어 있고 이를 가져오기 위해 .videoPath를 사용합니다.


4. 간단한 비유로 이해하기

covariant의 역할

covariant를 사용하지 않으면, Dart는 모든 타입의 위젯(부모 클래스 Widget)을 다룰 준비를 합니다.
하지만 우리는 "특정 위젯(_CustomVideoPlayer)만 다룰 거야!"라고 Dart에게 알려주고 싶습니다.
covariant는 Dart에게 타입을 더 구체적으로 지정할 수 있도록 허용하는 역할을 합니다.

클래스가 타입처럼 사용되는 이유

클래스는 Dart에서 타입으로도 동작합니다.
예를 들어:

  • int는 Dart의 내장 타입이며 숫자를 저장합니다.
  • _CustomVideoPlayer는 우리가 만든 클래스이며, 동영상 관련 데이터를 저장합니다.
    Dart는 이를 타입처럼 사용해 변수나 매개변수 선언에 활용합니다.

oldWidget의 의미

oldWidget은 이전 상태의 위젯을 나타냅니다.
Flutter의 관습에 따라 이전 위젯과 현재 위젯을 구분하기 위해 이 이름을 사용합니다.


5. 결론

covariant _CustomVideoPlayer oldWidget처럼 선언했을까?

  1. covariant: _CustomVideoPlayer 타입의 고유 속성에 접근할 수 있도록 Dart에게 타입을 더 구체적으로 지정.
  2. _CustomVideoPlayer: 클래스이지만 Dart에서는 타입으로도 사용되며, 해당 변수에 저장될 객체의 형태를 규정.
  3. oldWidget: 이전 위젯을 나타내는 변수 이름으로, Flutter의 관례를 따름.

한 줄 요약

covariant _CustomVideoPlayer oldWidget"이전 위젯을 _CustomVideoPlayer 타입으로 명시해, 고유한 속성에 안전하게 접근하려는 선언"입니다.
Flutter의 상태 관리와 Dart의 타입 시스템을 이해하는 중요한 개념이니 꼭 기억하세요! 😊

profile
코딩을 배우는 초보

0개의 댓글