자바에서 리스트 만드는 다양한 방법이 존재합니다.
각각은 그냥 대충 사용하자면 신경 안쓰고 사용할 수 있지만 실은 결과에 꽤 큰 차이를 가져올 수 있습ㄴ디ㅏ.
각각의 차이에 대해 알아보죠.
🌏 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
도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
비밀댓글과 메일을 통해 오는 개인적인 질문은 받지 않고 있습니다. 꼭 공개댓글로 남겨주세요!
'JAVA' 카테고리의 다른 글
[JAVA] try-with-resources를 사용해서 리소스 누수를 방지하자! (0) | 2023.09.29 |
---|---|
[JAVA] Reflection API: 개념, 사용법, 예시 코드 (0) | 2023.09.28 |
[JAVA] Java Reflection API에서 클래스 이름 가져오기: getName() vs getCanonicalName() (0) | 2023.09.12 |
[JAVA] 멀티 쓰레드의 동기화(synchronization): 메서드, 메서드 내 블록에 synchronized 키워드를 붙이자! (0) | 2023.09.10 |
[JAVA] 쓰레드 풀(Thread Pool): 개념, 장점, 사용 방법, 코드 예시 (feat. Baeldung) (1) | 2023.09.09 |
자바에서 리스트 만드는 다양한 방법이 존재합니다.
각각은 그냥 대충 사용하자면 신경 안쓰고 사용할 수 있지만 실은 결과에 꽤 큰 차이를 가져올 수 있습ㄴ디ㅏ.
각각의 차이에 대해 알아보죠.
🌏 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
도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
비밀댓글과 메일을 통해 오는 개인적인 질문은 받지 않고 있습니다. 꼭 공개댓글로 남겨주세요!
'JAVA' 카테고리의 다른 글
[JAVA] try-with-resources를 사용해서 리소스 누수를 방지하자! (0) | 2023.09.29 |
---|---|
[JAVA] Reflection API: 개념, 사용법, 예시 코드 (0) | 2023.09.28 |
[JAVA] Java Reflection API에서 클래스 이름 가져오기: getName() vs getCanonicalName() (0) | 2023.09.12 |
[JAVA] 멀티 쓰레드의 동기화(synchronization): 메서드, 메서드 내 블록에 synchronized 키워드를 붙이자! (0) | 2023.09.10 |
[JAVA] 쓰레드 풀(Thread Pool): 개념, 장점, 사용 방법, 코드 예시 (feat. Baeldung) (1) | 2023.09.09 |