공부 기록/Java with ChatGPT

[Java/ChatGPT] Day 4: 컬렉션(Collection)과 ArrayList 완전 정복

dev.jelee 2025. 6. 9. 19:53

[ 학습 목표 ]

  1. 컬렉션 기본 개념: 배열 vs 컬렉션 차이 이해
  2. ArrayList 사용법: 객체 추가, 삭제, 조회
  3. for-each 반복: 리스트 요소 출력
  4. 간단한 프로젝트 만들기: 도서 목록 관리 기능 구현

 

[ 이론 ]

1. 컬렉션이란?

  • 데이터를 담는 자료 구조의 집합이다.
  • 배열은 크기가 고정되어 있지만, 컬렉션은 크기 변경이 가능하다.
  • 자바의 대표 컬렉션:
    • List: 순서 있음, 중복 허용 -> ArrayList, LinkedList
    • set: 순서 없음, 중복 불가 -> HashSet
    • Map: 키-값 쌍 -> HashMap

 

2. ArrayList<Book> 사용법

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<Book> books = new ArrayList<>();

        books.add(new Book("개미", "베르나르 베르베르"));
        books.add(new Book("데미안", "헤르만 헤세"));
        books.add(new Book("어린왕자", "생텍쥐페리"));

        for (Book book : books) {
            book.printInfo();
        }

        System.out.println("책 개수: " + books.size());
    }
}

 

 

[ 실습 미션 ]

1. 작은 도서관 프로그램

📖 요구사항

  • 책을 ArrayList<Book>에 저장
  • 메뉴 제공:
    • 책 추가
    • 책 전체 출력
    • 특정 제목 검색
    • 프로그램 종료

🧾 예시 출력 (콘솔 메뉴)

1. 책 추가
2. 책 목록 출력
3. 책 검색
4. 종료
메뉴 선택: 1
책 제목 입력: 개미
저자 입력: 베르나르 베르베르
> 책이 추가되었습니다!

메뉴 선택: 2
제목: 개미, 저자: 베르나르 베르베르

메뉴 선택: 3
검색할 제목: 개미
> 제목: 개미, 저자: 베르나르 베르베르

메뉴 선택: 4
> 프로그램을 종료합니다.

 

🔧 실습 조건

  • Book 클래스 그대로 사용 (필드는 private + getter 필요)
  • ArrayList<Book> 사용
  • Scanner로 사용자 입력 받기
  • 반복문으로 메뉴 구성

▼ 내가 작성한 코드

public class Book {
  private String title;
  private String author;

  Book () { } // 기본 생성자

  Book (String title, String author) {
    this.title = title;
    this.author = author;
  }

  // setter, getter
  public void setTitle(String title) {
    this.title = title;
  }

  public String getTitle() {
    return title;
  }

  public void setAuthor(String author) {
    this.author = author;
  }

  public String getAuthor() {
    return author;
  }

  // 메서드
  public void printInfo() {
    System.out.println("제목: " + title + ", 저자: " + author);
  }

  @Override
  public String toString() {
    return "제목: " + title + ", 저자: " + author;
  } 
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class ex1 {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    ArrayList<Book> books= new ArrayList<>();

    while (true) {
      System.out.println("1. 책 추가\n" + "2. 책 목록 출력\n" + "3. 책 검색\n" + "4. 종료");
      int choice = Integer.parseInt(br.readLine());
      
      switch (choice) {
        case 1 :
          System.out.println("책 제목 입력: ");
          String bookName = br.readLine();
          System.out.println("저자 입력: ");
          String author = br.readLine();
          books.add(new Book(bookName, author));
          System.out.println("책 제목: " + bookName + ", 저자: " + author + "\n책이 추가되었습니다!");
          break;
        case 2 :
          for (Book book : books) {
            System.out.println("제목: " + book.getTitle() + ", 저자: " + book.getAuthor());
          }
          break;
        case 3 :
          System.out.println("검색할 제목: ");
          String search = br.readLine();
          for (Book book : books) {
            if (book.getTitle().equals(search) || book.getAuthor().equals(search)) {
              System.out.println("제목: " + book.getTitle() + ", 저자: " + book.getAuthor());
            }
          }
          break;
        case 4 :
          return;
      }
    }
  }
}

 

★ 개선된 코드

  • try-catch문을 사용하여 숫자 외 문자를 입력했을 경우를 대비해 예외처리 작성
  • 조금 더 친절한 프로그램을 위해 "메뉴 선택: "을 추가
  • 책 추가할 때, 가독성을 위해 println() -> print()로 변경
  • 검색에서 검색 결과가 없는 경우를 위해 소스 코드 추가
  • 메뉴에 없는 번호를 선택 했을 경우를 대비해 default : 후 1~4번 중에서 선택해 달라는 코드 추가
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class ex2 {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    ArrayList<Book> books= new ArrayList<>();

    while (true) {
      System.out.println("1. 책 추가\n" + "2. 책 목록 출력\n" + "3. 책 검색\n" + "4. 종료");
      System.out.print("메뉴 선택: ");

      try {
        int choice = Integer.parseInt(br.readLine());
      
        switch (choice) {
          case 1 :
            System.out.print("책 제목 입력: ");
            String bookName = br.readLine();
            System.out.print("저자 입력: ");
            String author = br.readLine();
            books.add(new Book(bookName, author));
            System.out.println("책 제목: " + bookName + ", 저자: " + author + " 책이 추가되었습니다!");
            break;

          case 2 :
            for (Book book : books) {
              System.out.println("제목: " + book.getTitle() + ", 저자: " + book.getAuthor());
            }
            break;

          case 3 :
            System.out.println("검색할 제목: ");
            Boolean found = false;
            String search = br.readLine();
            for (Book book : books) {
              if (book.getTitle().equals(search) || book.getAuthor().equals(search)) {
                System.out.println("제목: " + book.getTitle() + ", 저자: " + book.getAuthor());
                found = true;
              }

            }
            if (!found) {
              System.out.println("검색 결과가 없습니다.");
            }
            break;

          case 4 :
            return;

          default :
            System.out.println("1~4 사이의 숫자를 입력해주세요.");
        }

      } catch (NumberFormatException e) {
        System.out.println("숫자를 입력해주세요.");
      }
      
    }
  }
}

 

 

 


[ 메모 ]

  • <> 이건 제네릭이다.
    • 제네릭은 클래스, 인터페이스, 메서드에서 사용할 수 있는 타입 파라미터이다.
    • 예:
      • 클래스: class Box<T> { T value; }
      • 메서드: <T> void print(T item)
      • 인터페이스: interface Comparable<T>
      • 컬렉션: List<T>, Map<K, V> 등
    • 제네릭을 사용하는 이유는
      • 타입 안정성(type safety)을 확보할 수 있기 때문이다.
      • 코드의 오류를 사전에 방지하고, 컴파일 타입에서 타입 오류를 잡을 수 있기 때문이다.
  • 실습에서 내가 작성한 코드에서 ChatGPT가 개선해서 리팩토링 해주었는데 예외처리와 내가 미처 생각하지 못한 부분까지 잡아주었다. 이번 계기로 조금 더 넓게 바라보고 생각하도록 노력해야겠다.