logo

Java의 불변 목록

Java에서 불변 목록은 일단 생성되면 수정할 수 없는 목록입니다. 목록이 생성된 후 목록의 요소를 추가, 제거 또는 수정하려고 하면 예외가 발생합니다.

불변 목록 사용의 주요 이점은 스레드 안전성을 제공하고 코드를 더욱 강력하게 만든다는 것입니다. 목록이 생성된 후에는 수정할 수 없으므로 여러 스레드가 동시에 수정하려고 시도하여 문제가 발생할 위험이 없습니다. 또한 불변 목록은 실수로 수정될 염려 없이 다양한 프로그램 부분 간에 쉽게 공유될 수 있습니다.

전반적으로 Java에서 불변 목록을 사용하면 특히 공유 데이터 구조가 문제를 일으킬 수 있는 다중 스레드 환경에서 프로그램의 안전성과 견고성을 향상시킬 수 있습니다.

클래스 선언

자바에서는 불변목록 수업은 수업의 일부입니다. 구아바 변경할 수 없는 여러 컬렉션 클래스를 제공하는 라이브러리입니다. 사용 불변목록 , 먼저 com.google.common.collect 들어있는 패키지 불변목록 수업.

클래스 선언 불변목록 다음과 같다:

 public abstract class ImmutableList extends ImmutableCollection implements List 

불변목록 확장합니다 불변컬렉션 클래스를 구현하고 목록 상호 작용. 이는 일반 클래스입니다. 즉, 불변목록 모든 데이터 유형의 그만큼 그리고 선언에는 클래스 또는 인터페이스 이름으로 대체할 수 있는 유형 매개변수가 표시됩니다.

클래스 계층 구조

그만큼 불변목록 클래스는 목록 인터페이스이며 한번 생성되면 수정할 수 없는 목록을 나타냅니다.

클래스 계층 구조 불변목록 다음과 같다:

 java.lang.Object com.google.common.collect.ImmutableCollection com.google.common.collect.ImmutableList 

여기, 불변컬렉션 의 골격 구현을 제공하는 추상 클래스입니다. 불변컬렉션 인터페이스, 이는 불변목록 연장됩니다.

전반적으로, 불변목록 클래스는 Java에서 불변 목록을 생성하고 사용하는 편리하고 효율적인 방법을 제공합니다.

ImmutableList 생성

사용 중인 Java 버전과 사용 가능한 라이브러리에 따라 Java에서 ImmutableList를 생성하는 방법이 다릅니다. 여기 몇 가지 예가 있어요.

1. Java 9 of() 메소드 사용:

Java 9에서는 List 인터페이스에 of()라는 새로운 메서드가 도입되었습니다. 이 메서드는 불변 목록을 더욱 간결하고 읽기 쉽게 생성합니다. of() 메서드는 가변 개수의 인수를 사용하고 해당 요소가 포함된 변경 불가능한 목록을 반환하는 팩토리 메서드입니다. ArrayList, LinkedList 및 ImmutableList를 포함하여 List 인터페이스를 구현하는 모든 클래스와 함께 사용할 수 있습니다. of() 메서드를 사용하면 훨씬 더 간결해지고 인수에 대한 형식 유추를 수행하여 올바른 형식의 개체만 목록에 추가되도록 하여 컴파일 시간 안전성을 제공한다는 장점이 있습니다. 전반적으로 of() 메소드는 Java에서 불변 목록 생성을 단순화합니다.

해결 방법을 찾는 단계는 아래에 설명되어 있습니다.

  1. Java.util 패키지에서 List 클래스를 가져옵니다. 이를 통해 프로그램은 List 인터페이스를 사용하여 객체 목록을 생성하고 조작할 수 있습니다.
  2. Java 9 팩토리 메소드를 사용하여 불변 목록 작성: 코드는 List.of() 메소드를 사용하여 4개의 요소가 있는 불변 문자열 목록을 작성합니다.
  3. 목록 수정 시도: 프로그램은 add() 메서드를 사용하여 변경할 수 없는 목록에 요소를 추가하려고 시도하는데, 이는 변경할 수 없는 목록에서는 허용되지 않습니다. 결과적으로 프로그램은 add() 메서드에서 발생한 UnsupportedOperationException을 포착하고 목록을 수정할 수 없음을 나타내는 메시지를 인쇄합니다.

파일 이름: ImmutableListExample.java

 // Import the required List class from the Java.util package import java.util.List; // Define the class name public class ImmutableListExample { public static void main(String[] args) { // Create an immutable list using the Java 9 factory of() method List fruits = List.of('apple', 'banana', 'orange', 'grape'); // Print the elements of the List System.out.println('Fruits: ' + fruits); // Try to modify the List (will throw UnsupportedOperationException) try { fruits.add('pineapple'); } catch (UnsupportedOperationException ex) { System.out.println('Cannot modify immutable list.'); } } } 

산출:

 Fruits: [apple, banana, orange, grape] Cannot modify immutable List. 

2. Guava 라이브러리의 ImmutableList.Builder 클래스 사용:

유창한 스타일로 목록에 요소를 추가하여 목록을 점진적으로 생성하는 데 편리합니다.

삽입 정렬 알고리즘

사용된 방법에 관계없이 결과 ImmutableList는 다른 목록처럼 액세스하고 반복할 수 있지만 해당 내용은 수정할 수 없습니다.

주어진 코드에 대한 단계별 솔루션은 다음과 같습니다.

  1. 필수 클래스 가져오기: com.google.common.collect 패키지에서 List 인터페이스와 ImmutableList 클래스를 가져옵니다.
  2. 빌더를 사용하여 변경할 수 없는 목록 만들기: ImmutableList 빌더를 사용하여 변경할 수 없는 목록을 만듭니다. add() 메서드를 사용하여 목록에 요소를 추가하고, build() 메서드를 호출하여 변경할 수 없는 목록을 만듭니다.
  3. 기존 목록에서 변경할 수 없는 목록 만들기: 원하는 요소가 포함된 목록 개체를 만듭니다. 그런 다음 List를 매개변수로 전달하여 ImmutableList.copyOf() 메서드를 호출하여 변경할 수 없는 목록을 만듭니다.
  4. 더 많은 요소 추가: ImmutableList 빌더를 사용하여 addAll() 메소드를 사용하여 더 많은 요소를 추가하고, build() 메소드를 호출하여 불변 목록을 생성하십시오.
  5. 목록 인쇄: 변경할 수 없는 목록의 내용을 인쇄하려면 System.out.println() 메서드를 사용하세요.

구현:

파일 이름: ImmutableListExample.java

 import java.util.List; import com.google.common.collect.ImmutableList; public class ImmutableListExample { public static void main(String[] args) { // Creating an immutable list using the builder ImmutableList immutableList1 = ImmutableListbuilder() .add('Welcome') .add('to') .add('home') .build(); // Creating an immutable list from an existing list List existingList = List.of('Welcome', 'to', 'home', 'Think'); ImmutableList immutableList2 = ImmutableList.copyOf(existingList); // Creating an immutable list from an existing list and adding more elements ImmutableList immutableList3 = ImmutableList.builder() .addAll(existingList) .add('Big') .build(); // Let's print the lists System.out.println('Immutable List 1: ' + immutableList1); System.out.println('Immutable List 2: ' + immutableList2); System.out.println('Immutable List 3: ' + immutableList3); } } 

산출:

 Immutable List 1: [Welcome, to, home] Immutable List 2: [Welcome, to, home, Think] Immutable List 3: [Welcome, to, home, Think, Big] 

3. ImmutableList 클래스의 of() 메소드를 사용하여

Guava 라이브러리에 있는 ImmutableList 클래스의 of() 메서드를 사용하면 고정된 수의 요소가 포함된 불변 목록을 만들 수 있습니다. 목록이 생성되면 해당 요소를 추가, 제거 또는 수정할 수 없습니다.

파일 이름: ImmutableListExample.java

 import com.google.common.collect.ImmutableList; import java.util.List; class ImmutableListExample { public static void main(String[] args) { // Create an immutable list using the Guava library's ImmutableList class ImmutableList fruits = ImmutableList.of('apple', 'banana', 'orange', 'grape'); // Print the contents of the immutable List System.out.println('Fruits: ' + fruits); } } 

산출:

 Fruits: [apple, banana, orange, grape] 

4. copyOf() 메소드를 사용하여

Java에서 copyOf() 메서드는 지정된 길이의 기존 배열을 복사하는 새 배열을 만듭니다. 이 메서드는 복사할 배열과 새 배열의 길이라는 두 가지 인수를 사용합니다.

파일 이름: ImmutableListExample.java

비키 카우샬 나이
 import com.google.common.collect.ImmutableList; import java.util.*; class ImmutableListExample { public static void main(String[] args) { // Create an ArrayList and add elements to it List myArrayList = new ArrayList(); myArrayList.add('Java'); myArrayList.add('Python'); myArrayList.add('C++'); // Create an immutable list using the Guava library's ImmutableList class and the copyOf() method ImmutableList immutableList1 = ImmutableList.copyOf(myArrayList); // Create an array and convert it to a list String[] myArray = {'Learning', 'Web', 'Development', 'is', 'Fun'}; List myList = Arrays.asList(myArray); // Create an immutable list using the Guava library's ImmutableList class and the copyOf() method ImmutableList immutableList2 = ImmutableList.copyOf(myList); // Print the contents of the immutable lists System.out.println('Immutable List 1: ' + immutableList1); System.out.println('Immutable List 2: ' + immutableList2); } } 

산출:

 Immutable List 1: [Java, Python, C++] Immutable List 2: [Learning, Web, Development, is, Fun] 

5. 지원되지 않는 작업예외

이 프로그램은 Collections.unmodifyingList 메소드를 사용하여 Java에서 불변 목록을 생성하는 방법을 보여줍니다. 또한 목록을 수정하려고 할 때 발생하는 UnsupportedOperationException을 처리하는 방법을 보여줍니다.

해결책을 찾는 단계는 다음과 같습니다.

  1. 먼저 변경 가능한 항목을 만듭니다. 배열목록 다음을 사용하여 일부 초기 요소를 포함합니다. ~의 변경할 수 없는 목록을 반환하는 메서드입니다. 그런 다음 이것을 전달합니다. 배열목록 ~로 Collections.unmodifyingList List의 변경할 수 없는 뷰를 반환하는 메서드입니다.
  2. 우리는 다음을 사용하여 불변 목록을 수정하려고 시도합니다. 추가하다, 제거하다 , 그리고 세트 목록은 변경할 수 없으므로 수정하려고 하면 오류가 발생합니다. 지원되지 않는 작업예외 .
  3. 우리는 지원되지 않는 작업예외 어떤 작업이 시도되었고 실패했는지 나타내는 메시지를 콘솔에 인쇄합니다.

참고 Collections.unmodifyingList 메서드는 원본 목록의 변경 불가능한 보기만 생성합니다. 원본 목록이 수정되면 변경 불가능한 보기에 해당 변경 사항이 반영됩니다. 어떤 방법으로도 수정할 수 없는 불변의 목록을 만들려면 다음의 사용자 정의 구현을 사용할 수 있습니다. 목록 List를 수정하려고 할 때 예외를 발생시키는 인터페이스입니다.

구현:

파일 이름: ImmutableListExample.java

 import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ImmutableListExample { public static void main(String[] args) { // Create an immutable list using Collections.unmodifiableList List immutableList = Collections.unmodifiableList(new ArrayList(List.of('foo', 'bar', 'baz'))); // Attempt to modify the immutable List using various methods try { immutableList.add('qux'); System.out.println('Successfully added element to immutable list!'); } catch (UnsupportedOperationException e) { System.out.println('UnsupportedOperationException: ' + e.getMessage()); } try { immutableList.remove(0); System.out.println('Successfully removed element from immutable list!'); } catch (UnsupportedOperationException e) { System.out.println('UnsupportedOperationException: ' + e.getMessage()); } try { immutableList.set(0, 'qux'); System.out.println('Successfully modified element in immutable list!'); } catch (UnsupportedOperationException e) { System.out.println('UnsupportedOperationException: ' + e.getMessage()); } } } 

산출:

 UnsupportedOperationException: null UnsupportedOperationException: null UnsupportedOperationException: null 

6. Collections.수정할 수 없는 목록()

Collections.unmodifyingList() 기존 목록의 수정 불가능한 보기를 생성하는 Java Collections Framework의 메소드입니다. 수정 불가능한 목록을 수정하려고 하면 UnsupportedOperationException이 발생하는 것으로 추론할 수 있습니다. 원래 목록은 여전히 ​​수정될 수 있으며 모든 변경 사항은 수정 불가능한 목록에 반영됩니다.

이 프로그램은 Collections.unmodifyingList() 메서드를 활용하여 변경 가능한 목록의 수정 불가능한 표현을 생성하는 방법을 보여줍니다.

해결책을 찾는 단계는 다음과 같습니다.

  1. 변경 가능한 목록 만들기 가변 목록 그리고 다음을 사용하여 여기에 몇 가지 요소를 추가합니다. 추가하다() 의 방법 배열목록
  2. 변경 가능한 목록의 수정 불가능한 보기 만들기 가변 목록 사용하여 수정 불가능 목록() 메서드를 사용하여 변수에 할당합니다. 수정 불가능 목록 .
  3. 수정할 수 없는 목록을 수정하려고 시도했습니다. 수정 불가능 목록 사용하여 추가하다() 수정 불가능한 목록은 읽기 전용이므로 지원되지 않는 작업예외 . 이 예외를 포착한 후 메시지가 콘솔에 인쇄됩니다.
  4. 원래 변경 가능 목록 수정 가변 목록 다음을 사용하여 다른 요소를 추가함으로써 추가하다()
  5. 변경 가능한 목록과 수정 불가능한 목록을 모두 콘솔에 인쇄하여 수정 불가능한 목록이 원래 변경 가능한 목록에 대한 변경 사항을 반영한다는 것을 보여줍니다.

파일 이름: 수정 불가능ListExample.java

 import java.util.ArrayList; import java.util.Collections; import java.util.List; public class UnmodifiableListExample { public static void main(String[] args) { List mutableList = new ArrayList(); mutableList.add('apple'); mutableList.add('banana'); mutableList.add('orange'); // Create an unmodifiable view of the mutableList List unmodifiableList = Collections.unmodifiableList(mutableList); // Attempt to modify the unmodifiableList will throw UnsupportedOperationException try { unmodifiableList.add('pear'); } catch (UnsupportedOperationException e) { System.out.println('Attempt to modify unmodifiableList failed: ' + e.getMessage()); } // The original mutableList can still be modified mutableList.add('pear'); // The unmodifiableList will reflect the changes made to the original mutableList System.out.println('mutableList: ' + mutableList); // [apple, banana, orange, pear] System.out.println('unmodifiableList: ' + unmodifiableList); // [apple, banana, orange, pear] } } 

산출:

 Attempt to modify unmodifiableList failed: null mutableList: [apple, banana, orange, pear] unmodifiableList: [apple, banana, orange, pear] 

ImmutableList의 장점

ImmutableList에는 다음과 같은 여러 가지 장점이 있습니다.

    스레드 안전성:ImmutableList는 변경할 수 없으므로 본질적으로 스레드로부터 안전합니다. 여러 스레드는 스레드 간섭이나 메모리 불일치 위험 없이 동일한 목록에 액세스할 수 있습니다.보안:불변 목록은 보안 취약성에 덜 취약합니다. 예를 들어, 공격자가 요소를 추가하거나 제거하여 목록을 수정하려고 시도하는 경우 목록은 변경할 수 없으므로 그렇게 할 수 없습니다.성능:불변 목록은 읽기 전용이므로 더 나은 성능을 위해 캐시될 수 있습니다. 목록에 여러 번 액세스해야 하는 경우 매번 새 목록을 만드는 대신 변경할 수 없는 목록을 사용하면 오버헤드를 방지하는 데 도움이 될 수 있습니다.예측 가능성:불변 목록은 수정할 수 없으므로 해당 동작을 예측할 수 있습니다. 불변 목록을 사용하면 방어적인 프로그래밍이 필요 없고 코드에 대해 더 쉽게 추론할 수 있다는 이점이 있습니다.코딩 단순화:불변 목록은 동기화, 방어 복사 및 오류가 발생하기 쉬운 수동 메모리 관리의 필요성을 제거하여 코딩을 단순화합니다. 이 접근 방식의 결과로 유지 관리가 더 쉽고 모양이 더 깔끔한 코드가 탄생했습니다.테스트를 용이하게 합니다.불변 목록은 내용이 변경되지 않으므로 테스트하기가 더 쉽습니다. 이 접근 방식을 사용하면 가능한 모든 시나리오와 극단적인 경우를 포괄하는 테스트 작성이 더 쉬워집니다.