Menu
Coddy logo textTech

함수를 인자로 전달하기

Coddy Dart 여정의 로직 & 흐름 섹션에 포함된 레슨 — 65개 중 45번째.

프로그래밍에서 함수는 숫자나 문자열과 같은 단순한 값을 받아들이는 것 이상의 일을 할 수 있습니다. 함수는 다른 함수를 매개변수로 전달받을 수도 있습니다. 이 강력한 개념을 고차 함수(higher-order function)라고 하며, 이는 유연하고 재사용 가능한 코드를 작성하는 완전히 새로운 방법을 제시합니다.

함수를 인자로 전달할 때, 여러분은 본질적으로 다른 함수에게 어떤 연산을 수행할지 결정할 수 있는 능력을 부여하는 것입니다. 이것은 누군가에게 도구를 주고 다양한 재료에 그것을 어떻게 사용할지 선택하게 하는 것과 같다고 생각해보세요.

void processNumbers(List<int> numbers, Function operation) {
  for (int number in numbers) {
    operation(number);
  }
}

이 예제에서 processNumbers는 리스트와 함수를 매개변수로 받습니다. 함수 매개변수인 operation은 정수를 허용하는 모든 함수가 될 수 있습니다. 즉, 숫자를 출력하거나, 두 배로 늘리거나, 필요한 다른 작업을 수행하는 함수를 전달할 수 있음을 의미합니다.

이 접근 방식은 코드를 매우 유연하게 만듭니다. 가능한 모든 연산에 대해 별도의 함수를 작성하는 대신, 연산을 매개변수로 받아들임으로써 다양한 연산과 함께 작동할 수 있는 하나의 함수를 작성하게 됩니다.

challenge icon

챌린지

쉬움

유연한 숫자 처리기를 구축하여 함수를 인수로 전달하는 방법을 보여주는 프로그램을 작성하세요. 프로그램은 다양한 처리 함수를 생성하고, 이를 숫자 리스트에 연산을 적용하는 메인 처리 함수에 전달합니다.

  1. 쉼표로 구분된 숫자가 포함된 문자열 입력을 읽습니다 (예: "1,2,3,4,5")
  2. 연산 유형을 나타내는 문자열 입력을 읽습니다 ("double", "square", 또는 "increment")
  3. 첫 번째 입력을 문자열 리스트로 분할하고 각 요소를 정수로 변환합니다
  4. 세 개의 별도 함수를 생성합니다:
    • doubleNumber - 정수를 받아 2를 곱한 값을 반환합니다
    • squareNumber - 정수를 받아 그 수의 제곱을 반환합니다
    • incrementNumber - 정수를 받아 1을 더한 값을 반환합니다
  5. 정수 리스트와 함수를 매개변수로 받는 processNumbers라는 메인 함수를 생성합니다
  6. processNumbers 함수는 리스트의 각 숫자에 주어진 함수를 적용하고 결과가 담긴 새 리스트를 반환해야 합니다
  7. 입력받은 연산 유형에 따라 적절한 함수를 processNumbers에 전달합니다
  8. 결과를 아래에 표시된 정확한 형식으로 출력합니다

예를 들어, 입력이 "2,4,6,8""double"인 경우 프로그램은 다음과 같이 출력해야 합니다:

Number Processor
================
Original numbers: [2, 4, 6, 8]
Operation: double
Processing numbers...
Result: [4, 8, 12, 16]
Operation completed successfully

입력이 "3,5,7""square"인 경우 프로그램은 다음과 같이 출력해야 합니다:

Number Processor
================
Original numbers: [3, 5, 7]
Operation: square
Processing numbers...
Result: [9, 25, 49]
Operation completed successfully

입력이 "10,20,30""increment"인 경우 프로그램은 다음과 같이 출력해야 합니다:

Number Processor
================
Original numbers: [10, 20, 30]
Operation: increment
Processing numbers...
Result: [11, 21, 31]
Operation completed successfully

프로그램은 세 가지 연산 함수 중 하나를 processNumbers 함수의 인수로 전달함으로써 고차 함수(higher-order functions)의 개념을 보여주어야 합니다. 조건문을 사용하여 입력된 연산 유형에 따라 어떤 함수를 전달할지 결정하세요. processNumbers 함수는 입력 리스트를 반복하면서 각 요소에 주어진 함수를 적용하고 결과를 새 리스트에 수집해야 합니다.

치트 시트

고차 함수(Higher-order functions)는 다른 함수를 매개변수로 받을 수 있는 함수로, 유연하고 재사용 가능한 코드를 작성할 수 있게 해줍니다.

함수를 인수로 전달하려면 Function 타입의 매개변수를 정의하세요:

void processNumbers(List<int> numbers, Function operation) {
  for (int number in numbers) {
    operation(number);
  }
}

이를 통해 동일한 데이터에 대해 다양한 작업을 수행하는 서로 다른 함수를 전달할 수 있으며, 코드를 더욱 모듈화하고 가능한 모든 작업에 대해 별도의 함수를 작성해야 하는 번거로움을 피할 수 있습니다.

직접 해보기

import 'dart:io';

void main() {
  // 입력 읽기
  String? numbersInput = stdin.readLineSync();
  String? operation = stdin.readLineSync();
  
  // 문자열 입력을 정수 리스트로 변환
  List<int> numbers = numbersInput!.split(',').map((e) => int.parse(e.trim())).toList();
  
  // TODO: 세 가지 연산 함수 생성 (doubleNumber, squareNumber, incrementNumber)
  
  // TODO: 리스트와 함수를 매개변수로 받는 processNumbers 함수 생성
  
  // TODO: 조건문을 사용하여 연산 유형에 따라 전달할 함수 결정
  
  // TODO: 적절한 함수와 함께 processNumbers를 호출하고 결과 저장
  
  // 필요한 형식으로 결과 출력
  print('Number Processor');
  print('================');
  print('Original numbers: $numbers');
  print('Operation: $operation');
  print('Processing numbers...');
  // TODO: 여기에 결과 리스트 출력
  print('Operation completed successfully');
}
quiz icon실력 점검

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

로직 & 흐름의 모든 레슨