[Dart] Method.call() 은 무엇인가

Minji Jeong·2024년 6월 8일
1

Flutter/Dart

목록 보기
7/13
post-thumbnail

플러터 개발을 하시다보면 이런 코드를 보시게 될 것입니다.

class CommonTextWidget extends StatelessWidget {
  const CommonTextWidget({
    super.key, 
    this.text,
    this.onPressed,
  });

  final String? text;
  final VoidCallback? onPressed;

  
  Widget build(BuildContext context) {
    return TextButton(
        onPressed: () {
          onPressed?.call();
        },
        child: Text(text ?? '')
    );
  }
}

위 코드를 예시로 들었을 때 onPressed?.call() 이나 onPressed!() 을 호출하는 것이나 동일한데, 그렇다면 좀 더 짧은 onPressed!()를 사용하는 것이 낫지 않나 싶을 수도 있습니다. 당연히 이건 상황이 어떠냐에 따라 달라질 수 있습니다.

먼저 다트는 순수 객체지향 언어로, 매개변수 또는 리턴타입을 갖는 Function 타입의 모든 함수들은 객체입니다. 따라서 다트의 모든 함수들은 마치 클래스의 멤버함수처럼 내부에 call method를 갖고 있으며, call method는 일반 함수 호출 방식과 동일하게 작용합니다.

또한 비슷하면서 다른 얘기지만 다트는 Callable classes를 지원합니다. 따라서 클래스 내부에 call() 메서드를 구현해서 클래스의 인스턴스를 함수처럼 호출할 수도 있습니다.

class Test {
  void call(String str) {
    print(str);
  }
}

void main() {
  var test = Test();
  test("Minji");
}

test("Minji")test.call("Minji")과 동일합니다.

함수 호출 방식은 상황에 따라 자유롭게 사용할 수 있습니다. 다만 저는 null check operator (!) 사용을 지양하는 편이라 제가 null 타입이 아님을 보장할 수 없을 때에는 nullable 연산자를 사용해서 call()를 호출하려고 하는 편입니다.

onPressed?.call()

References

What is Dart call()?
What is the implementation of call() in dart?

profile
Software Engineer

0개의 댓글