본문 바로가기
Java/Java 예제

Java ArrayList 예제

by ssury94 2024. 12. 17.

ArrayList를 다루는 StudentManager 클래스는 controller 패키지에

student 객체를 다루는 Student 클래스는 entity 패키지에 두고 코딩해보자.

 

import controller.StudentManager;
import entity.Student;

public class ArrayMain {
    public static void main(String[] args) {

        StudentManager manager = new StudentManager();

        // TODO: 최소 3명의 학생을 생성하고 manager에 추가하세요.
        // id 1, 홍길동, 30
        Student s1=new Student(1,"홍길동", 30);
        // id 2, 김나나, 22
        Student s2=new Student(2, "김나나", 22);
        // id 3, 최영수, 25
        Student s3=new Student(3, "최영수", 25);

        manager.addStudent(s1);
        manager.addStudent(s2);
        manager.addStudent(s3);


        // TODO: 모든 학생 정보를 출력하세요.
        manager.displayAllStudents();
        System.out.println();

        // TODO: ID로 한 명의 학생을 검색하고 그 정보를 출력하세요.
        // id 가 3인 학생 검색하여 출력.
        (manager.findStudent(3)).print();
        //manager.findStudent(3))가 student 객체임
        System.out.println();

        // TODO: 한 명의 학생을 삭제하세요. id가 1인 학생 삭제.
        manager.removeStudent(1);

        // TODO: 삭제 후 모든 학생 정보를 다시 출력하세요.
        manager.displayAllStudents();

    }
}

 

package entity;

public class Student {
    private int id;
    private String name;
    private int age;

    // TODO: 디폴트생성자를 만드세요.
    public Student() {
    }
    // TODO: 다음 생성자를 구현하세요.
    // 힌트: id, name, age를 매개변수로 받아 초기화합니다.

    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    // 함수는 필요할 때 만들자
    // TODO: print 함수를 만드세요. 학생 정보를 문자열로 출력
    // 힌트: "ID: [id], 이름: [name], 나이: [age]" 형식 출력
    public void print() {
        System.out.println("ID: " + id + ", 이름: " + name + ", 나이: " + age);
    }


    // TODO: getter와 setter 메소드를 구현하세요.
    // 힌트: 각 필드에 대해 getter와 setter를 만듭니다.

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }




}

 

package controller;
//삭제하고 관리하는 클래스 controller Class

import entity.Student;

import java.util.ArrayList;
//자바의 유틸이라는 패키지의 ArrayList

public class StudentManager {
    private ArrayList<Student> students;
    //students는 Student 객체들을 관리하는 ArrayList
    //src에 controller(관리) 새 패키지를 만듬

    // TODO: students ArrayList를 초기화하세요.
    // students 객체생성하자
    public StudentManager() {
        students=new ArrayList<>();
    }

    public void addStudent(Student student) {
        // TODO: 학생을 ArrayList에 추가하는 코드를 작성하세요.
        students.add(student);
        // 클래스의 객체 저장
    }

    public void removeStudent(int id) {
        // TODO: 주어진 id와 일치하는 학생을 ArrayList에서 제거하는 코드를 작성하세요.
        // 힌트: ArrayList의 remove() 메소드를 사용하세요.
        for(Student student : students){
            if(student.getId()==id){
                students.remove(student);
            }
        };
    }

    public Student findStudent(int id) {
        // TODO: 주어진 id와 일치하는 학생을 찾아 반환하는 코드를 작성하세요.
        // 힌트: for 루프를 사용하여 ArrayList를 순회하며 찾습니다.
        for (Student student : students) {
            // student를 관리하는 ArrayList =students 에서
            // Student 클래스의 student 변수 가져와라
            // students의 ArrayList를 순회함
            if (student.getId() == id) {
                return student;
            }
        }
        return null; // 전부 순회했는데 찾지 못한 경우 null 반환
    }


    public void displayAllStudents() {
        // TODO: 모든 학생의 정보를 출력하는 코드를 작성하세요.
        // 힌트: for-each 루프를 사용하여 ArrayList를 순회하며 각 학생 정보를 출력합니다.
        for( Student student: students){
            // student를 저장하는 ArrayList =students 에서
            // Student 클래스의 student 변수 가져와라
            student.print();
        }



    }
}

 

for (a : b) 구문

for (a : b) 구문은 Java에서 향상된 for 문 또는 for-each 루프라고 불리며, 

배열이나 컬렉션의 모든 요소를 순회하는 데 사용됩니다.

이 구문은 코드의 가독성을 높이고, 인덱스를 직접 관리할 필요가 없기 때문에 간결하게 작성가능

public void displayAllStudents() {
    // TODO: 모든 학생의 정보를 출력하는 코드를 작성하세요.
    // 힌트: for-each 루프를 사용하여 ArrayList를 순회하며 각 학생 정보를 출력합니다.
    for(Student student:students){
        student.print();
    }
}
for (데이터타입 변수명 : 배열/컬렉션) {
    // 실행할 코드
}

for (a : b) 구문 작동방식

  1. 배열이나 컬렉션의 첫 번째 요소부터 시작합니다.
  2. 해당 요소를 지정한 변수에 할당합니다.
  3. 코드 블록 내의 문장을 실행합니다.
  4. 마지막 요소까지 모두 순회할 때까지 2~3번의 과정을 반복합니다.

 

 

첨삭

public void removeStudent(int id) {
    // TODO: 주어진 id와 일치하는 학생을 ArrayList에서 제거하는 코드를 작성하세요.
    // 힌트: ArrayList의 remove() 메소드를 사용하세요.

    students.remove(id);
}

이 코드는 ArrayList의 인덱스를 기준으로 제거합니다:
id를 ArrayList의 인덱스로 간주하여 해당 위치의 요소를 제거합니다.
학생의 실제 ID와 ArrayList의 인덱스가 일치한다는 가정 하에 동작합니다.
이는 위험할 수 있습니다. 왜냐하면 학생의 ID와 ArrayList의 인덱스가 항상 일치하지는 않기 때문입니다.

public void removeStudent(int id) {
    // TODO: 주어진 id와 일치하는 학생을 ArrayList에서 제거하는 코드를 작성하세요.
    // 힌트: ArrayList의 remove() 메소드를 사용하세요.
    for(Student student : students){
        if(student.getId()==id){
            students.remove(student);
        }
    };
}

후자가 옳은방법

모든 학생을 순회하며 주어진 id와 일치하는 학생을 찾습니다.
일치하는 학생을 찾으면 그 학생 객체를 제거합니다.
학생의 실제 ID를 기준으로 삭제하므로 더 안전하고 정확합니다.

 

실제 학생의 ID를 기준으로 삭제하기 때문에 의도한 대로 정확히 동작합니다.