자료구조 & 알고리즘/자료구조 & 알고리즘

[자료구조] List - ArrayList 실습 - 학생 수 입력 및 출력

오징어달료 2024. 9. 20. 02:01

ArrayList


ArrayList

List 인터페이스의 구현체이며 순차 리스트 


순차 리스트의 특징

- 연속된 메모리 공간 사용

- 빠른 조회

- 고정된 크기

- 삽입 및 삭제의 성능이 비효율적임

- 메모리 활용 

- 데이터의 접근 방식

- 정렬된 데이터 관리

- 순차 탐색

- 동기화 문제


ArrayList의 특징

- 동적 크기 조정 : ArrayList는 크기가 고정된 배열과 달리 동적으로 크기를 조정할 수 있음. 배열이 가득 차면 내부적으로 더 큰 배열을 생성하고 기존 배열의 요소를 복사하여 확장함

- 인덱스를 통한 빠른 접근 : 배열처럼 ArrayList는 인덱스 통해 요소에 직접 접근할 수 있음. 인덱스를 사용한 조회 연산(get())의 시간 복잡도는 **O(1)**

- 느린 삽입 / 삭제 (중간요소) : 배열처럼 연속된 메모리 공간을 사용하기 때문에 중간에 요소를 삽입하거나 삭제할 경우 나머지 요소들을 이동시켜야 함. 따라서 삽입(add() / insert()) 또는 삭제(remove())의 시간 복잡도는 평균적으로 **O(n)**

- 중복 허용 : ArrayList는 중복 요소를 허용함

- Null 값 허용 : ArrayList는 null값을 요소로 추가하는 것을 허용함

- 비동기 처리가 안됨 : ArrayList는 동기화되지 않은 클래스이므로 멀티스레드 환경에서는 안정하지 않음. 여러 스레드가 동시에 ArrayList를 수정할 경우 ConcurrentModificationException 이 발생할수 있음. 멀티스레드 환경에서 사용하려면 Collections.synchronizedList() 를 사용하여 동기화된 리스트로 만들어야함

- 초기 용량 설정 가능 : ArrayList를 생성할 때 초기 용량을 설정할 수 있음. 초기 용량은 ArrayList가 내부적으로 배열을 생성할 때의 크기임. 만약 초과하면 배열이 자동으로 확장되지만, 초기 용량을 적절히 설정하면 성능을 최적화 할 수 있음


코드 개요

  동적으로 학생수를 입력받고 학생수에 따른 학생 이름을 ArrayList를 활용하여 저장후, 출력하는 프로그램

package list;

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

public class List03_ArrayList {

    public static void main(String[] args) {
        // 동적으로 입력받는 학생이름을 저장한 후 출력하는 코드

        // 학생 이름을 담을 List
        List<String> studentName = new ArrayList<>();

        // 입력받을수 있도록 Scanner 사용
        Scanner scanNum = new Scanner(System.in);
        Scanner scanName = new Scanner(System.in);

        System.out.print(" >>>>> 입력 할 학생 수를 입력하세요 : " );
        // 입력받을 학생 수 지정
        //String nameTemp = "";
        int studentNum = scanNum.nextInt();

        for(int i = 0; i < studentNum; i++){
            System.out.print(" >>>>> 학생 이름을 입력 하세요 : ");

            String nameTemp = scanName.nextLine();
            studentName.add(nameTemp);
        }

        System.out.println(" >>>>> 총 학생 수 : " + studentNum + " 명 ");
        for(int j = 0; j < studentName.size(); j++){
            System.out.print( (j+1) + " 번째 학생 : " + studentName.get(j) + " | ");
        }


    }

}