공부 기록/Java with ChatGPT
[Java/ChatGPT] Day 4: 컬렉션(Collection)과 ArrayList 완전 정복
dev.jelee
2025. 6. 9. 19:53
[ 학습 목표 ]
- 컬렉션 기본 개념: 배열 vs 컬렉션 차이 이해
- ArrayList 사용법: 객체 추가, 삭제, 조회
- for-each 반복: 리스트 요소 출력
- 간단한 프로젝트 만들기: 도서 목록 관리 기능 구현
[ 이론 ]
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가 개선해서 리팩토링 해주었는데 예외처리와 내가 미처 생각하지 못한 부분까지 잡아주었다. 이번 계기로 조금 더 넓게 바라보고 생각하도록 노력해야겠다.