함수를 인자로 전달하기
Coddy Dart 여정의 로직 & 흐름 섹션에 포함된 레슨 — 65개 중 45번째.
프로그래밍에서 함수는 숫자나 문자열과 같은 단순한 값을 받아들이는 것 이상의 일을 할 수 있습니다. 함수는 다른 함수를 매개변수로 전달받을 수도 있습니다. 이 강력한 개념을 고차 함수(higher-order function)라고 하며, 이는 유연하고 재사용 가능한 코드를 작성하는 완전히 새로운 방법을 제시합니다.
함수를 인자로 전달할 때, 여러분은 본질적으로 다른 함수에게 어떤 연산을 수행할지 결정할 수 있는 능력을 부여하는 것입니다. 이것은 누군가에게 도구를 주고 다양한 재료에 그것을 어떻게 사용할지 선택하게 하는 것과 같다고 생각해보세요.
void processNumbers(List<int> numbers, Function operation) {
for (int number in numbers) {
operation(number);
}
}이 예제에서 processNumbers는 리스트와 함수를 매개변수로 받습니다. 함수 매개변수인 operation은 정수를 허용하는 모든 함수가 될 수 있습니다. 즉, 숫자를 출력하거나, 두 배로 늘리거나, 필요한 다른 작업을 수행하는 함수를 전달할 수 있음을 의미합니다.
이 접근 방식은 코드를 매우 유연하게 만듭니다. 가능한 모든 연산에 대해 별도의 함수를 작성하는 대신, 연산을 매개변수로 받아들임으로써 다양한 연산과 함께 작동할 수 있는 하나의 함수를 작성하게 됩니다.
챌린지
쉬움유연한 숫자 처리기를 구축하여 함수를 인수로 전달하는 방법을 보여주는 프로그램을 작성하세요. 프로그램은 다양한 처리 함수를 생성하고, 이를 숫자 리스트에 연산을 적용하는 메인 처리 함수에 전달합니다.
- 쉼표로 구분된 숫자가 포함된 문자열 입력을 읽습니다 (예:
"1,2,3,4,5") - 연산 유형을 나타내는 문자열 입력을 읽습니다 (
"double","square", 또는"increment") - 첫 번째 입력을 문자열 리스트로 분할하고 각 요소를 정수로 변환합니다
- 세 개의 별도 함수를 생성합니다:
doubleNumber- 정수를 받아 2를 곱한 값을 반환합니다squareNumber- 정수를 받아 그 수의 제곱을 반환합니다incrementNumber- 정수를 받아 1을 더한 값을 반환합니다- 정수 리스트와 함수를 매개변수로 받는
processNumbers라는 메인 함수를 생성합니다 processNumbers함수는 리스트의 각 숫자에 주어진 함수를 적용하고 결과가 담긴 새 리스트를 반환해야 합니다- 입력받은 연산 유형에 따라 적절한 함수를
processNumbers에 전달합니다 - 결과를 아래에 표시된 정확한 형식으로 출력합니다
예를 들어, 입력이 "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');
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 & 흐름의 모든 레슨
1고급 리스트 조작
리스트 속성: first 및 last리스트 상태: isEmpty 및 isNotEmpty리스트 뒤집기리스트에 추가: insert리스트 요소 제거: removeWhere리스트에서 찾기: indexOf리스트 정렬리스트 섞기요약 - 리스트 정리 도구