데이터 엔지니어링

패스트캠퍼스 환급챌린지 31일차: 데이터엔지니어링 초격차 강의 후기

Big Byte 2025. 5. 1. 23:26

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

자바 컬렉션 완전 정복! 🎒

 

안녕하세요, 여러분! 

 

지난 시간에는 java.time 패키지를 통해 날짜와 시간이라는 까다로운 마법을 마스터했었죠! 마치 시간 여행자처럼 과거의 Date가 가진 함정들을 피하고, 최신 시간 마법으로 코드를 더욱 우아하고 안전하게 만들었습니다. 🕰️➡️✨

 

덕분에 더 이상 시간 때문에 골머리를 앓지 않게 되었어요! 👍

 

하지만 우리의 프로그래밍 여정은 계속됩니다! 시간을 정복했으니, 이제는 넘쳐나는 데이터들을 현명하게 관리하는 방법을 배울 차례예요. 변수 하나하나로는 감당할 수 없는 수많은 정보들, 마치 마법사의 가방 속 온갖 재료들처럼요! 🧪📜💎

 

이걸 그냥 아무렇게나 던져 넣으면... 나중에 필요한 걸 찾을 때 완전 난장판이 되겠죠? 😱

 

"학생 명단을 저장해야 하는데, 몇 명이나 될지 모르겠네...", "중복된 아이템은 빼고 싶은데 어떻게 하지?", "각 사용자별 점수를 저장하고 빠르게 찾아야 해!" 🤔 이런 고민들, 데이터를 다루다 보면 필연적으로 만나게 됩니다.

 

그래서 오늘은! 이런 데이터 관리의 어려움을 해결해 줄 자바의 강력한 지원군, 컬렉션 프레임워크(Collection Framework*에 대해 알아볼 거예요! 단순 배열의 한계를 넘어, 데이터를 훨씬 더 유연하고 효율적으로 다룰 수 있는 마법 도구들을 만나봅시다!

오늘 우리가 탐험할 데이터 마법의 세계는 다음과 같아요:

  1. 왜 배열 대신 컬렉션일까? 🤔 (마법 주머니의 필요성)
  2. 데이터 꾸러미의 기본! - Collection 인터페이스 🎁
  3. 순서대로 착착! - List 인터페이스 📝
  4. 하나뿐인 특별함! - Set 인터페이스 💎
  5. 이름표를 붙여줘! - Map 인터페이스 🏷️=💖
  6. 컬렉션 속 보물찾기! - 반복자 (Iterator) 🚶‍♀️

자, 데이터 정리 마법을 배울 준비되셨나요? 마법 지팡이를 들고 함께 출발! 슝~! 💨

 

 

1. 왜 배열 대신 컬렉션일까? 🤔 (마법 주머니의 필요성)

우리가 처음 프로그래밍을 배울 때 만나는 데이터 묶음은 바로 배열(Array)입니다. 여러 개의 데이터를 한 곳에 담을 수 있죠.

String[] wizardNames = new String[3]; // 딱 3명의 마법사 이름만 저장 가능!
wizardNames[0] = "해리";
wizardNames[1] = "헤르미온느";
wizardNames[2] = "론";
// wizardNames[3] = "덤블도어"; // 에러! 💥 크기가 정해져 있어요.

// 크기를 늘리려면? 새 배열 만들고 복사... 으악 복잡해! 🤯
String[] biggerWizardNames = new String[4];
System.arraycopy(wizardNames, 0, biggerWizardNames, 0, wizardNames.length);
biggerWizardNames[3] = "덤블도어";

배열은 빠르고 간단하지만, 치명적인 단점이 있어요. 바로 크기가 고정된다는 점! 마치 딱 정해진 칸만 있는 상자 같아요. 더 많은 물건을 넣으려면 더 큰 새 상자를 준비하고 일일이 옮겨 담아야 하죠. 😭

 

이런 불편함을 해결하기 위해 등장한 것이 바로 컬렉션 프레임워크입니다! 컬렉션은 마치 자동으로 늘어나는 마법 주머니 같아요! 🎒✨

  • 크기가 자유자재 (Dynamic Size): 데이터가 늘어나면 알아서 공간을 확보해요.
  • 다양한 기능 제공: 데이터 추가, 삭제, 검색 등을 위한 편리한 마법(메소드)들이 준비되어 있어요.
  • 자료구조 구현: 리스트, 세트, 맵 등 다양한 방식으로 데이터를 저장하고 관리할 수 있는 구조를 제공해요.

2. 데이터 꾸러미의 기본! - Collection 인터페이스 🎁

자바 컬렉션 프레임워크의 세계로 들어서면 가장 먼저 만나는 것이 Collection 인터페이스입니다. 여러 개의 데이터(요소, element)를 담는 객체들의 최상위 설계도라고 할 수 있어요. (주의! Map은 약간 다른 계보를 가집니다. 잠시 후에 설명할게요!)

Collection 인터페이스는 모든 컬렉션들이 가져야 할 기본적인 기능들을 정의해요.

  • add(E e): 요소 추가 마법
  • remove(Object o): 요소 제거 마법
  • size(): 몇 개나 들어있는지 알려주는 마법
  • isEmpty(): 비어있는지 확인하는 마법
  • contains(Object o): 특정 요소가 있는지 확인하는 마법
  • clear(): 내용물을 싹 비우는 마법

Collection 인터페이스를 바탕으로, 목적에 따라 크게 List, Set 등의 하위 인터페이스들이 존재합니다.

 

 

3. 순서대로 착착! - List 인터페이스 📝

가장 많이 사용되는 컬렉션 중 하나! List 인터페이스는 순서가 있는 데이터의 모음을 다룹니다. 마치 쇼핑 목록처럼 넣은 순서대로 데이터가 저장되고, 중복된 데이터도 허용해요.

대표적인 구현 클래스로는 ArrayList가 있습니다.

import java.util.ArrayList;
import java.util.List;

public class ListExample {
    public static void main(String[] args) {
        // <String> : 이 List에는 String 타입의 데이터만 넣겠다는 마법 약속! (제네릭)
        List<String> shoppingList = new ArrayList<>();

        // 순서대로 추가 (add)
        shoppingList.add("마법 지팡이");
        shoppingList.add("부엉이 먹이");
        shoppingList.add("개구리 초콜릿");
        shoppingList.add("부엉이 먹이"); // 중복 허용! 🦉

        System.out.println("쇼핑 목록: " + shoppingList); // [마법 지팡이, 부엉이 먹이, 개구리 초콜릿, 부엉이 먹이]

        // 특정 위치의 아이템 가져오기 (get) - 인덱스(순번) 사용 (0부터 시작!)
        System.out.println("첫 번째 아이템: " + shoppingList.get(0)); // 마법 지팡이

        // 크기 확인 (size)
        System.out.println("총 아이템 개수: " + shoppingList.size()); // 4

        // 아이템 삭제 (remove)
        shoppingList.remove("부엉이 먹이"); // 첫 번째 만나는 "부엉이 먹이" 삭제
        System.out.println("삭제 후 목록: " + shoppingList); // [마법 지팡이, 개구리 초콜릿, 부엉이 먹이]
    }
}

List는 데이터의 순서가 중요하거나, 중복된 데이터를 허용해야 할 때 아주 유용해요!

 

 

4. 하나뿐인 특별함! - Set 인터페이스 💎

Set 인터페이스는 순서를 보장하지 않고, 중복된 데이터를 절대 허용하지 않는 특별한 데이터 모음입니다. 마치 보석 상자 속 유니크한 보석들처럼요! ✨ 각 요소는 오직 하나만 존재할 수 있습니다.

대표적인 구현 클래스로는 HashSet이 있습니다.

import java.util.HashSet;
import java.util.Set;

public class SetExample {
    public static void main(String[] args) {
        Set<String> uniqueSpells = new HashSet<>();

        // 주문 추가 (add)
        uniqueSpells.add("아씨오"); // 소환 마법
        uniqueSpells.add("윙가르디움 레비오우사"); // 공중 부양 마법
        uniqueSpells.add("알로호모라"); // 잠금 해제 마법

        // 중복 추가 시도!
        boolean isAdded = uniqueSpells.add("아씨오"); // 이미 존재하므로 추가되지 않음!
        System.out.println("아씨오 추가 성공? " + isAdded); // false

        System.out.println("고유 마법 주문들: " + uniqueSpells);
        // 출력 순서는 보장되지 않아요! 예: [알로호모라, 아씨오, 윙가르디움 레비오우사]

        // 특정 주문이 있는지 확인 (contains)
        System.out.println("익스펙토 페트로눔 시전 가능? " + uniqueSpells.contains("익스펙토 페트로눔")); // false

        // 크기 확인 (size)
        System.out.println("총 고유 주문 개수: " + uniqueSpells.size()); // 3
    }
}

Set은 데이터의 중복을 제거하거나, 특정 요소의 존재 여부를 빠르게 확인하고 싶을 때 사용하면 좋습니다.

 

 

5. 이름표를 붙여줘! - Map 인터페이스 🏷️=💖

자, 이제 조금 다른 방식의 데이터 관리법을 만나볼 시간입니다! Map 인터페이스는 키(Key)값(Value)을 하나의 쌍으로 묶어서 저장하는 방식을 사용해요. 마치 각 물건에 고유한 이름표(키)를 붙여 관리하는 것과 같죠.

 

중요! Map은 여러 개의 값을 모아 다룬다는 점에서 컬렉션 프레임워크의 일부로 취급되지만, 엄밀히 말해 Collection 인터페이스를 상속받지는 않았어요. 데이터를 다루는 방식(키-값 쌍)이 다르기 때문이죠.

 

Map의 가장 큰 특징:

  • 키(Key)는 중복될 수 없어요. (각 이름표는 고유해야 하니까요!)
  • 값(Value)은 중복될 수 있어요. (다른 이름표에 같은 내용이 적힐 수는 있죠!)
  • 키를 사용해서 값을 매우 빠르게 찾아올 수 있어요. 🚀

대표적인 구현 클래스로는 HashMap이 있습니다.

import java.util.HashMap;
import java.util.Map;

public class MapExample {
    public static void main(String[] args) {
        // <String, Integer>: 키는 String 타입, 값은 Integer 타입으로 하겠다는 약속!
        Map<String, Integer> studentScores = new HashMap<>();

        // 학생 점수 저장 (put) - 키(이름)와 값(점수)을 함께 넣어줘요.
        studentScores.put("해리", 85);
        studentScores.put("헤르미온느", 100);
        studentScores.put("론", 70);

        System.out.println("학생 점수 현황: " + studentScores); // {해리=85, 론=70, 헤르미온느=100} (순서 보장 안됨)

        // 특정 학생의 점수 조회 (get) - 키(이름)로 값을 찾아와요.
        int hermioneScore = studentScores.get("헤르미온느");
        System.out.println("헤르미온느 점수: " + hermioneScore); // 100

        // 이미 있는 키에 값을 넣으면? -> 덮어쓰기!
        studentScores.put("론", 75); // 론의 점수 수정
        System.out.println("수정 후 현황: " + studentScores); // {해리=85, 론=75, 헤르미온느=100}

        // 특정 학생(키)이 있는지 확인 (containsKey)
        System.out.println("말포이 점수 있나요? " + studentScores.containsKey("말포이")); // false

        // 전체 학생(키) 목록 보기 (keySet)
        System.out.println("시험 본 학생들: " + studentScores.keySet()); // [해리, 론, 헤르미온느]
    }
}

Map은 ID와 사용자 정보, 설정 이름과 값 등 키를 통해 특정 데이터를 빠르게 찾거나 관리해야 할 때 아주 강력한 도구입니다!

 

 

6. 컬렉션 속 보물찾기! - 반복자 (Iterator) 🚶‍♀️

컬렉션에 담긴 데이터들을 하나씩 꺼내서 사용해야 할 때가 많겠죠? 이럴 때 사용하는 것이 반복자(Iterator)입니다. 마치 컬렉션 속을 탐험하며 아이템을 하나씩 확인하는 탐험가 같아요!

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class IteratorExample {
    public static void main(String[] args) {
        List<String> potions = new ArrayList<>();
        potions.add("폴리주스 마법약");
        potions.add("펠릭스 펠리시스");
        potions.add("위젠웰드 마법약");

        System.out.println("--- List 순회 (Iterator) ---");
        Iterator<String> potionIterator = potions.iterator();
        while (potionIterator.hasNext()) { // 다음 아이템이 있다면?
            String potion = potionIterator.next(); // 다음 아이템을 꺼낸다!
            System.out.println("마법약 발견: " + potion);
        }

        Set<String> creatures = new HashSet<>();
        creatures.add("히포그리프");
        creatures.add("도깨비");
        creatures.add("집요정");

        System.out.println("\n--- Set 순회 (향상된 for문) ---");
        // 요즘은 향상된 for문을 더 많이 써요! (내부적으로 Iterator 사용)
        for (String creature : creatures) {
            System.out.println("신비한 동물: " + creature);
        }
    }
}

 

Iterator는 모든 Collection 타입에서 사용할 수 있는 표준적인 순회 방법이고, 요즘은 더 간편한 향상된 for문(enhanced for loop)을 많이 사용합니다. (MapkeySet()이나 entrySet()을 이용해 비슷하게 순회할 수 있어요!)

 

 

7. 정리하며 📝

오늘은 자바에서 데이터를 효율적으로 관리하는 마법, 컬렉션 프레임워크에 대해 배웠습니다! ✨

  • 배열 안녕! 👋: 크기 고정의 한계를 넘어 동적으로 데이터를 관리하는 컬렉션의 필요성을 알았습니다.
  • 컬렉션의 양대 산맥: 순서와 중복을 다루는 List, 중복 없는 특별함을 위한 Set 인터페이스를 만났습니다.
  • 이름표 붙이기 달인: 키-값 쌍으로 데이터를 관리하는 강력한 Map 인터페이스를 배웠습니다. (컬렉션은 아니지만 친구!)
  • 대표 구현체: ArrayList, HashSet, HashMap 등 실제 사용 예시를 통해 감을 잡았습니다.
  • 보물찾기 전문가: Iterator와 향상된 for문으로 컬렉션 속 데이터를 자유롭게 탐험하는 법을 익혔습니다.

이제 여러분은 자바에서 다량의 데이터를 훨씬 더 체계적이고 유연하게 다룰 수 있는 강력한 마법 도구들을 손에 넣으셨습니다! 💪 어떤 데이터를 만나든 자신 있게 정리하고 활용하는 데이터 마법사가 되어보세요! 꾸준히 사용해보는 것이 중요합니다! 💻

이야~ 오늘도 정말 알찬 내용으로 머릿속이 가득 찬 느낌이네요! 새로운 마법을 배우느라 정말 고생 많으셨습니다! 👏

 

이 컬렉션 지식들이 여러분의 코드를 더욱 풍성하고 효율적으로 만드는 데 큰 도움이 되기를 진심으로 바랍니다! 😊

 

 

그리고 여러분!!! 5월 1일 근로자의 날은 다들 잘 보내셨나요? 푹 쉬면서 재충전의 시간을 가지셨기를 바랍니다! (혹시 어제도 열심히 일하신 분들이 계시다면, 정말 존경과 응원의 박수를 보냅니다! 짝짝짝! 🥳)

 

자, 이제 오늘 하루도 거의 마무리되어 가네요! 내일은 드디어 신나는 금요일입니다! 🎉 조금만 더 힘내서 이번 주 마무리까지 모두 함께 파이팅 해봅시다! 💪

 

오늘 하루도 정말 정말 수고 많으셨습니다! 푹 주무시고, 우리는 다음 시간에 더 유익하고 재미있는 내용으로 다시 만나요! 👋 안녕~!

 

https://abit.ly/lisbva