언어+프레임워크/JAVA

[JAVA] 3가지 List 생성 방법 비교와 진정한 불변리스트 (불변리스트는 정말 객체까지 불변일까?)

깃짱 2025. 3. 25. 15:00
반응형

자바에서 리스트 만드는 다양한 방법이 존재합니다.

각각은 그냥 대충 사용하자면 신경 안쓰고 사용할 수 있지만 실은 결과에 꽤 큰 차이를 가져올 수 있습ㄴ디ㅏ.

각각의 차이에 대해 알아보죠.

🌏 List 생성 방법

✅ 1. Arrays.asList(...)

List<Integer> list = Arrays.asList(1, 2, 3);
  • 고정 크기 리스트 (배열 기반)
  • get(), set() 가능
  • add(), remove() 불가 → 크기 변경 시 UnsupportedOperationException 예외 발생
list.set(0, 100);   // ✅ 가능
list.add(4);        // ❌ 에러 발생

✅ 2. List.of(...) (Java 9 이상)

List<Integer> list = List.of(1, 2, 3);
  • 진짜 불변 리스트
  • set(), add(), remove() 다 안 됨!
  • 내부적으로 UnsupportedOperationException을 던짐
list.get(0);        // ✅ 가능
list.set(0, 100);   // ❌ 에러 발생
list.add(4);        // ❌ 에러 발생

진짜 "수정 불가능한 상수 리스트"를 만들고 싶을 때 사용

✅ 3. new ArrayList<>(...)

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
  • 변경 가능한 리스트
  • get(), set(), add(), remove() 전부 가능
list.add(4);        // ✅ 가능
list.set(0, 100);   // ✅ 가능
list.remove(1);     // ✅ 가능

✅ 요약

생성 방식 요소 변경 (set()) 추가/삭제 (add()/remove()) 특징
Arrays.asList() ✅ 가능 ❌ 불가능 고정 크기
List.of() ❌ 불가능 ❌ 불가능 불변 리스트
new ArrayList<>() ✅ 가능 ✅ 가능 변경 가능 (일반적으로 가장 많이 씀)
  • 코딩테스트에선 new ArrayList<>(Arrays.asList(...)) 쓰는 게 가장 안전하다!
  • 실무에서 불변 리스트가 필요하면 List.of() 또는 Collections.unmodifiableList() 사용한다.

그렇다면,,

🌏 불변리스트는 정말 객체까지 불변일까?

✅ 불변 리스트의 진짜 의미

List<Foo> list = Collections.unmodifiableList(...);
  • 이렇게 리스트를 생성한 경우, 리스트 자체는 add, remove, set 등으로 구조 변경 불가하다.
  • 하지만 리스트 안에 있는 객체 자체는 여전히 mutable이라면, get()으로 꺼내서 내용 수정은 가능하다!!!

❗예제

class Person {
    String name;
    Person(String name) { this.name = name; }
    void setName(String name) { this.name = name; }
}

List<Person> original = new ArrayList<>();
original.add(new Person("Alice"));
List<Person> unmodifiable = Collections.unmodifiableList(original);

unmodifiable.get(0).setName("Bob");  // ✅ 실행되며 실제 name이 수정된다. 

→ 리스트 구조는 못 바꾸지만, Person 객체는 수정 가능

✅ 진짜 "불변 리스트"를 만들고 싶다면?

1. 내부 객체도 불변(immutable)하게 만들기

record Person(String name) {}
  • Java 14+의 record는 자동으로 불변 객체 생성된다
class Person {
    private final String name;
    public Person(String name) { this.name = name; }
    public String getName() { return name; }
}

→ setter 없고, 필드도 final이므로, 완전히 불변 객체라고 볼 수 있다. 즉, 객체 생성 이후에 객체의 필드는 수정이 아예 불가하다.

2. 불변 컬렉션 + 불변 객체 조합

List<Person> list = List.of(
    new Person("Alice"),
    new Person("Bob")
);
  • List.of() → 리스트 자체 불변
  • Person → 클래스 설계를 통해 불변이면 완벽하게 불변이다.

3. 진짜 불변 리스트를 만들려면?

"리스트 구조 + 내부 객체 모두 불변이어야 한다."

✔️ 불변 컬렉션: List.of(), Collections.unmodifiableList()

✔️ 불변 객체: record, 또는 final 필드 + getter only

 

 

도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
비밀댓글과 메일을 통해 오는 개인적인 질문은 받지 않고 있습니다. 꼭 공개댓글로 남겨주세요!

 

반응형