IMCAT.DEV
로그인 가입
Zig 입문 자료구조

Zig 맵 기초

Zig 맵 기초 — 초급

맵 기초

1. 도입 (왜 배워야 하는가)

프로그래밍에서 데이터를 효율적으로 관리하고 처리하는 것은 매우 중요합니다. 특히, 키-값 쌍 형태로 데이터를 저장하는 맵(Map)은 다양한 실무 환경에서 자주 사용됩니다. 예를 들어, 쇼핑몰에서 상품 정보를 관리하거나, 웹 애플리케이션에서 사용자 세션을 저장할 때 유용합니다. 만약 맵의 개념을 이해하지 못한다면, 데이터를 구조화하는 데 어려움을 겪을 것이고, 그로 인해 코드의 가독성과 유지보수성이 떨어질 수 있습니다.

2. 핵심 개념 설명

맵(Map): 키와 값의 쌍으로 이루어진 자료구조로, 특정 키를 통해 해당 값에 접근할 수 있도록 해줍니다. 이를 통해 데이터를 효율적으로 검색하고, 추가하고, 수정할 수 있습니다.

실생활 비유: 맵은 마치 주소록과 같습니다. 각 사람의 이름(키)을 통해 그 사람의 전화번호(값)를 쉽게 찾을 수 있는 것과 같습니다.

용어설명
키 (Key)데이터를 식별하기 위한 고유한 값
값 (Value)키에 해당하는 데이터
해시 (Hash)키를 값으로 변환하는 함수

3. 기본 코드 예제

아래는 Zig에서 맵을 사용하는 기본적인 예제입니다.

const std = @import("std");

pub fn main() !void {
    var allocator = std.heap.pageAllocator;

    // 맵 생성
    var myMap = std.AutoHashMap(u32, []const u8).init(allocator);

    // 값 추가
    try myMap.put(1, "사과");
    try myMap.put(2, "바나나");

    // 값 조회
    const apple = try myMap.get(1);
    const banana = try myMap.get(2);

    // 결과 출력
    std.debug.print("1: {}\n", .{apple});
    std.debug.print("2: {}\n", .{banana});
}

실행 결과

1: 사과
2: 바나나

코드 동작 설명

  1. const std = @import("std");: Zig 표준 라이브러리를 가져옵니다.
  2. var allocator = std.heap.pageAllocator;: 메모리 할당자를 정의합니다.
  3. var myMap = std.AutoHashMap(u32, []const u8).init(allocator);: u32 타입의 키와 []const u8 타입의 값을 가지는 맵을 초기화합니다.
  4. try myMap.put(1, "사과");: 키 1에 "사과"라는 값을 추가합니다.
  5. try myMap.put(2, "바나나");: 키 2에 "바나나"라는 값을 추가합니다.
  6. const apple = try myMap.get(1);: 키 1에 대한 값을 조회합니다.
  7. const banana = try myMap.get(2);: 키 2에 대한 값을 조회합니다.
  8. std.debug.print(...): 조회한 값을 출력합니다.
  9. 4. 실전 활용 예제

    예제 1: 쇼핑몰 장바구니 구현

    쇼핑몰에서 장바구니에 담긴 상품들을 맵을 사용하여 관리할 수 있습니다. 키는 상품의 ID, 값은 상품의 이름으로 설정할 수 있습니다.

    pub fn main() !void {
        var allocator = std.heap.pageAllocator;
        var cart = std.AutoHashMap(u32, []const u8).init(allocator);
    
        // 장바구니에 상품 추가
        try cart.put(101, "티셔츠");
        try cart.put(102, "바지");
        
        // 장바구니에 담긴 상품 출력
        for (cart.iterator()) |entry| {
            std.debug.print("상품 ID: {}, 이름: {}\n", .{entry.key, entry.value});
        }
    }

    예제 2: 사용자 세션 관리

    웹 애플리케이션에서 사용자 ID를 키로 사용하고, 세션 정보를 값으로 저장하여 사용자의 상태를 관리할 수 있습니다.

    pub fn main() !void {
        var allocator = std.heap.pageAllocator;
        var sessions = std.AutoHashMap(u32, []const u8).init(allocator);
    
        // 세션 추가
        try sessions.put(1, "로그인");
        try sessions.put(2, "방문중");
        
        // 세션 상태 출력
        for (sessions.iterator()) |entry| {
            std.debug.print("사용자 ID: {}, 세션 상태: {}\n", .{entry.key, entry.value});
        }
    }

    5. 흔한 실수와 주의사항

    실수 1: 키 중복 추가

    • 잘못된 코드:
    • try myMap.put(1, "사과");
      try myMap.put(1, "바나나"); // 키가 중복됨
    • 올바른 코드:
    • try myMap.put(1, "사과");
      if (myMap.put(1, "바나나").isError()) {
          std.debug.print("키 1은 이미 존재합니다.\n", .{});
      }

      실수 2: 잘못된 타입 사용

    • 잘못된 코드:
    • try myMap.put("사과", 1); // 키가 잘못된 타입
    • 올바른 코드:
    • try myMap.put(1, "사과"); // 올바른 타입

      6. 정리

    • 맵은 키-값 쌍으로 데이터를 저장하고 관리하는 자료구조입니다.
    • 실생활 비유로 주소록을 사용하여 이해할 수 있습니다.
    • 실무에서는 장바구니나 사용자 세션 관리 등에서 유용하게 사용됩니다.
    • 다음 학습 주제로는 맵의 고급 사용법(예: 해시 충돌 처리)이나 다른 자료구조(예: 리스트, 셋)를 추천합니다.