Menu
Coddy logo textTech

키와 값 확인하기

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

Map에서 데이터에 액세스하기 전에, 찾고 있는 키나 값이 실제로 존재하는지 확인하는 것이 필수적입니다. Dart는 이를 위해 두 가지 메서드인 containsKey()containsValue()를 제공합니다.

containsKey() 메서드는 맵에 특정 키가 존재하는지 확인하며, 키를 찾으면 true를 반환하고 그렇지 않으면 false를 반환합니다. 이는 값을 액세스하기 전에 특히 유용하며, 잠재적인 오류를 피하는 데 도움이 됩니다.

Map<String, String> userPermissions = {
  'user123': 'admin',
  'user456': 'editor',
  'user789': 'viewer'
};

bool hasUser = userPermissions.containsKey('user123');
print(hasUser);  // true

bool hasUnknownUser = userPermissions.containsKey('user999');
print(hasUnknownUser);  // false

마찬가지로, containsValue()는 맵의 어느 곳에든 특정 값이 존재하는지 확인합니다. 이 메서드는 모든 값을 검색하고 일치하는 항목을 찾으면 true를 반환합니다.

bool hasAdmin = userPermissions.containsValue('admin');
print(hasAdmin);  // true

이 메서드들은 동적 맵 콘텐츠를 작업할 때 런타임 오류를 방지하고, 누락된 데이터를 매끄럽게 처리하는 안전한 코드를 작성하는 데 필수적입니다.

challenge icon

챌린지

쉬움

사용자 자격 증명을 확인하고 권한 수준을 검사하여 사용자 인증 시스템을 관리하는 프로그램을 작성하세요. 프로그램의 요구 사항은 다음과 같습니다:

  1. 시스템 이름을 나타내는 문자열 입력을 읽습니다.
  2. 사용자 이름과 해당 권한 수준을 나타내는 여러 쌍의 입력을 읽습니다 (입력은 "users_done"을 받으면 종료됩니다).
  3. 확인할 사용자 이름을 나타내는 문자열 입력을 읽습니다.
  4. 검증할 권한 수준을 나타내는 문자열 입력을 읽습니다.
  5. 사용자 이름을 키로, 권한 수준을 값으로 저장하는 Map을 생성합니다.
  6. containsKey()를 사용하여 시스템에 해당 사용자 이름이 존재하는지 확인합니다.
  7. containsValue()를 사용하여 지정된 권한 수준이 시스템의 어느 곳에라도 존재하는지 확인합니다.
  8. 아래에 표시된 정확한 형식으로 인증 분석 결과를 출력합니다.

예를 들어, 시스템 이름이 "Corporate Network"이고, 사용자가 "admin" 권한을 가진 "alice", "editor" 권한을 가진 "bob", "viewer" 권한을 가진 "charlie", "admin" 권한을 가진 "diana"를 포함하며, 확인할 사용자 이름이 "alice"이고 검증할 권한 수준이 "admin"인 경우, 프로그램은 다음과 같이 출력해야 합니다:

System: Corporate Network
User Database: {alice: admin, bob: editor, charlie: viewer, diana: admin}
Authentication Check:
Username 'alice' exists: true
Permission 'admin' exists in system: true
User 'alice' has permission 'admin': true
Access Status: GRANTED - User authenticated with valid permissions
Security Level: High (admin access detected)

시스템 이름이 "School Portal"이고, 사용자가 "instructor" 권한을 가진 "teacher1", "student" 권한을 가진 "student1", "administrator" 권한을 가진 "admin1"을 포함하며, 확인할 사용자 이름이 "guest"이고 검증할 권한 수준이 "student"인 경우, 프로그램은 다음과 같이 출력해야 합니다:

System: School Portal
User Database: {teacher1: instructor, student1: student, admin1: administrator}
Authentication Check:
Username 'guest' exists: false
Permission 'student' exists in system: true
User 'guest' has permission 'student': false
Access Status: DENIED - Username not found in system
Security Level: Low (user not registered)

시스템 이름이 "Library System"이고, 사용자가 "staff" 권한을 가진 "librarian", "member" 권한을 가진 "member1", "member" 권한을 가진 "member2"를 포함하며, 확인할 사용자 이름이 "librarian"이고 검증할 권한 수준이 "premium"인 경우, 프로그램은 다음과 같이 출력해야 합니다:

System: Library System
User Database: {librarian: staff, member1: member, member2: member}
Authentication Check:
Username 'librarian' exists: true
Permission 'premium' exists in system: false
User 'librarian' has permission 'premium': false
Access Status: DENIED - Permission level not available
Security Level: Medium (valid user, invalid permission)

프로그램은 containsKey()를 사용하여 사용자 이름의 존재 여부를 확인하고, containsValue()를 사용하여 시스템 내에 해당 권한 수준이 존재하는지 확인해야 합니다. 특정 사용자가 특정 권한을 가지고 있는지 확인하려면 사용자의 실제 권한 수준과 요청된 권한 수준을 비교하세요. 결과에 따라 보안 수준을 결정합니다: 관리자 유형의 권한(admin, administrator, staff)으로 액세스가 허용된 경우 "High", 사용자는 존재하지만 권한이 잘못된 경우 "Medium", 사용자가 존재하지 않는 경우 "Low"로 설정합니다. 입력 형식은 시스템 이름, 그 다음 사용자 이름과 권한 수준이 번갈아 나오며 "users_done"으로 끝나고, 마지막으로 확인할 사용자 이름과 검증할 권한 수준이 주어집니다.

치트 시트

containsKey()를 사용하여 Map에 특정 키가 존재하는지 확인합니다:

Map<String, String> userPermissions = {
  'user123': 'admin',
  'user456': 'editor',
  'user789': 'viewer'
};

bool hasUser = userPermissions.containsKey('user123');
print(hasUser);  // true

containsValue()를 사용하여 Map의 어느 곳에든 특정 값이 존재하는지 확인합니다:

bool hasAdmin = userPermissions.containsValue('admin');
print(hasAdmin);  // true

두 메서드 모두 값을 찾으면 true를 반환하고 그렇지 않으면 false를 반환하여, 동적인 Map 콘텐츠를 다룰 때 발생할 수 있는 런타임 오류를 방지하는 데 도움이 됩니다.

직접 해보기

import 'dart:io';

void main() {
  // 시스템 이름 읽기
  String? systemName = stdin.readLineSync();
  
  // 사용자 이름과 권한 수준을 저장할 Map 생성
  Map<String, String> userDatabase = {};
  
  // "users_done"이 입력될 때까지 사용자 데이터 읽기
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "users_done") {
      break;
    }
    String username = input!;
    String? permission = stdin.readLineSync();
    userDatabase[username] = permission!;
  }
  
  // 확인할 사용자 이름과 검증할 권한 수준 읽기
  String? usernameToCheck = stdin.readLineSync();
  String? permissionToVerify = stdin.readLineSync();
  
  // TODO: 아래에 코드를 작성하세요
  // containsKey()를 사용하여 사용자 이름이 존재하는지 확인
  // containsValue()를 사용하여 시스템에 해당 권한 수준이 존재하는지 확인
  // 특정 사용자가 특정 권한을 가지고 있는지 확인
  // 액세스 상태 및 보안 수준 결정:
  //   - 액세스가 허용되고 권한이 admin, administrator 또는 staff인 경우 "High (admin access detected)"
  //   - 액세스는 허용되지만 권한이 관리자 유형이 아닌 경우 "Medium (standard access)"
  //   - 사용자는 존재하지만 권한이 잘못된 경우 "Medium (valid user, invalid permission)"
  //   - 사용자가 등록되지 않은 경우 "Low (user not registered)"
  
  // 인증 분석 결과 출력
  print("System: $systemName");
  print("User Database: $userDatabase");
  print("Authentication Check:");
  // 여기에 출력 문을 추가하세요
}
quiz icon실력 점검

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

로직 & 흐름의 모든 레슨