ํฐ์คํ ๋ฆฌ ๋ทฐ
โ Java 8~21 ๋ฒ์ ๋ณ ์ฐจ์ด์
https://www.java.com/releases/
Java 8 (2014๋ ์ถ์)
Java 8์ Java ์ธ์ด์ ํฐ ๋ณํ๋ฅผ ๊ฐ์ ธ์จ ๋ฒ์ ์ผ๋ก, ์ดํ์ ๋ง์ ๊ธฐ๋ฅ๋ค์ด Java 8์ ๊ธฐ๋ฅ์ ๊ธฐ๋ฐํ๊ณ ์์ต๋๋ค.
- 32๋นํธ๋ฅผ ์ง์ํ๋ ๊ณต์์ ์ธ ๋ง์ง๋ง ๋ฒ์
- ๋๋ค ํํ์ (Lambda Expressions): ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋์ ํ์ฌ ์ฝ๋ ๊ฐ๊ฒฐํ.
- ์คํธ๋ฆผ API (Stream API): ์ปฌ๋ ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ ์ธํ API๋ก, ํํฐ๋ง, ๋งคํ, ์ถ์(reduction) ๋ฑ์ ์์ ์ ๋ ์ฝ๊ฒ ์ํ.
- ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋ (Default Methods): ์ธํฐํ์ด์ค์ ๋ฉ์๋ ๊ตฌํ์ ์ ๊ณตํ ์ ์๋๋ก ํ์ฉ.
- Optional ํด๋์ค: NullPointerException ๋ฐฉ์ง๋ฅผ ์ํด ์ฌ์ฉ๋๋ ๊ฐ์ฒด ๋ํ ํด๋์ค.
- ์๋ก์ด ๋ ์ง ๋ฐ ์๊ฐ API: java.time ํจํค์ง๋ฅผ ํตํด ๋ ๋์ ๋ ์ง ๋ฐ ์๊ฐ ์ฒ๋ฆฌ๋ฅผ ์ ๊ณต.
- Perm Gem ์์ญ์ญ์ (์ฐธ๊ณ : https://johngrib.github.io/wiki/java8-why-permgen-removed/)
1. ๋๋คํํ์
public class ExampleLambda {
public static void main(String[] args) {
List<String> names = Arrays.asList("Park", "Kim", "Choi", "Lee");
// ๋๋ค ํํ์
names.forEach(name -> System.out.println(name));
}
}
2. ์คํธ๋ฆผAPI
public class ExampleStream {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// ์คํธ๋ฆผ์ ์ด์ฉํ ํํฐ๋ง๊ณผ ์ถ๋ ฅ
numbers.stream()
.filter(n -> n % 2 == 0) // ์ง์๋ง ํํฐ๋ง
.forEach(System.out::println);
}
}
3. ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋
interface MyInterface {
default void defaultMethod() {
System.out.println("This is a default method");
}
}
public class DefaultMethodExample implements MyInterface {
public static void main(String[] args) {
DefaultMethodExample obj = new DefaultMethodExample();
obj.defaultMethod(); // ๋ํดํธ ๋ฉ์๋ ํธ์ถ
}
}
4. ์๋ก์ด ๋ ์ง์ ์๊ฐ API
public class ExampleDateTime {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
System.out.println("ํ์ฌ ๋ ์ง: " + date);
LocalTime time = LocalTime.now();
System.out.println("ํ์ฌ ์๊ฐ: " + time);
LocalDateTime dateTime = LocalDateTime.now();
System.out.println("ํ์ฌ ๋ ์ง์ ์๊ฐ: " + dateTime);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = dateTime.format(formatter);
System.out.println("ํ์ํ๋ ๋ ์ง์ ์๊ฐ: " + formattedDateTime);
}
}
5. Optionalํด๋์ค
public class ExampleOptional {
public static void main(String[] args) {
String name = "John";
Optional<String> optionalName = Optional.ofNullable(name);
System.out.println("์ด๋ฆ ๊ธธ์ด: " + optionalName.map(String::length).orElse(0));
String nullName = null;
Optional<String> optionalNullName = Optional.ofNullable(nullName);
System.out.println("Null ์ด๋ฆ ๊ธธ์ด: " + optionalNullName.map(String::length).orElse(0));
}
}
Java 9 (2017๋ ์ถ์)
Java 9์์๋ ์ฃผ์ํ ์์คํ ์ ์ธ ๋ณํ๊ฐ ์์์ผ๋ฉฐ, ํนํ ๋ชจ๋ ์์คํ ๋์ ์ด ํฐ ๋ณํ์์ต๋๋ค.
- ๋ชจ๋ ์์คํ (Project Jigsaw): ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ํํ ์ ์๋ module-info.java ๋์ .
- JShell: ์ธํฐ๋ํฐ๋ธํ REPL(Read-Eval-Print Loop) ๋๊ตฌ๋ก, Java ์ฝ๋๋ฅผ ๋ฐ๋ก ์คํํ ์ ์๊ฒ ํจ.
- ์คํธ๋ฆผ API ๊ฐ์ : takeWhile(), dropWhile(), iterate() ๋ฑ์ ๋ฉ์๋ ์ถ๊ฐ.
- HTTP/2 ํด๋ผ์ด์ธํธ: ๋น๋๊ธฐ HTTP/2 ํธ์ถ์ ์ง์ํ๋ ์ HTTP ํด๋ผ์ด์ธํธ API ๋์ .
1. ๋ชจ๋ ์์คํ
// module-info.java ํ์ผ์ ํ๋ก์ ํธ ๋ฃจํธ์ ์์ฑ
module mymodule {
exports com.example.mymodule;
}
// ๋ชจ๋์ฌ์ฉ์์
package com.example.mymodule;
public class MyModuleClass {
public static void sayHello() {
System.out.println("Hello from mymodule!");
}
}
// ๋ชจ๋์ ํตํด์ ์๋ก ๋ค๋ฅธ ํจํค์ง ๊ฐ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ ์ ๊ทผ ๋ฒ์๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค.
2. ์ธํฐํ์ด์ค์ private๋ฉ์๋
- Java9๋ถํฐ ์ธํฐํ์ด์ค์ private๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์ด์ ์ฝ๋ ์ฌ์ฌ์ฉ์ด ๋ ์ฉ์ดํด์ง
interface MyInterface {
default void method1() {
System.out.println("Method 1");
commonMethod();
}
default void method2() {
System.out.println("Method 2");
commonMethod();
}
// private ๋ฉ์๋ ์ ์
private void commonMethod() {
System.out.println("This is a common method");
}
}
public class PrivateMethodInInterfaceExample implements MyInterface {
public static void main(String[] args) {
PrivateMethodInInterfaceExample obj = new PrivateMethodInInterfaceExample();
obj.method1();
obj.method2();
}
}
3. Stream API ๊ฐ์
- Java 9์์๋ takeWhile, dropWhile, iterate ๋ฑ์ ์๋ก์ด ๋ฉ์๋๊ฐ Stream API์ ์ถ๊ฐ๋์์ต๋๋ค.
public class StreamAPIExample {
public static void main(String[] args) {
// takeWhile ์์
Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
.takeWhile(n -> n < 5) // ์กฐ๊ฑด์ด true์ธ ๋์๋ง ์์๋ฅผ ๊ฐ์ ธ์ด
.forEach(System.out::println);
// dropWhile ์์
Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
.dropWhile(n -> n < 5) // ์กฐ๊ฑด์ด true์ธ ๋์์ ๊ฑด๋๋ฐ๊ณ ๋๋จธ์ง๋ฅผ ๊ฐ์ ธ์ด
.forEach(System.out::println);
}
}
4. Optional ํด๋์ค ๊ฐ์
- ifPresentOrElse, or, stream ๋ฑ์ ์๋ก์ด ๋ฉ์๋๊ฐ ์ถ๊ฐ
public class OptionalExample {
public static void main(String[] args) {
Optional<String> optionalValue = Optional.of("Hello");
// ifPresentOrElse ๋ฉ์๋
optionalValue.ifPresentOrElse(
System.out::println,
() -> System.out.println("Value is absent")
);
// stream ๋ฉ์๋
optionalValue.stream()
.forEach(System.out::println);
}
}
5. try-with-resources ๊ฐ์
public class TryWithResourcesExample {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader("test.txt"));
// ์ด๋ฏธ ์ ์ธ๋ ๋ฆฌ์์ค๋ฅผ try-with-resources์์ ์ฌ์ฉ
try (reader) {
System.out.println(reader.readLine());
}
}
}
Java 10 (2018๋ ์ถ์)
Java 10์ ์งง์ ๋ฆด๋ฆฌ์ค ์ฃผ๊ธฐ๋ก ์ ๊ณต๋์์ผ๋ฉฐ, ์ฃผ๋ก ์ฑ๋ฅ ํฅ์ ๋ฐ ๊ฐ๋ฐ์ ๊ฒฝํ ๊ฐ์ ์ ์ด์ ์ ๋ง์ท์ต๋๋ค.
- ์ง์ญ ๋ณ์ ํ์ ์ถ๋ก (var): ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ๋ณ์ ํ์ ์ ์ถ๋ก ํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ช ์์ ์ผ๋ก ํ์ ์ ์ ์ธํ ํ์๊ฐ ์์.
- Garbage Collector ๊ฐ์ : G1 GC๋ฅผ ๊ธฐ๋ณธ GC๋ก ์ง์ ํ๊ณ ์ฑ๋ฅ ์ต์ ํ.
1. varํค์๋๋ฅผ ํตํ ์ง์ญ๋ณ์ ํ์ ์ถ๋ก
public class ExampleVar {
public static void main(String[] args) {
// var ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์
์ถ๋ก
var message = "Hello, Java 10!";
System.out.println(message);
var numbers = List.of(1, 2, 3, 4, 5);
System.out.println("List: " + numbers);
var list = new ArrayList<String>();
list.add("Java");
list.add("10");
System.out.println("ArrayList: " + list);
}
}
2. List.copyOf(), Set.copyOf(), Map.copyOf() ๋ฉ์๋
- ์ปฌ๋ ์ ์ ๋ณต์ฌํ์ฌ ๋ถ๋ณ ์ปฌ๋ ์ ์ ์์ฑํ๋ ๋ฉ์๋๊ฐ ์ถ๊ฐ
public class CopyOfExample {
public static void main(String[] args) {
// ๊ธฐ์กด ๋ฆฌ์คํธ ๋ณต์ฌํ์ฌ ๋ถ๋ณ ๋ฆฌ์คํธ ์์ฑ
List<Integer> originalList = List.of(1, 2, 3);
List<Integer> copyList = List.copyOf(originalList);
System.out.println("List.copyOf: " + copyList);
// ๊ธฐ์กด ์
๋ณต์ฌํ์ฌ ๋ถ๋ณ ์
์์ฑ
Set<String> originalSet = Set.of("A", "B", "C");
Set<String> copySet = Set.copyOf(originalSet);
System.out.println("Set.copyOf: " + copySet);
// ๊ธฐ์กด ๋งต ๋ณต์ฌํ์ฌ ๋ถ๋ณ ๋งต ์์ฑ
Map<String, Integer> originalMap = Map.of("one", 1, "two", 2);
Map<String, Integer> copyMap = Map.copyOf(originalMap);
System.out.println("Map.copyOf: " + copyMap);
}
}
3. Optional.orElseThrow() ๋ฉ์๋
public class OptionalExample {
public static void main(String[] args) {
Optional<String> optional = Optional.of("Hello, Java 10!");
// ๊ฐ์ด ์์ ๋ NoSuchElementException์ ๋์ง
String value = optional.orElseThrow();
System.out.println(value);
}
}
4. Collectors.toUnmodifiableList(), Collectors.toUnmodifiableSet(), Collectors.toUnmodifiableMap()
- Java 10์์๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์ค ๊ฒฐ๊ณผ๋ฅผ ๋ถ๋ณ ์ปฌ๋ ์ ์ผ๋ก ์์งํ๋ ์๋ก์ด Collectors ๋ฉ์๋๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ฅผ ํตํด ์์ง๋ ์ปฌ๋ ์ ์ ๋ณ๊ฒฝํ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
public class UnmodifiableCollectorsExample {
public static void main(String[] args) {
// ์คํธ๋ฆผ์ ๋ถ๋ณ ๋ฆฌ์คํธ๋ก ์์ง
List<String> unmodifiableList = Stream.of("A", "B", "C")
.collect(Collectors.toUnmodifiableList());
System.out.println("Unmodifiable List: " + unmodifiableList);
// ๋ฆฌ์คํธ์ ์์๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํ๋ฉด UnsupportedOperationException ๋ฐ์
// unmodifiableList.add("D"); // ์คํ ์ ์์ธ ๋ฐ์
}
}
5. G1 ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ํฅ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
- G1 ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๊ธฐ๋ณธ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ก ์ค์ ๋์์ผ๋ฉฐ, ์ ์ฒด ํ ์์ญ์ ๋์ ์ผ๋ก ํ ๋นํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ก ์ธํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ๋์ฑ ํจ์จ์ ์ด๊ฒ ๋์์ต๋๋ค.
Java 11 (2018๋ ์ถ์, LTS)
Java 11์ ์ฅ๊ธฐ ์ง์(Long-Term Support, LTS) ๋ฒ์ ์ผ๋ก, ์์ ์ฑ๊ณผ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ๋ง์ ๊ธฐ์ ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
- Open JDK์ Oracle JDK ํตํฉ
- ๋๋ค ์ง์ญ ๋ณ์ ์ฌ์ฉ ๋ฐฉ๋ฒ ๋ณ๊ฒฝ (var)
- ์๋ก์ด HTTP ํด๋ผ์ด์ธํธ API (HTTP/2 ์ง์): HTTP/2 ๋ฐ WebSocket์ ์ง์ํ๋ ์ ํด๋ผ์ด์ธํธ API๊ฐ ์ ์์ผ๋ก ๋์
๋จ.
- ๋ฒ์ 11 ๋ถํฐ Java Http Client API๋ ์ต์ HTTP ํ์ค ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌํํ์ฌ ๋๊ธฐ ๋ฐ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ธ HTTP/1.1 ๋ฐ HTTP/2๋ฅผ ์ง์ํจ - ์๋ก์ด String ๋ฉ์๋: isBlank(), lines(), repeat(), strip() ๋ฑ์ ์ ์ฉํ String ๋ฉ์๋ ์ถ๊ฐ.
- ํ์คํ๋ ๋ฐํ์ ๋ก๋ ๊ฐ๋ฅ์ฑ: Java ๋ฐํ์์์ dynamic ํด๋์ค ํ์ผ์ ๋ก๋ํ ์ ์๋ ๊ธฐ๋ฅ ์ถ๊ฐ.
- ์์ฉ ํ๋ก๊ทธ๋จ์ ์ผ๋ถ๋ก ํฌํจํ ์ ์๋ Java ๋ฐํ์: ๊ธฐ์กด์ java --add-modules๋ก ์ฌ๋ฌ ๋ชจ๋์ ์กฐํฉ ๊ฐ๋ฅ.
1. var๋ฅผ ์ฌ์ฉํ ๋๋ค ํํ์์ ์ง์ญ ๋ณ์ ํ์ ์ถ๋ก
public class LambdaVarExample {
public static void main(String[] args) {
BiFunction<Integer, Integer, Integer> add = (var a, var b) -> a + b;
System.out.println(add.apply(10, 20)); // ์ถ๋ ฅ: 30
}
}
2. ์๋ก์ด String ๋ฉ์๋
public class StringMethodsExample {
public static void main(String[] args) {
String str = " Hello Java 11! ";
// isBlank() ๋ฉ์๋
System.out.println("".isBlank()); // ์ถ๋ ฅ: true
// strip() ๋ฉ์๋
System.out.println("[" + str.strip() + "]"); // ์ถ๋ ฅ: [Hello Java 11!]
// lines() ๋ฉ์๋
String multiLineStr = "Hello\nJava 11\n!";
multiLineStr.lines().forEach(System.out::println);
// ์ถ๋ ฅ:
// Hello
// Java 11
// !
// repeat() ๋ฉ์๋
String repeated = "Hello ".repeat(3);
System.out.println(repeated); // ์ถ๋ ฅ: Hello Hello Hello
}
}
3. HTTP Client ํ์คํ
public class HttpClientExample {
public static void main(String[] args) throws IOException, InterruptedException {
// HttpClient ์์ฑ
HttpClient client = HttpClient.newHttpClient();
// ์์ฒญ ์์ฑ
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://postman-echo.com/get"))
.build();
// ์๋ต ๋ฐ๊ธฐ
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// ์๋ต ๋ด์ฉ ์ถ๋ ฅ
System.out.println(response.body());
}
}
4. ํ์ผ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ๊ฐ์ํ
public class FileReadWriteExample {
public static void main(String[] args) throws IOException {
Path filePath = Path.of("example.txt");
// ํ์ผ์ ๋ฌธ์์ด ์ฐ๊ธฐ
Files.writeString(filePath, "Hello, Java 11!");
// ํ์ผ์์ ๋ฌธ์์ด ์ฝ๊ธฐ
String content = Files.readString(filePath);
System.out.println(content); // ์ถ๋ ฅ: Hello, Java 11!
}
}
5. Optional ํด๋์ค์ isEmpty() ๋ฉ์๋ ์ถ๊ฐ
public class OptionalExample {
public static void main(String[] args) {
Optional<String> optional = Optional.ofNullable(null);
// isEmpty() ๋ฉ์๋ ์ฌ์ฉ
if (optional.isEmpty()) {
System.out.println("Optional is empty!"); // ์ถ๋ ฅ: Optional is empty!
}
}
}
6. Java EE์ CORBA ๋ชจ๋ ์ ๊ฑฐ
- 11์์๋ ์๋ฐ EE ๋ฐ CORBA ๊ด๋ จ ๋ชจ๋์ด ๋ ์ด์ ํฌํจ๋์ง ์์ผ๋ฉฐ, ์๋ฐ ์คํฌ๋ฆฝํธ ์์ง ์ฌ์ฉ๋ ์ค๋จ๋์์ต๋๋ค. ์ด๋ฐ ๋ชจ๋๋ค์ ์์ฃผ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ, ํ์ํ ๊ฒฝ์ฐ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋์ฒด ๊ฐ๋ฅ
Java 12 (2019๋ ์ถ์)
Java 12๋ ์ฑ๋ฅ ๋ฐ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ ์คํ์ ์ผ๋ก ๋์ ํ ๋ฒ์ ์ ๋๋ค.
- Switch Expressions (๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ธฐ๋ฅ): switch ๋ฌธ์ ํํ์์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ.
- Garbage Collector ๊ฐ์ : G1 GC์ ๋ํ ์ฑ๋ฅ ๊ฐ์ ๋ฐ Shenandoah GC ์ถ๊ฐ.
1. switch ํํ์ (Switch Expressions) - ํ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ
public class SwitchExpressionExample {
public static void main(String[] args) {
int day = 2;
// Java 12์ switch ํํ์
String dayName = switch (day) {
case 1 -> "Sunday";
case 2 -> "Monday";
case 3 -> "Tuesday";
case 4 -> "Wednesday";
case 5 -> "Thursday";
case 6 -> "Friday";
case 7 -> "Saturday";
default -> throw new IllegalArgumentException("Invalid day: " + day);
};
System.out.println("Day " + day + " is " + dayName);
}
}
2. Collectors.teeing() ๋ฉ์๋
public class TeeingCollectorExample {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// ํ๊ท ๊ณผ ํฉ์ ๋์์ ๊ณ์ฐ
var result = numbers.stream()
.collect(Collectors.teeing(
Collectors.summingInt(Integer::intValue),
Collectors.averagingInt(Integer::intValue),
(sum, avg) -> "Sum: " + sum + ", Average: " + avg
));
System.out.println(result); // ์ถ๋ ฅ: Sum: 55, Average: 5.5
}
}
3. ์๋ก์ด String ๋ฉ์๋ (indent, transform)
public class StringMethodsExample {
public static void main(String[] args) {
String text = "Hello\nJava 12!";
// indent() ๋ฉ์๋
String indented = text.indent(4);
System.out.println("Indented Text: ");
System.out.println(indented);
// transform() ๋ฉ์๋
String transformed = text.transform(str -> str.toUpperCase());
System.out.println("Transformed Text: " + transformed); // ์ถ๋ ฅ: HELLO\nJAVA 12!
}
}
4. ํ์ผ ๋ฐ ํ๋ก์ธ์ค API ๊ฐ์
public class FileMismatchExample {
public static void main(String[] args) throws IOException {
Path file1 = Files.writeString(Files.createTempFile("file1", ".txt"), "Hello Java 12");
Path file2 = Files.writeString(Files.createTempFile("file2", ".txt"), "Hello Java 11");
// ๋ ํ์ผ์ ๋ถ์ผ์น ์์น ์ฐพ๊ธฐ
long mismatch = Files.mismatch(file1, file2);
System.out.println("Mismatch at byte position: " + mismatch); // ์ถ๋ ฅ: Mismatch at byte position: 9
}
}
5. Shenandoah ๊ฐ๋น์ง ์ปฌ๋ ํฐ
- ์๋ก์ด ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ธ Shenandoah๊ฐ ์คํ์ ์ผ๋ก ๋์ ๋์์ต๋๋ค. Shenandoah๋ ์งง์ GC ์ง์ฐ ์๊ฐ์ ์ค์ ์ ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ๋๋ค. ์ด ์์ ๋ Shenandoah GC๋ฅผ ์ง์ ๋ณด์ฌ์ฃผ์ง ์์ง๋ง, GC๋ฅผ ํ์ฑํํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
6. JVM ๊ฐ์ ์ฌํญ
- JVM์ ๋ช ๊ฐ์ง ์ค์ํ ๊ฐ์ ์ฌํญ์ด ์ถ๊ฐ๋์์ต๋๋ค. ๊ทธ ์ค ํ๋๋ JEP 346: Promptly Return Unused Committed Memory์ ๋๋ค. ์ด ๊ธฐ๋ฅ์ JVM์ด ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์คํ ์ ๋น ๋ฅด๊ฒ ๋ฐํํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด ๊ธฐ๋ฅ์ ํนํ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ๋์ด๋๋ฐ ์ ์ฉํฉ๋๋ค
Java 13 (2019๋ ์ถ์)
Java 13์ ๊ฐ๋จํ ๊ฐ์ ์ฌํญ๋ค์ ๋์ ํ์ต๋๋ค.
- ํ ์คํธ ๋ธ๋ก (Text Blocks, ๋ฏธ๋ฆฌ๋ณด๊ธฐ): ์ฌ๋ฌ ์ค์ ๋ฌธ์์ด์ ๋์ฑ ๊ฐ๋ ์ฑ ์๊ฒ ์์ฑํ ์ ์๋ ๊ธฐ๋ฅ.
- Switch Expressions (๋ฏธ๋ฆฌ๋ณด๊ธฐ): Switch ํํ์์ด ๋์ฑ ๊ฐ๊ฒฐํ๊ฒ ๊ฐ์ ๋จ.
1. ํ ์คํธ ๋ธ๋ก (Text Blocks) - ํ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ
public class TextBlockExample {
public static void main(String[] args) {
String textBlock = """
Hello, Java 13!
This is a text block.
It makes multi-line strings easier to write.
""";
System.out.println(textBlock);
}
}
2. switch ํํ์์ ์ ์ ๋์
public class SwitchExpressionExample {
public static void main(String[] args) {
int day = 2;
// Java 13์ switch ํํ์
String dayName = switch (day) {
case 1 -> "Sunday";
case 2 -> "Monday";
case 3 -> "Tuesday";
case 4 -> "Wednesday";
case 5 -> "Thursday";
case 6 -> "Friday";
case 7 -> "Saturday";
default -> throw new IllegalArgumentException("Invalid day: " + day);
};
System.out.println("Day " + day + " is " + dayName);
}
}
3. yield๋ฅผ ์ฌ์ฉํ switch ํํ์
public class YieldInSwitchExample {
public static void main(String[] args) {
int score = 85;
// Java 13์ switch ํํ์์์ yield ์ฌ์ฉ
String grade = switch (score / 10) {
case 10, 9 -> "A";
case 8 -> "B";
case 7 -> "C";
case 6 -> "D";
default -> {
// ์ฌ๋ฌ ์ค์ ๋ณต์กํ ๋ก์ง์ด ์์ ๋ yield ์ฌ์ฉ ๊ฐ๋ฅ
System.out.println("Failing grade.");
yield "F";
}
};
System.out.println("Grade: " + grade); // ์ถ๋ ฅ: Grade: B
}
}
4. ZGC (Z Garbage Collector) ๊ฐ์
5. ํ ์์ญ ํ์ฅ (Dynamic CDS Archives)
Java 14 (2020๋ ์ถ์)
Java 14๋ ์์ฐ์ฑ ํฅ์์ ์ํ ๋ช ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์ ๋์ ํ์ต๋๋ค.
- Pattern Matching for instanceof (๋ฏธ๋ฆฌ๋ณด๊ธฐ): instanceof์ ํ์ ์บ์คํ ์ ๊ฒฐํฉํ์ฌ ์ฝ๋ ๊ฐ์ํ.
- Record ํ์ (๋ฏธ๋ฆฌ๋ณด๊ธฐ): ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ์ํ ์ ์๋ Record ํ์ ์ถ๊ฐ.
- NPE ๊ฐ์ : NullPointerException ๋ฐ์ ์ ๋ ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋๋ก ๊ฐ์ .
1. switch ํํ์์ ๊ฐ์ (Switch Expressions) - ์ ์ ๋์
- switch ํํ์์ด ์ ์ ๊ธฐ๋ฅ์ผ๋ก ๋์ ๋์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ yield๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์์ผ๋ฉฐ, ๊ธฐ์กด์ switch ๋ฌธ๋ณด๋ค ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
2. NullPointerException์ ์์ธ ๋ฉ์์ง ๊ฐ์
- NullPointerException์ ๋ฉ์์ง๋ฅผ ๋ ์์ธํ๊ฒ ํ์ํ ์ ์๊ฒ ๋์์ต๋๋ค. ์ด์ ์ด๋์์ null์ด ๋ฐ์ํ๋์ง ์ ํํ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
3. ๋ ์ฝ๋ (Records) - ํ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ
// ๋ ์ฝ๋ ์ ์
public record Person(String name, int age) {}
public class RecordExample {
public static void main(String[] args) {
// ๋ ์ฝ๋ ์ธ์คํด์ค ์์ฑ
Person person = new Person("John", 25);
// ์๋ ์์ฑ๋ ๋ฉ์๋ ์ฌ์ฉ
System.out.println(person.name()); // ์ถ๋ ฅ: John
System.out.println(person.age()); // ์ถ๋ ฅ: 25
System.out.println(person); // ์ถ๋ ฅ: Person[name=John, age=25]
}
}
4. ํจํด ๋งค์นญ์ ์ด์ฉํ instanceof
- instanceof ๊ตฌ๋ฌธ์์ ํ์ ์บ์คํ ์ ๋ ๊ฐ๊ฒฐํ๊ฒ ํ ์ ์๋ ํจํด ๋งค์นญ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค. ์ด์ instanceof๋ก ํ์ ์ ํ์ธํ ํ, ๋ฐ๋ก ํด๋น ํ์ ์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค.
public class InstanceofPatternMatchingExample {
public static void main(String[] args) {
Object obj = "Hello, Java 14!";
// ํจํด ๋งค์นญ์ ์ฌ์ฉํ instanceof
if (obj instanceof String s) {
System.out.println(s.toUpperCase()); // ์ถ๋ ฅ: HELLO, JAVA 14!
}
}
}
5. helpful NullPointerExceptions ์ต์
- NullPointerException์ ๋ํ ์ ์ฉํ ์ ๋ณด๊ฐ ํฌํจ๋ ์์ธ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ๋ helpful NullPointerExceptions ์ต์ ์ด ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋๋ฒ๊น ์ด ํจ์ฌ ์ฌ์์ง๋๋ค. JVM์ ์คํํ ๋ ๋ค์๊ณผ ๊ฐ์ ์ต์ ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
java -XX:+ShowCodeDetailsInExceptionMessages MyApp.jar
6. JEP 367: ZGC on macOS and Windows
- ZGC(Z Garbage Collector)๊ฐ macOS์ Windows์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋์์ต๋๋ค. ZGC๋ ๋งค์ฐ ์งง์ ์ง์ฐ ์๊ฐ์ผ๋ก ๋์ํ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ๋๋ค. ์์ ์ฝ๋๋ก๋ ์ง์ ํ์ธํ๊ธฐ ์ด๋ ต์ง๋ง, ZGC๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค
java -XX:+UseZGC -Xmx4g -Xms4g MyApp.jar
Java 15 (2020๋ ์ถ์)
Java 15๋ ์ฌ๋ฌ ์คํ์ ๊ธฐ๋ฅ๋ค์ ์์ฑ์ํค๋ ์ค์ํ ๋ฒ์ ์ ๋๋ค.
- ํ ์คํธ ๋ธ๋ก (Text Blocks, ์ ์): ์ฌ๋ฌ ์ค ๋ฌธ์์ด์ ์ฝ๊ฒ ์์ฑํ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฅ์ด ์ ์์ผ๋ก ๋์ ๋จ.
- Sealed ํด๋์ค (๋ฏธ๋ฆฌ๋ณด๊ธฐ): ํด๋์ค ๊ณ์ธต์ ์ ํํ๋ ๊ธฐ๋ฅ์ผ๋ก, ํน์ ํด๋์ค๋ง ์์ํ ์ ์๋๋ก ํ์ฉ.
- Hidden ํด๋์ค: ๋ฐํ์์์ ์์ฑ๋๊ณ ์ดํ ๋ค์ ์ฌ์ฉ๋์ง ์๋ ํด๋์ค๋ค์ ์ํ ๊ธฐ๋ฅ.
1. ๋ ์ฝ๋ (Records) - ๊ฐ์
2. Sealed Classes (๋ด์ธ๋ ํด๋์ค) - ํ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ
// ๋ด์ธ๋ ํด๋์ค ์ ์
public sealed class Shape permits Circle, Square {}
final class Circle extends Shape {
double radius;
}
final class Square extends Shape {
double side;
}
public class SealedClassExample {
public static void main(String[] args) {
Shape shape1 = new Circle();
Shape shape2 = new Square();
System.out.println("Shape1 is a " + shape1.getClass().getSimpleName());
System.out.println("Shape2 is a " + shape2.getClass().getSimpleName());
}
}
3. ํ ์คํธ ๋ธ๋ก (Text Blocks) - ์ ์ ๋์
4. ํจํด ๋งค์นญ์ ์ด์ฉํ instanceof์ ๊ฐ์
5. ์จ๊ฒจ์ง ํด๋์ค (Hidden Classes)
- **์จ๊ฒจ์ง ํด๋์ค (Hidden Classes)**๋ผ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค. ์ด ํด๋์ค๋ ๋ฐํ์์๋ง ์ฌ์ฉ๋๊ณ , ์ง์ ์ ์ผ๋ก ์ฐธ์กฐํ ์ ์๋ ํด๋์ค๋ก, ์ฃผ๋ก ํ๋ ์์ํฌ์์ ๋์ ์ผ๋ก ํด๋์ค๋ฅผ ์์ฑํ ๋ ์ ์ฉํฉ๋๋ค. ์์ ์ฝ๋๋ก๋ ๋ค์ ๋ณต์กํ๋ฉฐ, ํ๋ ์์ํฌ ์์ค์์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
Java 16 (2021๋ ์ถ์)
Java 16์ ์ฑ๋ฅ๊ณผ ์์ฐ์ฑ ํฅ์์ ์ด์ ์ ๋ง์ท์ต๋๋ค.
- Record (์ ์): Record ํ์ ์ด ์ ์ ๊ธฐ๋ฅ์ผ๋ก ๋์ ๋์ด ๋ถ๋ณ ๊ฐ์ฒด์ ์ ์ธ์ด ๊ฐ์ํ๋จ.
- ํจํด ๋งค์นญ for instanceof (์ ์): instanceof์ ํจ๊ป ์ฌ์ฉ ๊ฐ๋ฅํ ํจํด ๋งค์นญ์ด ์ ์์ผ๋ก ๋์ ๋จ.
- Stream.toList(): ์คํธ๋ฆผ์ ๋ฆฌ์คํธ๋ก ์ฝ๊ฒ ๋ณํํ ์ ์๋ ์๋ก์ด ๋ฉ์๋ ์ถ๊ฐ.
1. ๋ ์ฝ๋ (Records) - ์ ์ ๊ธฐ๋ฅ
2. ํจํด ๋งค์นญ์ ์ด์ฉํ instanceof - ์ ์ ๋์
3. Stream API ๊ฐ์
4. ํ๋ก์์ ์ง๋ ฌํ ๊ธฐ๋ฅ ๊ฐ์
5. Vector API (Incubator)
public class VectorAPIExample {
public static void main(String[] args) {
// Int ๋ฒกํฐ ์ฐ์ฐ ์์
VectorSpecies<Integer> SPECIES = IntVector.SPECIES_256;
int[] a = {1, 2, 3, 4, 5, 6, 7, 8};
int[] b = {1, 2, 3, 4, 5, 6, 7, 8};
int[] c = new int[8];
var av = IntVector.fromArray(SPECIES, a, 0);
var bv = IntVector.fromArray(SPECIES, b, 0);
var cv = av.add(bv);
cv.intoArray(c, 0);
for (int value : c) {
System.out.println(value); // ์ถ๋ ฅ: 2 4 6 8 10 12 14 16
}
}
}
6. Sealed Classes (๋ด์ธ๋ ํด๋์ค) - ํ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ (๊ณ์ ๊ฐ์ )
Java 17 (2021๋ ์ถ์, LTS)
Java 17์ Java 11 ์ดํ์ ๋ ๋ฒ์งธ ์ฅ๊ธฐ ์ง์(LTS) ๋ฒ์ ์ผ๋ก, ๋ง์ ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ์์ ์ฑ ๊ฐ์ ์ด ํฌํจ๋์์ต๋๋ค.
- Sealed ํด๋์ค (์ ์): ์๋ธํด๋์ค๋ฅผ ์ ํํ๋ ๊ธฐ๋ฅ์ด ์ ์์ผ๋ก ๋์ ๋จ.
- Pattern Matching for switch (๋ฏธ๋ฆฌ๋ณด๊ธฐ): switch ๋ฌธ์์ ํจํด ๋งค์นญ์ ์ฌ์ฉํ ์ ์์.
- Foreign Function & Memory API (๋ฏธ๋ฆฌ๋ณด๊ธฐ): ์ธ๋ถ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ๊ณผ ์ธ๋ถ ํจ์ ํธ์ถ์ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ํ ์ ์๋ API ์ถ๊ฐ.
1. ํจํด ๋งค์นญ์ ์ด์ฉํ switch ํํ์
public class PatternMatchingSwitchExample {
public static void main(String[] args) {
Object obj = "Hello, Java 17!";
// ํจํด ๋งค์นญ์ ์ด์ฉํ switch ํํ์
String result = switch (obj) {
case Integer i -> "Integer: " + i;
case String s -> "String: " + s;
case null -> "Null value";
default -> "Unknown type";
};
System.out.println(result); // ์ถ๋ ฅ: String: Hello, Java 17!
}
}
2. ๋ ์ฝ๋ (Records)์ Sealed Classes์ ์กฐํฉ
public sealed interface Shape permits Circle, Rectangle {}
public record Circle(double radius) implements Shape {}
public record Rectangle(double width, double height) implements Shape {}
public class SealedRecordExample {
public static void main(String[] args) {
Shape shape = new Circle(5.0);
String description = switch (shape) {
case Circle c -> "Circle with radius: " + c.radius();
case Rectangle r -> "Rectangle with width: " + r.width() + " and height: " + r.height();
};
System.out.println(description); // ์ถ๋ ฅ: Circle with radius: 5.0
}
}
3. ๊ฐ๋ ฅํ Random๊ตฌํ
public class RandomExample {
public static void main(String[] args) {
// RandomGenerator ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ ๋๋ค ์ซ์ ์์ฑ๊ธฐ
RandomGenerator generator = RandomGeneratorFactory.of("Xoshiro256PlusPlus").create();
for (int i = 0; i < 5; i++) {
System.out.println(generator.nextInt(100)); // 0๋ถํฐ 100 ์ฌ์ด์ ๋์ ์ถ๋ ฅ
}
}
}
Java 18 (2022๋ ์ถ์)
Java 18์ ์ฃผ๋ก ์ฑ๋ฅ๊ณผ ๊ฐ๋ฐ์ ๊ฒฝํ ํฅ์์ ์ด์ ์ ๋ง์ถ ๋ฒ์ ์ ๋๋ค.
- Simple Web Server: ๊ฐ๋จํ ๊ฐ๋ฐ ๋ฐ ํ ์คํธ์ฉ ์น ์๋ฒ ์ถ๊ฐ.
- UTF-8 ๊ธฐ๋ณธ ๋ฌธ์ ์ธ์ฝ๋ฉ: ๋ชจ๋ ํ๋ซํผ์์ UTF-8์ ๊ธฐ๋ณธ ์ธ์ฝ๋ฉ์ผ๋ก ์ฌ์ฉํ๋๋ก ํ์คํ.
1. Simple Web Server
public class SimpleWebServerExample {
public static void main(String[] args) throws IOException {
// HTTP ์๋ฒ ์์ฑ
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
// ์์ฒญ์ ๋ํด ๊ฐ๋จํ ์๋ต ์์ฑ
server.createContext("/", exchange -> {
String response = "Hello, Java 18!";
exchange.sendResponseHeaders(200, response.getBytes().length);
exchange.getResponseBody().write(response.getBytes());
exchange.close();
});
// ์๋ฒ ์์
server.start();
System.out.println("Server started at http://localhost:8080");
}
}
2. Code Snippets in JavaDoc (JEP 413)
/**
* ์ด ํด๋์ค๋ Java 18์ JavaDoc ์ฝ๋ ์ค๋ํซ ๊ธฐ๋ฅ์ ๋ณด์ฌ์ค๋๋ค.
* {@snippet :
* // JavaDoc์ ์ฝ๋ ์์ ์ฝ์
* System.out.println("Hello, JavaDoc Snippets!");
* }
*/
public class JavadocSnippetExample {
public static void main(String[] args) {
System.out.println("Hello, Java 18!");
}
}
Java 19 (2022๋ ์ถ์)
Java 19๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์คํ์ ์ผ๋ก ๋์ ํ์ต๋๋ค.
- Virtual Threads (๋ฏธ๋ฆฌ๋ณด๊ธฐ): Java์ ๋์์ฑ ๋ชจ๋ธ์ ๊ฐ์ ํ์ฌ ๋ ๋ง์ ์ค๋ ๋๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ์ง์.
- Structured Concurrency (๋ฏธ๋ฆฌ๋ณด๊ธฐ): ์ฌ๋ฌ ์ค๋ ๋ ์์ ์ ๊ตฌ์กฐํํ์ฌ ์ฒ๋ฆฌํ๋ API.
Java 20 (2023๋ ์ถ์)
Java 20์์๋ ์ฃผ๋ก ์ด์ ์ ๋์ ๋ ๊ธฐ๋ฅ์ ํ์ฅํ๊ฑฐ๋ ์คํ์ ๊ธฐ๋ฅ๋ค์ ๊ฐ์ ํ์ต๋๋ค.
- Virtual Threads (ํ์ฅ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ): ๊ฐ๋ฒผ์ด ์ค๋ ๋๋ก ์ฑ๋ฅ ์ต์ ํ ๋ฐ ๊ฐ์ .
- Pattern Matching for switch (ํ์ฅ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ): switch ๋ฌธ์์ ๋ ๊ฐ๋ ฅํ ํจํด ๋งค์นญ ๊ฐ๋ฅ.
Java 21 (2023๋ ์ถ์, LTS)
Java 21์ ์๋ก์ด LTS ๋ฒ์ ์ผ๋ก ์ฅ๊ธฐ์ ์ผ๋ก ์ง์๋๋ฉฐ, ๋ง์ ์ฃผ์ ๊ธฐ๋ฅ์ ์ ์์ผ๋ก ๋์ ํ์ต๋๋ค.
- Virtual Threads (์ ์): ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์ฝ๊ฒ ํ ์ ์๋๋ก ๋๋ ๊ฐ๋ฒผ์ด ์ค๋ ๋ ๊ธฐ๋ฅ์ด ์ ์์ผ๋ก ์ถ๊ฐ๋จ.
- Pattern Matching for switch (์ ์): switch ๋ฌธ์์ ๋ ๋ณต์กํ ํจํด ๋งค์นญ์ด ๊ฐ๋ฅํ๊ฒ ๋์์.
- Record Patterns (์ ์): record์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ํจํด ๋งค์นญ ์ง์.
- Sequenced Collections: ์์๋ฅผ ๋ณด์ฅํ๋ ์๋ก์ด ์ปฌ๋ ์ ์ธํฐํ์ด์ค ๋์ .
1. Virtual Threads (๊ฐ์ ์ค๋ ๋) - ์ ์ ๊ธฐ๋ฅ
public class VirtualThreadExample {
public static void main(String[] args) throws InterruptedException {
// ๊ฐ์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ExecutorService ์์ฑ
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i < 10; i++) {
executor.submit(() -> {
System.out.println("Running on virtual thread: " + Thread.currentThread());
});
}
}
}
}
2. Pattern Matching for switch - ์ ์ ๊ธฐ๋ฅ
public class PatternMatchingSwitchExample {
public static void main(String[] args) {
Object obj = "Java 21";
// ํจํด ๋งค์นญ์ ์ฌ์ฉํ๋ switch ํํ์
String result = switch (obj) {
case Integer i -> "Integer: " + i;
case String s -> "String: " + s.toUpperCase();
case null -> "Null value";
default -> "Unknown type";
};
System.out.println(result); // ์ถ๋ ฅ: String: JAVA 21
}
}
3. Sequenced Collections
public class SequencedCollectionExample {
public static void main(String[] args) {
SequencedCollection<String> sequencedList = new LinkedList<>();
sequencedList.addFirst("First");
sequencedList.addLast("Last");
System.out.println("First element: " + sequencedList.getFirst());
System.out.println("Last element: " + sequencedList.getLast());
}
}
4. String Templates - ํ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ
public class StringTemplateExample {
public static void main(String[] args) {
int age = 25;
String name = "Alice";
// ๋ฌธ์์ด ํ
ํ๋ฆฟ์ ์ฌ์ฉํ ๊ฐ๊ฒฐํ ํํ
String result = STR."Hello, \{name}! You are \{age} years old.";
System.out.println(result); // ์ถ๋ ฅ: Hello, Alice! You are 25 years old.
}
}
5. Unnamed Classes and Instance Main Methods - ํ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ
public class MainExample {
void main() {
System.out.println("Instance Main Method");
}
public static void main(String[] args) {
new MainExample().main(); // ์ถ๋ ฅ: Instance Main Method
}
}
6. Foreign Function & Memory API - ์ ์ ๊ธฐ๋ฅ
public class ForeignFunctionMemoryExample {
public static void main(String[] args) {
try (MemorySegment segment = MemorySegment.allocateNative(JAVA_INT)) {
segment.set(JAVA_INT, 0, 42);
int value = segment.get(JAVA_INT, 0);
System.out.println("Value from native memory: " + value); // ์ถ๋ ฅ: 42
}
}
}
๊ฒฐ๋ก
- Java 8: ๋๋ค, ์คํธ๋ฆผ API, ์๋ก์ด ๋ ์ง ๋ฐ ์๊ฐ API ๋ฑ.
- Java 9~10: ๋ชจ๋ ์์คํ ๊ณผ var ํ์ ์ถ๋ก ๋ฑ.
- Java 11: LTS ๋ฒ์ ์ผ๋ก HTTP ํด๋ผ์ด์ธํธ API์ ์๋ก์ด String ๋ฉ์๋.
- Java 12~15: Switch ํํ์, ํ ์คํธ ๋ธ๋ก, ํจํด ๋งค์นญ ๋ฑ์ ์คํ์ ๊ธฐ๋ฅ.
- Java 16~17: Record์ Sealed ํด๋์ค ์ ์ ๋์ , ํจํด ๋งค์นญ ๊ธฐ๋ฅ ๊ฐํ.
- Java 18~21: Virtual Threads, Pattern Matching for switch ๋ฑ์ ๋์์ฑ ๋ฐ ํจํด ๋งค์นญ ๊ธฐ๋ฅ ๊ฐ์ .
๊ฐ ๋ฒ์ ๋ง๋ค Java ์ธ์ด์ ๋ฐํ์์ ์ค์ํ ๊ฐ์ ์ฌํญ๋ค์ด ๋์ ๋์์ผ๋ฉฐ, ํนํ Java 8, 11, 17, 21์ LTS ๋ฒ์ ์ผ๋ก ์ฅ๊ธฐ์ ์ธ ์ง์์ ์ ๊ณตํฉ๋๋ค.
'๐บ Develop > โ๏ธ JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JAVA (JDK, JRE, JVM ์ฐจ์ด์ ) (0) | 2024.10.18 |
---|
- Total
- Today
- Yesterday
- ๋์์ธํจํด ์ฅ์
- git user.gmail
- ๋งฅ ์ฑ ์ถ์ฒ
- ๋์์ธํจํด ์ฅ๋จ์
- ๊ฐ์ฒด์งํฅ์ค๊ณ solid
- git gmail
- ๊ฐ์ฒด ์งํฅ ์ค๊ณ ์์น
- git name
- ๋งฅ๋ฆฐ์ด ์ฑ ์ถ์ฒ
- ๋์์ธํจํด ๋จ์
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |