2차원 ArrayList<>를 알아보자!

김성수·2023년 5월 23일
0

Java

목록 보기
7/18

들어가면서..

다익스트라 알고리즘을 풀다가 2차원 ArrayList를 사용하게 되었다.
2차원 ArrayList는 일반적인 ArrayList와 초기화 방식이 다르다.
이유가 뭘까? 둘은 어떠한 차이가 있는걸까? 🤔🤔
그 이유와 둘간의 차이점을 지금부터 알아보자.



1차원 ArrayList와 2차원 ArrayList 차이

핵심만 설명해보자면

1차원 ArrayList는 자바 컴파일러가 타입 유추(Type Inference) 해준다.

따라서, 초기화할 때 타입을 따로 명시해주지 않아도 된다.


반면에,

2차원 ArrayList는 자바에서 타입 유추가 불가능하다.

따라서, 초기화할 때 타입을 따로 명시해줘야 한다.



코드로 보는 예시

1차원 ArrayList 초기화 코드 예시는 아래와 같다.

// 1차원 ArrayList 초기화
ArrayList<Integer> arr = new ArrayList<>();

한편, 2차원 ArrayList 초기화 코드 예시는 아래와 같다.

// 2차원 ArrayList 초기화
ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>();



2차원 ArrayList의 인덱스 접근

2차원 ArrayList의 인덱스에 접근하기 위해서는 미리 초기화를 해줘야 한다.

예를 들어 2차원 ArrayList인 graph의 0번 인덱스에 1 값을 add 해주고 싶을 때

아래와 같이 코드를 선언해준다.

graph.get(0).add(1)

그런데 문제가 있다.

만약 graph.get(0) 인덱스가 존재하지 않는다면?

아래와 같은 에러가 발생한다.

java.lang.IndexOutOfBoundsException


위 말을 들었을 때 이런 생각이 든다.

"어? ArrayList는 크기 초기화를 따로 해주지 않아도 됐는데?"

그렇다. ArrayList는 동적으로 크기가 할당되는 객체이므로 따로 크기를 설정해주지 않아도 된다.

하지만, 2차원 ArrayList의 경우 해당 인덱스에 직접적으로 접근하는 경우가 존재하므로

크기를 초기화 시켜줘야 한다.

(해당 인덱스에 접근하려고 하는데 공간이 없다면 당연하게도 에러가 발생할 것이다.)


크기를 초기화 해주는 코드는 아래와 같다.

for(int i = 0; i <= 10; i++){
    graph.add(new ArrayList<Integer>());
}

위처럼 선언하게 되면

ArrayList에는 0 ~ 10까지의 index가 존재하게 될 것이다.

따라서, 아래와 같은 코드 선언이 가능해진다.

graph.get(0).add(1)
graph.get(1).add(1)
graph.get(2).add(1)
graph.get(3).add(1)
graph.get(4).add(1)
graph.get(5).add(1)
graph.get(6).add(1)
graph.get(7).add(1)
graph.get(8).add(1)
graph.get(9).add(1)
graph.get(10).add(1)
graph.get(11).add(1) // java.lang.IndexOutOfBoundsException 발생!

위 코드에서

graph.get(11).add(1) 

은 java.lang.IndexOutOfBoundsException 발생하는데, 위에서 설명했듯이 해당 인덱스 '11'의 공간이 초기화되지 않아서 발생하는 에러이다.

만약 11까지 인덱스를 사용해야 한다면 아래와 같이 코드를 작성하면 된다.

for(int i = 0; i <= 11; i++){ // i <= 11 <- 11까지 인덱스 공간 확보
    graph.add(new ArrayList<Integer>());
}



알게된 점

ArrayList에도 1차원 2차원이 있다는 사실을 처음 알았다.

그리고 Java의 타입 유추 기능도 알게 되었다.


다음에 2차원 ArrayList를 초기화할 때 헷갈리지 않고 잘 초기화할 수 있을 것 같다.


2차원 ArrayList 인덱스에 접근하기 위해서는 인덱스 공간을 확보시켜줘야 한다는 사실을 알게되었다.

profile
깊이 있는 소프트웨어 개발자가 되고 싶습니다.

0개의 댓글