예약 도메인 프로젝트 계획에서 java11 -> java17로 마이그레이션 하는 계획을 세웠다. 프로젝트를 시작하기 전에 자바 버전별 특징이 어떤것들이 있는지 한번 알아보려 공식문서를 찾아보았다.
JAVA11
1.새로운 String 메서드 추가
isBlank()
public void blankTest(){
String blankString1 = "";
String blankString2 = " ";
String blankString3 = "not blank";
// String blankString4 = null; //null에는 사용할 수 없다. NullPointerException 발생
assertThat(blankString1.isBlank()).isTrue();
assertThat(blankString2.isBlank()).isTrue();
assertThat(blankString3.isBlank()).isFalse();
}
lines()
- lines() 메서드는 Strem<String> 을 반환하므로 스트림 API의 다른 기능들과 조합하여 사용할 수 있다.
repeat()
이 메서드는 현재 문자열을 횟수만큼 반복하여 새로운 문자열을 반환한다.
2. 람다표현식에서 매개변수로 var 사용 가능
(var x, var y) -> x.process(y)
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8193259
3.ZGC 확장 가능한 저지연 Garbage Collector
다음 목표를 충족하도록 설계되었다.
- 일시 정지 시간은 10ms를 초과하지 않는다.
- 일시 정지 시간은 힙 또는 라이브 세트 크기에 따라 증가하지 않는다.
- 수백 메가바이트에서 수 테라바이트 크기에 이르는 힙를 처리한다.
https://www.oracle.com/java/technologies/javase/11-relnote-issues.html#NewFeature
4. HTTP API의 표준화
- 'java.net.http' 패키지에서 표준화된 API를 제공한다.
- HttpURLConnection 대체 가능
HttpURLConnectiohttps://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8181784
5.Epsilon, No-Op 가비지콜렉터
무작업 가비지 수집기이다. Epsilon GC는 메모리 할당만 처리하며 메모리 회수 메커니즘을 구현하지는 않는다.
성능 테스트에 유용하다.
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8174901
Java17
https://openjdk.org/projects/jdk/17/
1. Text Blocks
여러줄의 문자열을 쉽게 표현할 수 있는 덱스트 블록(""") 이 추가 되었다.
@Test
void textBlockTest(){
String str = """
hi
my name is
Jinmlee
""";
}
2. Sealed 클래스
public sealed class Animal permits Dog, Cat, Bird {
}
final class Cat extends Animal{
}
final class Dog extends Animal{
}
non-sealed class Bird extends Animal{
}
class Sparrow extends Bird{
}
- Animal 클래스는 sealed로 선언하였으며 이 클래스의 하위 클래스는 Dog, Cat 으로 제한된다.
- permits 키워드를 사용하여 하위 클래스를 명시한다.
- 하위 클래스는 final로 선언되어 더이상 상속될 수 없다.
- non-sealed 를 선언하면 추가적인 하위 클래스를 가질 수 있다.
3. Stream.toList()기능 추가
@Test
void toListTest(){
String animal = "Dog,Cat,Bird";
List<String> animalList1 = Arrays.stream(animal.split(",")).toList();
List<String> animalList2 = Arrays.stream(animal.split(",")).collect(Collectors.toList());
}
기존 Stream을 List로 변환시 Collectors에서 기능을 찾아 사용했다면 Java17 부터는 Collectors 호출 없이 toList()만으로 변환이 가능
4. Instanceof 매칭
@Test
void instanceOfTest(){
Object obj = "Hello, World!";
if (obj instanceof String) { // 기존방식
String str = (String) obj;
System.out.println(str.toUpperCase());
}
if (obj instanceof String str) {
System.out.println(str.toUpperCase()); // 캐스팅 없이 바로 사용 가능
}
}
이전 버전의 경우 객체를 캐스팅 하는 과정이 필요했으나 캐스팅 과정을 내부에서 지원할 수 있도록 변경
조건부 패턴매칭
@Test
void instanceOfTest2(){
Object obj = "Hello, World!";
if (obj instanceof String str && str.length() > 5) {
System.out.println("Long string: " + str);
}
}
obj가 String 타입인지 확인한 후 추가로 문자열의 길이가 5보다 큰지를 검사한다. 이렇게 매칭 기능이 추가되면서 조건도 검사 할 수 있게 되었다.
4. 향상된 의사 난수 생성기
기존의 Random 클래스에 더해 다양한 Pseudo Random Number Generator 인터페이스 타입과 구현을 제공
@Test
void RandomGeneratorTest(){
// 특정 PRNG 구현체를 생성
RandomGenerator rng = RandomGeneratorFactory.of("L32X64MixRandom").create();
// 난수 생성
int randomInt = rng.nextInt(10);
double randomDouble = rng.nextDouble();
System.out.println("Random Integer: " + randomInt);
System.out.println("Random Double: " + randomDouble);
}
PRNG 구현체들은 챗 지피티를 참고했다.
5.Record Class
record 클래스는 불변 데이터 클래스를 간결하게 정의 할 수 있는 기능이다.
public record Pointer(int x, int y) {}
@Test
void recordTest(){
Pointer point = new Pointer(10, 20);
// 자동 생성된 toString() 사용
System.out.println(point); // 출력: Point[x=10, y=20]
// 자동 생성된 getter 메서드 사용
System.out.println("x = " + point.x()); // 출력: x = 10
System.out.println("y = " + point.y()); // 출력: y = 20
}
위의 Pointer 라는 Record 클래스가 정의 되었으며 이 클래스는 x, y 두개의 필드를 가지고 있다.
레코드 클래스는 필드가 불변이다. 즉 한번 설정되 필드는 변경할 수 없다.
이로 인해 setter 메서드가 없고 필드를 설정하는 것은 오직 생성자를 통해서만 가능하다.
참고 자료 링크
https://www.oracle.com/java/technologies/javase/11-relnote-issues.html#NewFeature
'자바' 카테고리의 다른 글
객체지향 설계 5원칙 (0) | 2024.07.06 |
---|---|
메모리와 StackOverFlow (0) | 2024.06.28 |
자바의 메모리 구조 (0) | 2024.06.28 |
쓰레드의 동기화 (0) | 2024.06.26 |