클로저 이해하기
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프로그램은 다른 함수를 반환하는 함수를 생성함으로써 클로저를 시연해야 합니다. 반환된 함수(클로저)는 외부 함수가 실행을 마친 후에도 외부 함수의 스코프에 있는 변수(이름 및 인사 유형)에 접근할 수 있어야 합니다. 조건문을 사용하여 입력된 인사 유형에 따라 적절한 메시지 형식을 결정하세요.
치트 시트
클로저는 함수가 생성된 위치의 변수들을 "기억"하는 함수로, 원래의 컨텍스트가 실행을 마친 후에도 해당 변수들을 기억합니다.
함수 내부에 다른 함수를 생성하면, 내부 함수는 외부 함수의 변수에 접근할 수 있습니다. 이러한 접근은 외부 함수의 실행이 완료된 후에도 유지됩니다.
Function createGreeting(String name) {
return () {
return "Hello, $name!";
};
}이 예제에서 createGreeting에 의해 반환된 익명 함수는 클로저입니다. 이 함수는 주변 스코프에서 name 매개변수를 캡처합니다. createGreeting의 실행이 끝난 후에도, 반환된 함수는 name이 무엇이었는지 여전히 기억합니다.
클로저는 특화된 함수를 만들거나 상태를 깔끔하게 유지하는 데 유용합니다. 클로저를 사용하면 함수가 생성된 환경에 따라 맞춤화된 함수를 빌드할 수 있습니다.
직접 해보기
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리스트 정렬리스트 섞기요약 - 리스트 정리 도구