Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9 JShell에서 Set 인터페이스 구현하는 방법 완벽 가이드

JShell은 Java 9에서 도입된 명령줄 도구로, 표현식, 클래스, 인터페이스, 메서드 등 간단한 코드 조각을 즉시 실행하고 결과를 확인할 수 있는 REPL(Read-Eval-Print Loop) 환경을 제공합니다.

Set은 Java에서 중복되지 않는 고유한 요소(unique elements)만 저장하는 컬렉션의 규약을 정의하는 인터페이스입니다. object1.equals(object2)가 true를 반환한다면, object1과 object2 중 하나만 Set 구현체에 저장될 수 있습니다.

불변(Immutable) Set 생성과 add() 메서드

아래 코드 스니펫에서는 Set.of() 메서드를 사용합니다. Set.of() 메서드가 반환하는 컬렉션은 불변(immutable)이므로 add() 메서드를 지원하지 않습니다. 요소를 추가하려고 시도하면 UnsupportedOperationException이 발생합니다.

대신 HashSet을 생성하면 add() 메서드를 사용할 수 있으며, 이를 통해 Set의 고유성 속성을 테스트할 수 있습니다. 중복된 "Adithya" 항목 삽입이 실패하여 false가 반환되는 것을 확인할 수 있습니다.

스니펫 1

jshell> Set<String> set = Set.of("Adithya", "Chaitanya", "Jai");
set ==> [Jai, Adithya, Chaitanya]

jshell> set.add("Adithya");
|   java.lang.UnsupportedOperationException thrown:

jshell> Set<String> hashSet = new HashSet<>(set);
hashSet ==> [Chaitanya, Jai, Adithya]

jshell> hashSet.add("Adithya");
$8 ==> false

jshell> hashSet
hashSet ==> [Chaitanya, Jai, Adithya]

HashSet — 순서 없는 저장 방식

아래 코드 스니펫에서는 HashSet을 구현합니다. HashSet에 저장된 요소들은 삽입 순서도 유지되지 않고, 정렬된 순서로 저장되지도 않습니다.

스니펫 2

jshell> Set<Integer> numbers = new HashSet<>();
numbers ==> []

jshell> numbers.add(12345);
$11 ==> true

jshell> numbers.add(1234);
$12 ==> true

jshell> numbers.add(123);
$13 ==> true

jshell> numbers.add(12);
$14 ==> true

jshell> numbers
numbers ==> [1234, 12345, 123, 12]

LinkedHashSet — 삽입 순서 유지

아래 코드 스니펫에서는 LinkedHashSet을 구현합니다. LinkedHashSet은 요소들이 삽입된 순서(insertion order) 그대로 저장됩니다.

스니펫 3

jshell> Set<Integer> numbers1 = new LinkedHashSet<>();
numbers1 ==> []

jshell> numbers1.add(12345);
$17 ==> true

jshell> numbers1.add(1234);
$18 ==> true

jshell> numbers1.add(123);
$19 ==> true

jshell> numbers1.add(12);
$20 ==> true

jshell> numbers1
numbers1 ==> [12345, 1234, 123, 12]

jshell> numbers1.add(123456);
$22 ==> true

jshell> numbers1
numbers1 ==> [12345, 1234, 123, 12, 123456]

TreeSet — 정렬된 순서 유지

아래 코드 스니펫에서는 TreeSet을 구현합니다. TreeSet은 요소들이 정렬된 순서(sorted order)로 저장됩니다.

스니펫 4

jshell> Set<Integer> numbers2 = new TreeSet<>();
numbers2 ==> []

jshell> numbers2.add(12345);
$25 ==> true

jshell> numbers2.add(1234);
$26 ==> true

jshell> numbers2.add(123);
$27 ==> true

jshell> numbers2.add(12);
$28 ==> true

jshell> numbers2
numbers2 ==> [12, 123, 1234, 12345]

jshell> numbers2.add(123456);
$30 ==> true

jshell> numbers2
numbers2 ==> [12, 123, 1234, 12345, 123456]

정리

JShell을 활용하면 별도의 컴파일 과정 없이 다양한 Set 구현체의 동작 방식을 빠르게 실험해 볼 수 있습니다. Set.of()는 불변 컬렉션을 생성하고, HashSet은 순서를 보장하지 않으며, LinkedHashSet은 삽입 순서를, TreeSet은 정렬된 순서를 유지한다는 점을 기억하면 상황에 맞는 적절한 구현체를 선택하는 데 큰 도움이 됩니다.