어제 오늘 내일

[Java 기초] 리스트 안에 리스트 넣기 본문

IT/Java

[Java 기초] 리스트 안에 리스트 넣기

hi.anna 2025. 8. 24. 12:28

자바(Java)에서 데이터를 저장할 때 ArrayList는 가장 많이 사용하는 컬렉션 클래스 중 하나입니다.
그런데 단순히 1차원 구조로만 쓰는 게 아니라, 리스트 안에 리스트(List<List>) 를 넣어 2차원 배열처럼 활용할 수도 있습니다.

예를 들어,

  • 학생별 점수표 (행 = 학생, 열 = 과목 점수)
  • 게시판 글(리스트)과 각 글에 달린 댓글(리스트)
  • 행렬(Matrix) 데이터

이번 글에서는 자바에서 리스트 안에 리스트를 사용하는 방법을 여러 예제와 함께 정리해보겠습니다.

 

1. 기본 선언

리스트 안에 리스트는 다음과 같이 선언합니다.

List<List<Integer>> matrix = new ArrayList<>();

여기서 matrix는 리스트인데, 그 안의 각 원소가 또 다른 리스트입니다.
즉, matrix.get(i)는 리스트(행), matrix.get(i).get(j)는 하나의 값(열) 입니다.

 

2. 간단한 예제

import java.util.*;

public class ListInListExample1 {
    public static void main(String[] args) {
        List<List<Integer>> matrix = new ArrayList<>();

        // 첫 번째 행
        matrix.add(Arrays.asList(1, 2, 3));

        // 두 번째 행
        matrix.add(Arrays.asList(4, 5, 6));

        System.out.println(matrix);
        System.out.println("첫 번째 행: " + matrix.get(0));
        System.out.println("두 번째 행, 세 번째 값: " + matrix.get(1).get(2));
    }
}

실행 결과

[[1, 2, 3], [4, 5, 6]]
첫 번째 행: [1, 2, 3]
두 번째 행, 세 번째 값: 6

👉 matrix.get(1).get(2)는 2행 3열 값(=6)에 접근하는 방법입니다.

 

3. for문으로 2차원 리스트 초기화하기

리스트 안에 리스트는 크기가 자유로우므로, 보통은 for문으로 초기화합니다.

import java.util.*;

public class ListInListExample2 {
    public static void main(String[] args) {
        int rows = 3;
        int cols = 4;

        List<List<Integer>> matrix = new ArrayList<>();

        // 3행 4열 생성 (모두 0으로 초기화)
        for (int i = 0; i < rows; i++) {
            List<Integer> row = new ArrayList<>();
            for (int j = 0; j < cols; j++) {
                row.add(0);
            }
            matrix.add(row);
        }

        System.out.println(matrix);
    }
}

실행 결과

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

 

4. 값 수정 및 접근

리스트 안에 리스트는 유동적이므로, 특정 값을 바꾸거나 행/열을 자유롭게 추가할 수 있습니다.

import java.util.*;

public class ListInListExample3 {
    public static void main(String[] args) {
        List<List<String>> classroom = new ArrayList<>();

        // 반별 학생 추가
        classroom.add(new ArrayList<>(Arrays.asList("홍길동", "김철수")));
        classroom.add(new ArrayList<>(Arrays.asList("이영희")));

        // 값 수정
        classroom.get(0).set(1, "박민수"); // 1반 2번째 학생 수정

        // 학생 추가
        classroom.get(1).add("최지훈"); // 2반에 학생 추가

        System.out.println(classroom);
    }
}

실행 결과

[[홍길동, 박민수], [이영희, 최지훈]]

 

5. 배열 안의 리스트 vs 리스트 안의 리스트

많이 헷갈리는 부분이 바로 이것입니다.

  • 배열 안의 리스트 (List<T>[]) → 행 개수(배열 크기)는 고정, 각 리스트의 크기만 가변
  • 리스트 안의 리스트 (List<List<T>>) → 행 개수도, 열 개수도 모두 가변

👉 즉,

  • “반 개수는 3개로 고정, 학생 수는 반마다 다름” → 배열 안의 리스트
  • “반 개수도 유동적, 학생 수도 유동적” → 리스트 안의 리스트

 

6. 정리

  • 선언: List<List<T>>
  • 값 접근: list.get(i).get(j)
  • for문 초기화: 원하는 크기의 2차원 리스트를 쉽게 생성 가능
  • 장점: 크기를 자유롭게 늘리거나 줄일 수 있어 배열보다 유연함

자바에서 List<List<T>> 구조를 사용하면, 배열보다 훨씬 유연한 2차원 데이터 구조를 만들 수 있습니다.

 

 

 

반응형
Comments