-
Java 18-21. 주요 변경 내용BackEnd/Java 2024. 12. 13. 23:00반응형
Math API
clamp 함수 (Java 21)
clamp 함수는 테스트할 값 value가 min과 max 사이에 있는지 확인하는 기능입니다. 사이에 있으면 value를 반환하고, 더 작으면 min 값을, 더 크면 max 값을 반환합니다.
public static int clamp(long value, int min, int max) { if (min > max) { throw new IllegalArgumentException(min + " > " + max); } return (int) Math.min(max, Math.max(value, min)); }
String API
indexOf 함수
기존 indexOf() 함수는 특정 문자의 위치를 처음부터 찾거나 특정 지점부터 찾을 수 있었습니다. 추가된 indexOf 함수는 특정 범위 안에 있는 문자 or 문자열의 위치를 찾을 수 있습니다.
public int indexOf(String str, int beginIndex, int endIndex) { } public int indexOf(int ch, int beginIndex, int endIndex) { }
splitWithDelimiters 함수 (Java 21)
- 기존 split 함수: 구분자(;)는 결과에서 제외됩니다.
String str = "A;B;C"; String[] result = str.split(";"); // [A, B, C]
- 새로운 splitWithDelimiters 함수: 구분자(;)도 결과에 포함됩니다.
String str = "A;B;C"; String result = str.splitWithDelimiters(";", -1); // [A, ;, B, ;, C]
StringBuffer / Builder API
repeat 함수 (Java 21)
특정 문자열이 반복해서 쌓이는 함수입니다.
StringBuilder sb = new StringBuilder(); sb.repeat("ABC ", 3); System.out.println(sb); // "ABC ABC ABC "
Character API
Java 21에서 emoji 관련 함수들이 추가 되었습니다. 다음 코드에서 codePoint는 유니코드입니다.
public static boolean isEmoji(int codePoint) public static boolean isEmojiPresentation(int codePoint) public static boolean isEmojiModifier(int codePoint) public static boolean isEmojiModifierBase(int codePoint) public static boolean isEmojiComponent(int codePoint) public static boolean isExtendedPictographic(int codePoint)
다음은 https://unicode.org/emoji/charts/full-emoji-list.html 사이트의 가장 첫번째 유니코드의 값(U+1F600: 10진수 128512)을 10진수로 변환한 후 이모지인지 확인하는 코드입니다.
System.out.println(Character.isEmoji(128512)); // true
Sequenced Collection API
Sequenced Collection(순서를 관리하는 Collection) 도입으로 다음과 같이 계층 구조가 변경되었습니다. 초록색이 추가된 부분입니다.
SequencedCollection Interface
interface SequencedCollection<E> extends Collection<E> { SequencedCollection<E> reversed(); void addFirst(E); void addLast(E); E getFirst(); E getLast(); E removeFirst(); E removeLast(); }
revered()
Collection의 view 역할을 합니다. 즉, 원본의 데이터가 바뀌면 reversed도 바뀌고 reversed가 바뀌면 원본도 바뀝니다.
public static void sequencedListReversedExample() { List<Integer> numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5)); List<Integer> reversed = numbers.reversed(); numbers.add(6); System.out.println(reversed); // [6, 5, 4, 3, 2, 1]: 원본이 바뀌면 reversed도 바뀝니다. reversed.addFirst(7); System.out.println(numbers); // [1, 2, 3, 4, 5, 6, 7]: reversed가 바뀌면 원본도 바뀝니다. }
Set의 경우, addFirst(E)와 addLast(E) 기능이 다르게 동작합니다.
- LinkedHashSet: 원래 있던 원소를 추가하려 하면, 위치가 재조정됩니다. Set은 중복된 원소를 가질 수 없기 때문입니다.
- SortedSet: 정렬된 집합이기에 호출하면 UnsupportedOperationException이 발생합니다.
SequencedMap Interface
interface SequencedMap<K, V> extends Map<K, V> { SequencedMap<K, V> reversed(); SequencedSet<K> sequencedKeySet(); SequencedCollection<V> sequencedValues(); SequencedSet<Entry<K, V>> sequencedEntrySet(); V putFirst(K, V); V putLast(K, V); Entry<K, V> firstEntry(); Entry<K, V> lastEntry(); Entry<K, V> pollFirstEntry(); // remove Entry<K, V> pollLastEntry(); // remove }
sequencedKeySet(), sequencedValues(), sequencedEntrySet(), firstEntry(), lastEntry(), pollFirstEntry(), pollLastEntry()은 immutable을 반환합니다. 다음 코드에서 firstEntry()로 가지고 와서 값 수정은 되지 않습니다. iterable로는 수정이 가능합니다.
public static void main(String[] args) { SequencedMap<Integer, String> map = new LinkedHashMap<>(); map.put(1, "A"); map.put(2, "B"); // var entry = map.firstEntry(); // 불변이기에 값을 가지고 와서 수정할 수 없습니다. var entry = map.entrySet().iterator().next(); entry.setValue("D"); System.out.println(map); }
putFirst(), putLast()의 경우, 집합과 유사하게 동작합니다.
- LinkedHashMap: 동일한 key가 있다면, key를 기준으로 위치를 재조정합니다.
- SortedMap: 정렬된 상태이기에 UnsupportedOperationException이 발생합니다.
반응형'BackEnd > Java' 카테고리의 다른 글
Java 21. 가상 스레드 (1) 2024.12.15 Java 21. Switch Pattern Matching (0) 2024.12.12 Java 21. Record Pattern (0) 2024.12.11 Java 12-17. 주요 변경 내용 (0) 2024.12.10 Java 17. Sealed Class (1) 2024.12.09