Java 버젼별 특징
JAVA 8 : LTS
람다 표현식(Lambda expression) : 함수형 프로그래밍을 지원하기 위해 도입
스트림 API : 컬렉션 데이터를 처리하는 기능 향상
Type Annotation : 어노테이션을 타입 선언에도 적용 가능
// 람다 표현식을 사용한 간단한 예제
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));
// 스트림을 사용한 간단한 예제
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().filter(n -> n % 2 == 0).mapToInt(Integer::intValue).sum();
// 타입 어노테이션을 사용한 정교한 유효성 검사
class MyClass {
@NotNull
public String myMethod() {
return "Hello, World!";
}
}
JAVA 9
// 모듈 선언
module com.example.myapp {
requires java.base;
exports com.example.myapp.util;
}
// 모듈 내부의 클래스
package com.example.myapp.util;
public class MyUtil {
public static String sayHello() {
return "Hello, Java 9 Module System!";
}
}
// private methods in interfaces
public interface Calculator {
int add(int a, int b);
int subtract(int a, int b);
// 두 공개 메서드에서 중복 코드를 private 메서드로 분리
default int multiply(int a, int b) {
return a * b;
}
default double divide(int a, int b) {
return (double) a / b;
}
private int performOperation(int a, int b, IntBinaryOperator operator) {
return operator.applyAsInt(a, b);
}
}
$ jshell
| Welcome to JShell -- Version 9
| For an introduction type: /help intro
jshell> int x = 10;
x ==> 10
JAVA 10
var
를 통한 지역 변수의 타입 추론
지역변수에서만 사용 가능
가독성을 위한 코드에만 선언할 것
// 기존 방식
String name = "Alice";
// Java 10에서의 var 사용
var age = 30;
var greeting = "Hello, World!";
JAVA 11 : LTS
// 기존 방식
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach((String name) -> {
System.out.println("Hello, " + name);
});
// Java 11에서의 var 사용
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach((var name) -> {
System.out.println("Hello, " + name);
});
JAVA 12
public enum DayOfWeek {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public String getDayType(DayOfWeek day) {
String type = switch (day) {
case SATURDAY, SUNDAY -> "주말";
case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "평일";
};
return type;
}
JAVA 13
String day = "MON";
int numLetters = switch (day) {
case "MON", "TUE", "WED", "THU", "FRI" -> 3;
case "SAT", "SUN" -> 4;
default -> {
System.out.println("Invalid day");
yield -1; // 해당 case 블록을 종료하고 -1을 반환합니다.
}
};
String textBlock = """
This is a text block.
It can contain multiple lines.
""";
JAVA 14
String result = switch (day) {
case "MON", "TUE", "WED", "THU", "FRI" -> "Weekday";
case "SAT", "SUN" -> "Weekend";
default -> "Invalid";
};
JAVA 15
String name = "Alice";
String message = """
Hello, %s!
This is a text block with interpolation.
""".formatted(name);
if (obj instanceof String str && str.length() > 5) {
System.out.println("길이가 5보다 큰 문자열: " + str);
}
JAVA 16
enum Color {
RED,
GREEN,
BLUE
}
Color color = Color.RED;
if (color == Color.RED) {
System.out.println("The color is red.");
} else if (color == Color.GREEN) {
System.out.println("The color is green.");
} else if (color == Color.BLUE) {
System.out.println("The color is blue.");
} else {
System.out.println("The color is unknown.");
}
String input = "Hello, world!";
if (input.matches("Hello, (?<name>.*)")) {
System.out.println("The name is " + input.group("name"));
}
record Point(int x, int y) {
public Point {
System.out.println("Record class is created");
}
}
public class Main {
public static void main(String[] args) {
Point p = new Point(10, 20);
System.out.println(p); // Point(x=10, y=20)
}
}
JAVA 17 : LTS
sealed abstract class Animal permits Cat, Dog {
abstract void speak();
}
class Cat extends Animal {
@Override
void speak() {
System.out.println("Meow!");
}
}
class Dog extends Animal {
@Override
void speak() {
System.out.println("Woof!");
}
}
JAVA 18
/**
* This method returns the sum of two numbers.
*
* @param a the first number
* @param b the second number
* @return the sum of a and b
*/
int add(int a, int b) {
return a + b;
}
/**
* This is an example of how to use the add() method.
*
* @snippet add(10, 20)
*/
void example() {
int sum = add(10, 20);
System.out.println(sum); // prints 30
}
JAVA 19
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class StructuredConcurrencyExample {
public static void main(String[] args) throws Exception {
// Create a new executor service.
ExecutorService executorService = Executors.newSingleThreadExecutor();
// Create a new structured task.
StructuredTask<Integer> task = new StructuredTask<>(() -> {
// Do some work.
Thread.sleep(1000);
return 10;
});
// Submit the task to the executor service.
Future<Integer> future = executorService.submit(task);
// Wait for the task to complete.
Integer result = future.get();
// Print the result.
System.out.println(result); // 10
// Shutdown the executor service.
executorService.shutdown();
}
}
느낀점
항상 자바8만 써오다가 다른 버전에선 재밌는 기능들을 많이 제공해주고 있어서 흥미로웠다.
근시일 내 SpringBoot 버전 업그레이드를 목표로 하고 있는데, 이 때 JDK 버전도 가능하다면 업그레이드 해봐야겠다.
Last modified: 15 October 2024