Menu
Coddy logo textTech

Callable 클래스

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

Dart에서 call() 메서드를 구현하면 클래스의 인스턴스를 함수처럼 호출 가능하게 만들 수 있습니다. 이를 통해 인스턴스에 직접 괄호를 사용하는 함수 호출 구문으로 객체를 사용할 수 있습니다.

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() 메서드를 호출합니다. 객체는 자신의 상태(factor 필드)를 유지하면서 함수처럼 동작합니다.

call() 메서드는 여러 개의 매개변수, 선택적 매개변수 또는 심지어 다른 타입을 반환하는 등 어떤 시그니처도 가질 수 있습니다:

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 classes)를 사용하여 텍스트 포맷터 시스템을 만들어 봅시다! 고유한 설정 구성을 유지하면서 함수처럼 호출되어 다양한 방식으로 텍스트를 변환할 수 있는 객체를 생성하게 됩니다.

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

  • formatters.dart: 텍스트를 변환하는 두 개의 호출 가능한 클래스를 생성합니다:
    • 텍스트를 접두사(prefix)와 접미사(suffix)로 감싸는 Wrapper 클래스. 이 클래스는 String prefixString suffix를 저장해야 하며, String text 파라미터와 함께 호출될 때 접두사와 접미사 사이에 텍스트가 감싸진 결과를 반환해야 합니다.
    • 텍스트를 특정 횟수만큼 반복하는 Repeater 클래스. 이 클래스는 int times 값을 저장해야 하며, String text 파라미터와 함께 호출될 때 해당 횟수만큼 텍스트를 반복하고 각 반복 사이에 공백을 넣어 반환해야 합니다.
  • main.dart: 포맷터를 임포트하고 호출 가능한 클래스가 어떻게 작동하는지 보여줍니다:
    • 접두사 "["와 접미사 "]"를 가진 Wrapper를 생성합니다.
    • 접두사 "***"와 접미사 "***"를 가진 또 다른 Wrapper를 생성합니다.
    • 3번 반복하는 Repeater를 생성합니다.
    • 첫 번째 wrapper를 "Hello"와 함께 호출하고 결과를 출력합니다.
    • 두 번째 wrapper를 "Important"와 함께 호출하고 결과를 출력합니다.
    • repeater를 "Go"와 함께 호출하고 결과를 출력합니다.
    • 마지막으로 이들을 조합합니다: "Dart"와 함께 호출한 repeater의 결과를 첫 번째 wrapper의 인자로 넣어 호출하고, 그 결과를 출력합니다.

각 포맷터 객체가 자신의 설정을 기억하고 있으며, 함수처럼 괄호를 사용하여 직접 호출될 수 있다는 점에 주목하세요!

예상 출력:

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

치트 시트

클래스는 call() 메서드를 구현하여 함수처럼 호출 가능하게 만들 수 있습니다:

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

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

call() 메서드는 여러 매개변수, 선택적 매개변수 또는 다양한 반환 타입을 가진 어떤 시그니처도 가질 수 있습니다:

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.
}

호출 가능한 클래스는 상태나 설정과 결합된 함수와 같은 동작을 생성하는 데 유용합니다.

직접 해보기

import 'formatters.dart';

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

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

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