클로저 이해하기
Coddy Dart 여정의 로직 & 흐름 섹션에 포함된 레슨 — 65개 중 46번째.
클로저는 함수가 생성된 위치의 변수들을 기억하는 특별한 유형의 함수로, 해당 원래의 컨텍스트가 실행을 마친 후에도 이를 유지합니다. 어디를 가든 자신이 태어난 곳의 일부를 가지고 다니는 함수라고 생각하면 됩니다.
함수 내부에 또 다른 함수를 생성할 때, 내부 함수는 외부 함수의 변수에 접근할 수 있습니다. 이러한 접근이 외부 함수의 실행이 완료된 후에도 지속된다는 점이 이것을 클로저(closure)로 만듭니다.
Function createGreeting(String name) {
return () {
return "Hello, $name!";
};
}이 예제에서 createGreeting에 의해 반환된 익명 함수는 클로저입니다. 이 함수는 주변 스코프의 name 매개변수를 캡처합니다. createGreeting의 실행이 끝난 후에도, 반환된 함수는 name이 무엇이었는지 여전히 기억합니다.
클로저는 특화된 함수를 생성하거나 깔끔한 방식으로 상태를 유지하는 데 매우 유용합니다. 클로저를 사용하면 함수가 생성된 환경을 바탕으로 맞춤화된 함수를 빌드할 수 있어, 코드를 더욱 유연하고 강력하게 만들 수 있습니다.
챌린지
쉬움개인화된 메시지 생성 시스템을 구축하여 클로저(closures)를 시연하는 프로그램을 작성하세요. 이 프로그램은 특정 정보를 "기억"하고, 원래의 컨텍스트가 종료된 후에도 그 정보를 사용하여 맞춤형 메시지를 생성하는 함수를 만듭니다.
- 사람의 이름을 나타내는 문자열 입력을 읽습니다.
- 인사 유형(
"formal","casual", 또는"friendly")을 나타내는 문자열 입력을 읽습니다. - 회사 이름을 나타내는 문자열 입력을 읽습니다.
- 이름과 인사 유형을 매개변수로 받는
createMessageGenerator라는 함수를 만듭니다. createMessageGenerator함수는 다음을 수행하는 다른 함수(클로저)를 반환해야 합니다:- 회사 이름을 매개변수로 받습니다.
- 외부 함수의 스코프에 있는 이름과 인사 유형을 사용합니다.
- 인사 유형에 따라 형식화된 메시지를 반환합니다:
"formal"인 경우:"Dear [name], we are pleased to welcome you to [company].""casual"인 경우:"Hey [name]! Welcome to [company]!""friendly"인 경우:"Hi [name], so glad you joined [company]!"- 입력받은 이름과 인사 유형으로
createMessageGenerator함수를 호출하여 클로저 함수를 얻습니다. - 반환된 클로저 함수를 입력받은 회사 이름으로 호출하여 메시지를 생성합니다.
- 결과를 아래에 표시된 정확한 형식으로 출력합니다.
예를 들어, 입력값이 "Alice", "formal", "TechCorp"인 경우, 프로그램은 다음과 같이 출력해야 합니다:
Message Generator System
========================
Creating message generator for: Alice
Greeting type: formal
Company: TechCorp
========================
Generated message: Dear Alice, we are pleased to welcome you to TechCorp.
Message generation completed successfully입력값이 "Bob", "casual", "StartupXYZ"인 경우, 프로그램은 다음과 같이 출력해야 합니다:
Message Generator System
========================
Creating message generator for: Bob
Greeting type: casual
Company: StartupXYZ
========================
Generated message: Hey Bob! Welcome to StartupXYZ!
Message generation completed successfully입력값이 "Carol", "friendly", "InnovateLab"인 경우, 프로그램은 다음과 같이 출력해야 합니다:
Message Generator System
========================
Creating message generator for: Carol
Greeting type: friendly
Company: InnovateLab
========================
Generated message: Hi Carol, so glad you joined InnovateLab!
Message generation completed successfully프로그램은 다른 함수를 반환하는 함수를 생성함으로써 클로저를 시연해야 합니다. 반환된 함수(클로저)는 외부 함수가 실행을 마친 후에도 외부 함수의 스코프에 있는 변수(이름 및 인사 유형)에 접근할 수 있어야 합니다. 조건문을 사용하여 입력된 인사 유형에 따라 적절한 메시지 형식을 결정하세요.
직접 해보기
import 'dart:io';
void main() {
// 입력 읽기
String? name = stdin.readLineSync();
String? greetingType = stdin.readLineSync();
String? company = stdin.readLineSync();
// 시스템 헤더 표시
print("Message Generator System");
print("========================");
print("Creating message generator for: $name");
print("Greeting type: $greetingType");
print("Company: $company");
print("========================");
// TODO: 아래에 코드를 작성하세요
// 클로저를 반환하는 createMessageGenerator 함수 생성
// 함수를 호출하고 메시지 생성
// 최종 결과 출력
print("Generated message: \$message");
print("Message generation completed successfully");
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 & 흐름의 모든 레슨
1고급 리스트 조작
리스트 속성: first 및 last리스트 상태: isEmpty 및 isNotEmpty리스트 뒤집기리스트에 추가: insert리스트 요소 제거: removeWhere리스트에서 찾기: indexOf리스트 정렬리스트 섞기요약 - 리스트 정리 도구