공부내용공유

Java Array, List 차이, 사용법 본문

Server/Java

Java Array, List 차이, 사용법

forfun 2023. 6. 28. 10:44

서론


지금까지 알고리즘 문제를 python으로만 해서 문제를 풀 때 자료형에 관해서 크게 고민을 하면서 푼적이 없었다.

요즘 자바로도 코딩 테스트 연습을 하고 있는데 array 와 list 를 언제 쓰고 어떻게 쓰는지에 대해 이해도가 부족함을 느껴 정리하고자 이 글을 작성하였다.

목차

  • Array 란
  • List 란
  • 장,단점
  • 활용법

본론


Array 란?

  • 여러 데이터들이 index (식별자) 와 값으로 구성된 자료구조
  • index 는 유일한 식별자이다.
  • 논리적 저장 순서와 물리적 저장 순서가 동일하다
    • index를 통한 접근이 O(1) 이다.
    • 캐시 hit 가 일어나기 좋다
  • 초기에 크기를 정하고 , 컴파일 이후 크기 변경이 불가능 하다.
  • 연속된 메모리 공간으로 이루어져 있다.

List 란?

  • 순서가 있는 엘리먼트의 모임으로 배열과 다르게 빈 엘리먼트를 허용하지 않는다.
  • 인덱스는 배열과 달리 유일한 식별자라기 보단 순서정도를 나타낸다.
  • 순차성을 보장하지 않는다.
    • 캐시 hit 이 일어날 확률이 적다.
  • 크기를 동적으로 정할 수 있다.
  • 불연속적인 메모리 공간으로 이루어져 있다.

장,단점


Array

  • 장점
    • 메모리 공간이 연속적이여서 관리가 편하다.
    • 인덱스를 사용한 검색이 빠르다.
  • 단점
    • 컴파일 이후 크기 변화가 불가능 하다.
    • 데이터가 삭제되도 공간은 남아있기 때문에 비효율적이다.
    • 정적이여서 배열의 크기를 컴파일 이전에 정해줘야 한다.

List

  • 장점
    • 포인터가 바로 다음 데이터를 가르키기 때문에 삽입, 삭제 연산이 빠르다.
    • 크기 할당을 동적으로 할 수 있다.
    • 데이터 삭제시 포인터가 해당 공간을 안가르키기 때문에 효율적이다.
  • 단점
    • 검색 성능이 좋지 않다. (5번째 객체를 검색하려면 1,2,3,4,5 의 순서를 거쳐야 한다.)
    • 기본 타입을 담을 수 없다(객체 타입만 가능 Wrapper class 사용해야 함)
    • 포인터를 통해 데이터를 가르키므로 추가적인 메모리 공간이 발생한다.

결론

  • 배열: 데이터의 크기가 변하지 않고, 추가적인 삽입이나 삭제가 잘 안일어나고 조회가 많이 발생하는 경우 효과적이다.
  • 리스트: 데이터의 크기가 가변적이고, 삽입 삭제 연산이 많이 발생하며 조회가 적게 발생되는 경우 효과적이다.

활용법


Array 활용법

//크기 할당 & 초기화 없이 배열 참조변수만 선언
int[] arr;
int arr[];
// 선언과 동시에 배열 크기 할당
int[] arr = new int[510];
String[] arr = new String[10];
// 기존 배열의 참조 변수에 초기화 할당하기
int[] arr;
arr = new int[5]; //5의 크기를 가지고 초기값 0으로 채워진 배열 생성
// 선언과 동시에 배열의 크기 지정 및 값 초기화
int[] arr = {1,2,3,4,5};
int[] arr = new int[]  {1,3,5,2,4};
String[] friuts= {"사과","배","복숭아","망고"};
// 2차원 배열 선언
int[][] arr = new int[4][3];  //4행 3열의 2차원 배열 선언
int[][] arr = { {2, 5, 3}, {4, 4, 1}, {1, 7, 3}, {3, 4, 5}}; // 선언 후 값 바로 넣어주기

초기화를 할때 배열 안에 값이 primitive 이면 초기값이 있지만 (int 의 경우는 0)

참조타입의 배열을 선언할 경우 엘리먼트의 초기값은 null 임을 주의해야 한다.

int[] arr = {1,2,3,4,5};
for(int i = 0; i < arr.length; i++) {
       System.out.println(arr[i]);
}
for(int number : arr) {
       System.out.println(number);
}
//결과
//1
//2
//3
//4
//5

List 활용법

자주 사용되는 ArrayList는 List interface의 구현체이다.

특징

  • 처음에 설정한 용량으로 만들어지나 데이터가 추가적으로 들어와 용량이 더 필요하면 배열 크기를 1.5 배 증가시킨다.
  • primitive 는 담지 못함 객체 타입인 Wrapper 를 이용해야함
  • 표준 배열보다는 느림

활용법

//선언
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<String> list2 = new ArrayList<>(); // 타입 생략 가능
ArrayList<Product> pList = new ArrayList<>(); // 타입으로 클래스도 가능

//삭제
list.remove(2); // 2번 인덱스 삭제 => remove(index)
list.clear(); // 리스트의 모든 값 삭제
list.remove(list.indexOf(2)); // 리스트에 2를 포함한 인덱스 리턴 후 삭제

// 값 조회
int index = list.indexOf(2); // 원하는 값의 인덱스를 리턴, 없으면 -1 리턴
boolean b = list.contains(2); // 원하는 값의 존재 유무
while(list.indexOf(2) == -1) { // 리스트에 원하는 값 모두 삭제
	list.remove(list.indexOf(2));
}

//리스트 출력
System.out.println(list); // 리스트 전체 출력
System.out.println(list.get(2)); // 2번 인덱스 출력
for(int i : list) {
    System.out.println(i);
}
Iterator iter = list.iterator(); // 반복자 사용
while(iter.hasNext()){
    System.out.println(iter.next());
}

참고 블로그

https://velog.io/@adam2/Array%EC%99%80-List%EA%B7%B8%EB%A6%AC%EA%B3%A0-Java-List

https://crazykim2.tistory.com/558

https://brownbears.tistory.com/520