본문 바로가기
Java

[JAVA] 다양한 컬렉션 타입들을 사용해 학생 데이터 관리 시스템 만들기

by teamnova 2024. 3. 26.

안녕하세요. 이번 게시글에서는 컬렉션 프레임워크를 활용해 데이터를 관리할 수 있는 간단한 학생 데이터 관리 시스템에 대해 설명해드리겠습니다. 

자바의 ArrayList, HashMap, HashSet과 같은 컬렉션들을 사용하여 데이터를 관리하는 방법을 사용할 것이며

각 학생을 객체로 표현하고, 이를 관리하는 클래스를 통해 객체 지향 프로그래밍을 만들어보려고 합니다.

 

그럼 ArrayList, HashMap, HashSet 의 차이점에 대해 설명하겠습니다.

ArrayList

  • 타입: ArrayList는 List 인터페이스를 구현하는 클래스입니다.
  • 특징: ArrayList는 내부적으로 배열을 사용하여 요소를 저장합니다. 이는 인덱스를 통한 빠른 접근이 가능하게 해주지만, 크기 조정이 필요할 때는 비용이 많이 듭니다(예: 새로운 요소를 추가하거나 삭제할 때).
  • 사용 사례: 순서가 중요하고, 데이터에 빠르게 접근해야 하지만, 자주 크기를 변경하지 않을 때 유용합니다.
  • 주의점: 동일한 요소를 여러 번 저장할 수 있으며, null 값을 포함할 수 있습니다.

HashMap

  • 타입: HashMap은 Map 인터페이스를 구현하는 클래스입니다.
  • 특징: HashMap은 키-값 쌍으로 데이터를 저장합니다. 이 구조는 키를 통해 빠르게 데이터를 검색할 수 있도록 해줍니다. 내부적으로 해시 테이블을 사용하여 데이터를 저장합니다.
  • 사용 사례: 키를 통해 빠르게 데이터를 찾거나, 데이터에 고유 식별자를 부여해야 할 때 사용합니다.
  • 주의점: 각 키는 유일해야 하지만, 다른 키와 동일한 값을 가질 수 있습니다. 또한, 하나의 null 키와 여러 null 값을 허용합니다.

HashSet

  • 타입: HashSet은 Set 인터페이스를 구현하는 클래스입니다.
  • 특징: HashSet은 중복된 요소를 허용하지 않습니다. 내부적으로 HashMap을 사용하여 요소를 저장하며, 각 요소를 키로 사용하고, 모든 값은 동일한 더미(dummy) 값을 가집니다.
  • 사용 사례: 중복을 허용하지 않는 고유한 요소들의 집합을 관리할 때 사용합니다.
  • 주의점: 요소의 순서는 보장되지 않으며, null 값도 포함할 수 있습니다.

요약

  • ArrayList: 순서가 중요한 요소들의 리스트. 요소의 중복이 허용됩니다.
  • HashMap: 키-값 쌍으로 데이터를 저장. 키를 통한 빠른 접근이 가능하며, 키는 유일해야 합니다.
  • HashSet: 중복 없이 고유한 요소들을 저장. 요소의 순서는 보장되지 않습니다.

 

우선 시연영상입니다.

 

 

전체 코드입니다.

// 필요한 클래스들을 임포트합니다.
import java.util.*;

public class StudentManagementSystem {

    // 학생 정보를 저장하는 'Student'라는 내부 클래스를 정의합니다.
    static class Student {
        String id;         // 학생의 ID
        String name;       // 학생의 이름
        String department; // 학생의 학과

        // 학생 객체 생성자: 새로운 학생 객체를 만들 때 ID, 이름, 학과 정보를 초기화합니다.
        Student(String id, String name, String department) {
            this.id = id;
            this.name = name;
            this.department = department;
        }

        // 학생 정보를 문자열로 반환하는 메서드. 객체를 출력할 때 유용합니다.
        @Override
        public String toString() {
            return "Student{" +
                   "id='" + id + '\'' +
                   ", name='" + name + '\'' +
                   ", department='" + department + '\'' +
                   '}';
        }
    }

    // 학생 객체들을 저장하기 위한 컬렉션들을 선언합니다.
    List<Student> students = new ArrayList<>();
    Map<String, Student> studentMapById = new HashMap<>();
    Map<String, Student> studentMapByName = new HashMap<>();
    Set<String> studentIds = new HashSet<>();

    // 새로운 학생을 추가하는 메서드입니다.
    public void addStudent(Student student) {
        // 이미 등록된 학생 ID인지 확인합니다.
        if (studentIds.add(student.id)) {
            students.add(student);
            studentMapById.put(student.id, student);
            studentMapByName.put(student.name, student);
        } else {
            // 중복된 ID가 있으면 오류 메시지를 출력합니다.
            System.out.println("이미 존재하는 학생 ID입니다: " + student.id);
        }
    }

    // ID를 기반으로 학생을 찾는 메서드입니다.
    public Student findStudentById(String id) {
        return studentMapById.get(id);
    }

    // 이름을 기반으로 학생을 찾는 메서드입니다.
    public Student findStudentByName(String name) {
        return studentMapByName.get(name);
    }

    // 등록된 모든 학생들의 정보를 출력하는 메서드입니다.
    public void printStudents() {
        for (Student student : students) {
            System.out.println(student);
        }
    }

    // 프로그램의 시작점인 main 메서드입니다.
    public static void main(String[] args) {
        // 학생 관리 시스템 객체를 생성합니다.
        StudentManagementSystem sms = new StudentManagementSystem();

        // 몇 명의 학생을 시스템에 추가합니다.
        sms.addStudent(new Student("2024001", "홍길동", "컴퓨터공학과"));
        sms.addStudent(new Student("2024002", "김철수", "기계공학과"));
        sms.addStudent(new Student("2024003", "이영희", "전자공학과"));

        // 사용자 입력을 받기 위한 Scanner 객체를 생성합니다.
        Scanner scanner = new Scanner(System.in);
        System.out.println("학생의 ID 또는 이름을 입력하세요: ");
        String input = scanner.nextLine();

        // 입력받은 정보로 학생을 찾습니다.
        Student foundStudent = sms.findStudentById(input);
        if (foundStudent == null) {
            foundStudent = sms.findStudentByName(input);
        }

        // 찾은 학생의 정보를 출력합니다.
        if (foundStudent != null) {
            System.out.println("검색된 학생: " + foundStudent);
        } else {
            // 학생을 찾지 못하면 이 메시지를 출력합니다.
            System.out.println("학생을 찾을 수 없습니다.");
        }
    }
}