클로저 이해하기
Coddy Dart 여정의 로직 & 흐름 섹션에 포함된 레슨. 65개 중 46번째.
클로저는 생성된 장소의 변수를 원래의 컨텍스트 실행이 끝난 후에도 "기억하는" 특수한 유형의 함수입니다. 어디로 가든 자신의 탄생지 일부를 가지고 다니는 함수라고 생각해 보세요.
한 함수 안에 다른 함수를 만들면 내부 함수는 외부 함수의 변수에 접근할 수 있습니다. 외부 함수가 실행을 완료한 후에도 이 접근 권한이 유지된다는 점이 바로 이것을 closure로 만드는 요소입니다.
Function createGreeting(String name) {
return () {
return "Hello, $name!";
};
}이 예제에서 createGreeting이 반환하는 익명 함수는 클로저입니다. 이 함수는 자신을 둘러싼 스코프의 name 매개변수를 캡처합니다. createGreeting의 실행이 끝난 후에도 반환된 함수는 name이 무엇이었는지 여전히 기억합니다.
closure는 특화된 함수를 만들거나 상태를 깔끔하게 유지하는 데 매우 유용합니다. closure를 사용하면 생성된 환경에 따라 맞춤 설정된 함수를 만들 수 있으므로, 코드를 더욱 유연하고 강력하게 작성할 수 있습니다.
챌린지
쉬움클로저를 사용하여 개인화된 메시지 생성기 시스템을 구축하는 프로그램을 작성하세요. 프로그램은 특정 정보를 "기억"하는 함수를 만들고, 원래의 컨텍스트가 종료된 후에도 해당 정보를 사용하여 맞춤형 메시지를 생성해야 합니다.
- 사람의 이름을 나타내는 문자열 입력을 읽습니다
- 인사말 유형(
"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: 아래에 코드를 작성하세요
// Create the createMessageGenerator function that returns a closure
// 함수를 호출하고 메시지를 생성하세요
// 최종 결과 출력
print("Generated message: \$message");
print("Message generation completed successfully");
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 & 흐름의 모든 레슨
1고급 리스트 조작
리스트 속성: first 및 last리스트 상태: isEmpty 및 isNotEmpty리스트 뒤집기리스트에 추가: insert리스트 요소 제거: removeWhere리스트에서 찾기: indexOf리스트 정렬리스트 섞기요약 - 리스트 정리 도구직접 연습해 보세요: 온라인 Dart 컴파일러