어제 오늘 내일

[Java] List를 Set으로, Set을 List로 변환하기 본문

IT/Java

[Java] List를 Set으로, Set을 List로 변환하기

hi.anna 2021. 5. 3. 10:17

 

List를 Set으로, Set을 List로 변환하는 방법을 정리하였습니다.

  1. List를 Set으로
    • 생성자(Constructor)
    • Set.copyOf() - (Java 10 이후, unmodifiable)
  2. Set을 List로
    • 생성자(Constructor)
    • List.copyOf() - (Java 10 이후, unmodifiable)

 

1. List를 Set으로

1. 1 생성자(Constructor)

  코드  

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ListToSet {
    public static void main(String[] args) {

        // List 준비
        List<String> list = Arrays.asList("L", "I", "S", "T");

        // Set으로 변환 (생성자)
        Set<String> set = new HashSet<>(list);

        // 결과 출력
        System.out.println(set);
    }
}

  결과  

[S, T, I, L]

HashSet은 Set 인터페이스를 구현하는 클래스입니다.

HashSet의 생성자에 List 객체를 전달하여, List를 Set으로 변환하였습니다.

Set 객체는 순서를 보장하지 않기 때문에, Set을 출력한 결과는 List의 순서와 다릅니다.

 

 

1. 2 Set.copyOf() - (Java 10 이후, unmodifiable)

Java 10 이후에는 Set의 static 메소드인 copyOf() 메소드를 이용하여,

List를 Set으로 바꿀수 있습니다.

단, 이때 Set.copyOf() 메소드가 리턴하는 Set 객체는 unmodifiable 객체로,

더 이상 값을 추가하거나, 삭제, 변경할 수 없습니다.

(Read Only 상태와 비슷합니다)

 

  코드 1  

import java.util.Arrays;
import java.util.List;
import java.util.Set;

public class ListToSet {
    public static void main(String[] args) {

        // List 준비
        List<String> list = Arrays.asList("L", "I", "S", "T");

        // Set으로 변환 (copyOf())
        Set<String> set = Set.copyOf(list);

        // 결과 출력
        System.out.println(set);
    }
}

  결과 1  

[S, T, L, I]

Set.copyOf() 메소드에 List 객체를 전달하여 Set 객체로 변환하였습니다.

 

 

  코드 2 - unmodifiable set 수정 

import java.util.Arrays;
import java.util.List;
import java.util.Set;

public class ListToSet {
    public static void main(String[] args) {

        // List 준비
        List<String> list = Arrays.asList("L", "I", "S", "T");

        // Set으로 변환 (copyOf())
        Set<String> set = Set.copyOf(list);

        // Set객체에 값 추가
        set.add("!");   // Exception 발생

        // 결과 출력
        System.out.println(set);
    }
}

  결과 2  

Exception in thread "main" java.lang.UnsupportedOperationException
        at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:72)
        at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.add(ImmutableCollections.java:76)
        at ListToSet.main(ListToSet.java:14)

Set.copyOf() 메소드가 리턴하는 Set 객체는 unmodifiable 객체로,

이 객체에 위와 같이 값을 추가하거나, 변경, 삭제를 시도하면 Exception이 발생합니다.

 

 

 

2. Set을 List로

2.1 생성자(Constructor)

  코드  

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class SetToList {
    public static void main(String[] args) {

        // Set 준비
        Set<String> set = new HashSet<>(Arrays.asList("L", "I", "S", "T"));
        
        // Set을 List로 변환 (생성자)
        List<String> list = new ArrayList<>(set);

        // 결과 출력
        System.out.println(list);  // [S, T, I, L]
    }
}

  결과  

[S, T, I, L]

List 인터페이스를 구현하는 ArrayList의 생성자 파라미터로 Set 객체를 전달하여

Set객체를 List로 변환하였습니다.

 

 

2.2 List.copyOf() - (Java 10 이후, unmodifiable)

Set 클래스와 마찬가지로, List 클래스도

Java 10 이후, List의 static 메소드인 copyOf() 메소드를 사용하여, 

Set  객체를 List로 변환할 수 있습니다.

List.copyOf() 메소드가 반환하는 List 객체 역시 unmodifiable 이기 때문에,

이 객체에 데이터를 추가, 수정, 삭제 할 수 없습니다.

 

  코드 1  

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class SetToList {
    public static void main(String[] args) {

        // Set 준비
        Set<String> set = new HashSet<>(Arrays.asList("L", "I", "S", "T"));
        
        // Set을 List로 변환 (List.copyOf())
        List<String> list = List.copyOf(set);

        // 결과 출력
        System.out.println(list);  // [S, T, I, L]
    }
}

  결과 1  

[S, T, I, L]

List.copyOf() 메소드를 사용하여 Set 객체를 List 객체로 리턴하였습니다.

 

 

  코드 2 - unmodifiable list 수정 

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class SetToList {
    public static void main(String[] args) {

        // Set 준비
        Set<String> set = new HashSet<>(Arrays.asList("L", "I", "S", "T"));
        
        // Set을 List로 변환 (List.copyOf())
        List<String> list = List.copyOf(set);

        // unmodifiable List 값 추가
        list.add("!");  // Exception 발생

        // 결과 출력
        System.out.println(list);  // [S, T, I, L]
    }
}

  결과  2  

Exception in thread "main" java.lang.UnsupportedOperationException
        at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:72)
        at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.add(ImmutableCollections.java:76)
        at SetToList.main(SetToList.java:16)

Set.copyOf() 메소드와 마찬가지로,

List.copyOf() 메소드도 unmodifiable 객체를 리턴하기 때문에,

이 객체에 값을 추가하면 Exception이 발생합니다.

 


 

Java의 List를 Set으로, Set을 List로 변환하는 방법을 알아보았습니다.

 

 

반응형
Comments