[Java] Array 와 List

박세진·2021년 1월 20일
0
post-thumbnail

면접을 준비하면서 array 와 list의 차이에 대해 묻는 질문을 많이 보았다. 어느정도 알고 있기는 하지만, 이번 글을 계기로 확실히 정리하면서 누가 나에게 array와 list의 차이가 뭐야?하고 묻는다면 망설임 없이 대답할 수 있도록 할 것이다.

Array를 왜 사용할까 ?

앞의 글에서, 변수는 한개의 데이터만 저장 할 수 있다고 했다. 따라서 저장할 데이터의 수가 많아진다면, 그만큼 많은 변수가 필요하다.
예를 들어 학생 50명의 성적을 저장하고 평균값을 구한다고 해보자. 그렇다면 먼저 학생 50명의 점수를 저장하기 위해 변수를 50개 선언하고, 평점을 구하기 위해 변수들을 모두 더해야 한다.

위와 같은 방법은 매우 비효율적이고 지루하다. 같은 타입의 많은 양의 데이터를 다루는 프로그램에서는 좀 더 효율적인 방법이 필요한데 , 그게 바로 배열이다.
즉, 데이터가 많아지면 그룹 관리의 필요성이 생기고, 이럴 때 프로그래밍에서 사용하는 것이 배열이라고 할 수 있다.

Array

  • 여러 데이터를 하나의 이름으로 그룹핑 해서 관리하기 위한 자료구조
  • 하나의 변수에 여러 정보를 다음 수 있음
  • 같은 타입의 데이터를 연속된 공간에 나열시키고, 각 데이터에 인덱스를 부여해 놓은 자료구조.
  • 논리적 저장순서와 물리적 저장순서가 일치한다 => index를 이용해 해당 원소에 접근할 수 있다.
  • 인덱스를 이용해 데이터를 가져오려면 데이터에 대한 인덱스 값이 고정되어야 한다. 즉 , 삭제된 엘리먼트의 공간이 그대로 남기 때문에 메모리가 낭비될 수 있다
  • 정의와 동시에 길이를 지정하며, 길이를 바꿀 수 없다.

array에서의 인덱스 : 값에 대한 유일무이한 식별자. (주민번호 같은 것).
이걸 활용해서 데이터 조회를 빠르게 할 수 있다.


List에서의 인덱스 : 몇번째 데이터인가? 정도의 의미.

// array 정의
int[] arr = new int[4];

// array에 값 저장
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;

// array의 길이 확인
System.out.println(arr.length); // 출력결과 : 4
  • 처음 정의할 때 크기를 4로 지정하였으므로, 3개의 값이 설정되었어도 결과는 4
  • 배열의 크기를 생성할 때 지정해야 하거나, 배열의 크기를 변경할 수 없는 것, 그리고 배열에서 설정된 엘리먼트의 개수를 알아낼 수 없다.
  • 이런 이유에서 자바에서는 ArrayList 나 LinkedList와 같은 List를 사용한다.
배열은 인덱스에 따라서 값을 유지. 엘리먼트가 삭제되어도 빈자리(null)이 남게 되어 불필요한 메모리를 차지함.  
삭제한 데이터를 뒤에 위치한 엘리먼트로 바꾸면, 데이터가 순서에 따라서 빈틈없이 위치하게 됨
==> List

[참고]
가변 배열과 같이 길이가 변경 가능한 배열의 경우,
1. 기존의 배열은 그대로 두고
2. 새로운 길이로 지정된 배열을 따로 할당하고 (메모리가 있는지 탐색 필요하다.)
3. 데이터의 복사를 진행하고,
4. 기존의 배열을 삭제한다.
=> 총 3번의 작업과 메모리 탐색이 필요하기 때문에 리소스의 낭비가 크다

List

  • 배열이 가지고 있는 인덱스라는 장점을 버리고, 대신 빈틈없는 데이터의 적재라는 장점을 취한 자료구조
    (리스트 역시 인덱스를 가지고는 있지만, 리스트에서의 인덱스는 몇번째 데이터인가 정도의 의미!)
  • 리스트의 핵심은 엘리먼트들 간의 순서
  • 빈 엘리먼트는 허용하지 않는다.
  • List는 컬렉션 프레임워크의 인터페이스 중 하나이다. 컬렉션 프레임워크에 대한 설명은 아래를 참고하자.
  • Java에서는 ArrayList,LinkedList 의 2가지 형태를 지원한다.

[참고2]

컬렉션 프레임워크

Java에서는 배열의 문제점을 해결하고, 널리 알려진 자료구조를 바탕으로 객체들을 효율적으로 추가/삭제/검색 할 수 있도로고 java.util패키지에 컬렉션과 관련된 인터페이스와 클래스들을 포함시켜 놓았다. 이를 컬렉션 프레임워크라고 부른다.
몇 가지 인터페이스를 통해서 다양한 컬렉션 클래스를 이용할 수 있도록 하는데, 주요 인터페이스로는 List, Set, Map 이 있다.

ArrayList와 LinkedList

1. ArrayList

  • ArrayList에 객체를 추가하면 객체가 인덱스로 관리됨. (일반 배열과 유사)
  • 저장 용량을 초과한 객체들이 들어오면, 자동으로 저장 용량이 늘어난다.
  • 객체를 추가하면 인덱스 0부터 차례대로 저장되고, 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다.
  • 빈번한 객체의 삽입/삭제가 일어나는 곳에서는 ArrayList를 사용하는 것이 바람직하지 않다.( 이때는 LinkedList를 사용하는 것이 좋다.)
  • 인덱스 검색이나, 맨 마지막에 객체를 추가하는 경우에는 좋은 성능을 발휘한다.

    고정된 객체들로 구성된 List의 생성 : Arrays.asList 를 이용하자.

package study.test;

import java.util.Arrays;
import java.util.List;

public class ListExample {
	public static void main(String[] args) {
		List<String> list = Arrays.asList("박세진","박세연");
		for (String name : list) {
			System.out.println(name);
		}
	}
}

2. LinkedList

  • ArrayList와 사용 방법은 똑같지만, 내부 구조는 완전 다르다.
    • ArrayList : 내부 배열에 객체를 저장해서 인덱스로 관리
    • LinkedList : 인접 참조를 링크해서 체인처럼 관리한다.
      -> 특정 인덱스의 객체를 삭제/ 삽입하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않는다.

[ArrayList, LinkedList 비교]

구분순차적으로 추가/삭제중간에 추가/삭제검색
ArrayList빠르다느리다빠르다
LinkedList느리다빠르다느리다
  • LinkedList는 중간에 추가/삭제 할 때 앞뒤 링크 정보만 변경하면 되므로 더 빠르다.
  • ArrayList는 뒤쪽 인덱스들을 모두 1씩 증가/감소 시키는 시간이 필요하므로 느리다.

배열(Array)과 리스트(List)의 차이, 그리고 ArrayList와 LinkedList에 대해 알아보았다.
앞으로 헷갈리거나 까먹으면 이 글을 다시 복습하면서 잊어버리지 않도록 공부해야겠다.

profile
계속해서 기록하는 개발자. 조금씩 성장하기!

0개의 댓글