Menu
Coddy logo textTech

클로저 이해하기

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

클로저는 생성된 장소의 변수를 원래의 컨텍스트 실행이 끝난 후에도 "기억하는" 특수한 유형의 함수입니다. 어디로 가든 자신의 탄생지 일부를 가지고 다니는 함수라고 생각해 보세요.

한 함수 안에 다른 함수를 만들면 내부 함수는 외부 함수의 변수에 접근할 수 있습니다. 외부 함수가 실행을 완료한 후에도 이 접근 권한이 유지된다는 점이 바로 이것을 closure로 만드는 요소입니다.

Function createGreeting(String name) {
  return () {
    return "Hello, $name!";
  };
}

이 예제에서 createGreeting이 반환하는 익명 함수는 클로저입니다. 이 함수는 자신을 둘러싼 스코프의 name 매개변수를 캡처합니다. createGreeting의 실행이 끝난 후에도 반환된 함수는 name이 무엇이었는지 여전히 기억합니다.

closure는 특화된 함수를 만들거나 상태를 깔끔하게 유지하는 데 매우 유용합니다. closure를 사용하면 생성된 환경에 따라 맞춤 설정된 함수를 만들 수 있으므로, 코드를 더욱 유연하고 강력하게 작성할 수 있습니다.

challenge icon

챌린지

쉬움

클로저를 사용하여 개인화된 메시지 생성기 시스템을 구축하는 프로그램을 작성하세요. 프로그램은 특정 정보를 "기억"하는 함수를 만들고, 원래의 컨텍스트가 종료된 후에도 해당 정보를 사용하여 맞춤형 메시지를 생성해야 합니다.

  1. 사람의 이름을 나타내는 문자열 입력을 읽습니다
  2. 인사말 유형("formal", "casual" 또는 "friendly")을 나타내는 문자열 입력을 읽습니다
  3. 회사 이름을 나타내는 문자열 입력을 읽습니다
  4. 이름과 인사말 유형을 매개변수로 받는 createMessageGenerator라는 함수를 만듭니다
  5. 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]!"
  6. 이름 및 인사말 유형 입력과 함께 createMessageGenerator 함수를 호출하여 클로저 함수를 가져옵니다
  7. 반환된 클로저 함수를 회사 이름 입력과 함께 호출하여 메시지를 생성합니다
  8. 아래에 표시된 정확한 형식으로 결과를 표시합니다

예를 들어 입력이 "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");
}
quiz icon실력 점검

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

로직 & 흐름의 모든 레슨

직접 연습해 보세요: 온라인 Dart 컴파일러