Menu
Coddy logo textTech

Callable 클래스

Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 110개 중 84번째.

Dart에서는 call() method를 구현하여 class의 인스턴스를 function처럼 callable하게 만들 수 있습니다. 이를 통해 인스턴스에 괄호를 직접 사용하여 function call 구문으로 object를 사용할 수 있습니다.

class Multiplier {
  final int factor;
  
  Multiplier(this.factor);
  
  int call(int value) {
    return value * factor;
  }
}

void main() {
  var double = Multiplier(2);
  var triple = Multiplier(3);
  
  print(double(5));   // 10 - 객체를 함수처럼 호출하기
  print(triple(5));   // 15
}

double(5)을 작성하면 Dart는 5를 인수로 사용하여 call() method를 자동으로 호출합니다. 이 object는 상태(factor field)를 유지하면서 function처럼 동작합니다.

call() method는 어떤 시그니처든 가질 수 있습니다. 여러 parameter, 선택적 parameter 또는 서로 다른 유형을 return할 수도 있습니다.

class Greeter {
  final String greeting;
  
  Greeter(this.greeting);
  
  String call(String name, {String punctuation = '!'}) {
    return '$greeting, $name$punctuation';
  }
}

void main() {
  var hello = Greeter('Hello');
  print(hello('Alice'));              // Hello, Alice!
  print(hello('Bob', punctuation: '.')); // Hello, Bob.
}

Callable 클래스는 상태 또는 구성과 결합된 함수와 유사한 동작이 필요할 때 유용합니다. 호출 사이에 설정을 기억해야 하는 재사용 가능한 작업, 검증기 또는 변환을 만들 때 흔히 사용됩니다.

challenge icon

챌린지

쉬움

callable class를 사용하여 텍스트 formatter 시스템을 만들어 봅시다! 텍스트를 다양한 방식으로 변환하기 위해 function처럼 호출할 수 있는 object를 만들고, 각 object가 자체 configuration 설정을 유지하도록 합니다.

코드를 두 개의 파일로 구성합니다:

  • formatters.dart: 텍스트를 변환하는 두 개의 callable class를 Create합니다:
    • Wrapper class는 prefix와 suffix로 텍스트를 감쌉니다. String prefixString suffix를 저장하고, String text parameter와 함께 호출되면 prefix와 suffix 사이에 감싼 텍스트를 return해야 합니다.
    • Repeater class는 텍스트를 특정 횟수만큼 반복합니다. int times 값을 저장하고, String text parameter와 함께 호출되면 각 반복 사이에 공백을 넣어 해당 횟수만큼 반복한 텍스트를 return해야 합니다.
  • main.dart: formatters를 import하고 callable class가 어떻게 작동하는지 보여 줍니다:
    • prefix가 "["이고 suffix가 "]"Wrapper를 Create합니다.
    • prefix가 "***"이고 suffix가 "***"인 another Wrapper를 Create합니다.
    • 3번 repeats하는 Repeater를 Create합니다.
    • first wrapper를 "Hello"와 함께 Call하고 result를 print합니다.
    • second wrapper를 "Important"와 함께 Call하고 result를 print합니다.
    • repeater를 "Go"와 함께 Call하고 result를 print합니다.
    • Finally, 이들을 Combine합니다. repeater를 "Dart"와 함께 calling한 result를 first wrapper와 함께 Call하고, result를 print합니다.

각 formatter object가 자신의 configuration을 기억하고, function처럼 괄호를 사용해 직접 호출될 수 있다는 점에 주목하세요!

예상 output:

[Hello]
***Important***
Go Go Go
[Dart Dart Dart]

직접 해보기

import 'formatters.dart';

void main() {
  // TODO: 접두사 "["와 접미사 "]"를 가진 Wrapper 생성
  
  // TODO: 접두사 "***"와 접미사 "***"를 가진 또 다른 Wrapper 생성
  
  // TODO: 3번 반복하는 Repeater 생성
  
  // TODO: 첫 번째 wrapper를 "Hello"로 호출하고 결과를 출력
  
  // TODO: 두 번째 wrapper를 "Important"로 호출하고 결과를 출력
  
  // TODO: repeater를 "Go"로 호출하고 결과를 출력
  
  // TODO: 이들을 결합: 다음의 결과로 첫 번째 wrapper 호출
  // repeater를 "Dart"로 호출한 결과, 그리고 결과를 출력
  
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Dart 컴파일러