원문 - Java version and features
Java 버전별 차이점을 이해하고, Java 언어를 이해해보자.
내가 알고싶은 내용에 살을 붙여서 써놓음. 보다 풍부한 내용은 원문을 보러가자.
틀린 내용에 대해서는 댓글로 사랑을 쏴주자.

Java는 6개월마다 업데이트 된다.
jdk-{5-20}.zip 파일의 압축을 풀기만 하면 된다./bin 디렉토리를 PATH 변수에 넣는다.java 명령어를 어느 위치에서든 호출할 수 있다. java -version을 실행하면 버전이 출력된다.Java 8의 모든 기능은 매우 우수한 Java 기본 지식으로 사용되며 다른 모든 버전(Java 9-20)은 해당 기준에 추가되는 추가 기능이다.
Runnable runnable = new Runnable(){
@Override
public void run(){
System.out.println("Hello world !");
}
};
lambda를 사용하면 동일 코드를 다음과 같이 표현할 수 있다.
Runnable runnable = () -> System.out.println("Hello world two!");
List<String> list = Arrays.asList("franz", "ferdinand", "fiel", "vom", "pferd");
list.stream()
.filter(name -> name.startsWith("f"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
of)가 있다.List<String> list = List.of("one", "two", "three");
Set<String> set = Set.of("one", "two", "three");
Map<String, String> map = Map.of("foo", "one", "bar", "two");
Stream<String> stream = Stream.iterate("", s -> s + "s")
.takeWhile(s -> s.length() < 10);
takeWhile()false가 등장한 위치부터 반복을 중단할 수 있기 때문에 크기가 큰 Stream의 경우 많은 시간을 절약할 수 있다.List<Integer> takeWhileList = numbers.stream()
.takeWhile(i -> i < 50)
.collect(toList()); // 12, 17, 29, 35, 41, 44
dropWhile()takeWhile의 정반대 작업으로 처음으로 false가 등장하는 시점까지의 요소를 모두 버리고 남은 요소를 반환한다.List<Integer> dropWhileList = numbers.stream()
.dropWhile(i -> i < 50)
.collect(toList()); // 50, 66, 72, 80
iterate()iterate() 메서드를 overload한 신규 메소드3-1. Java 8의 iterate()
int sum = Stream.iterate(0, i -> i + 1)
.filter(i -> i % 2 == 1)
.limit(5)
.mapToInt(Integer::intValue)
.sum();
System.out.println("합: " + sum); // 합: 25
iterate()는 조심스럽게 사용하지 않으면 무한 스트림을 만들어낼 수 있었기에 개발자들에게 많은 사랑을 받지 못한 듯3-2. Java 9의 iterate()
iterate() 메서드가 Stream 클래스에 추가되었다.int sum = Stream.iterate(0, i -> i < 10, i -> i + 1)
.filter(i -> i % 2 == 1)
.mapToInt(Integer::intValue)
.sum();
System.out.println("합: " + sum); // 합: 25
ifPresentOrElse 메소드는 기존의 ifPresent() 메서드와 이름이 유사하다.ifPresent()메서드는 Optional 객체가 값을 담고 있을 때 처리할 내용만 정의했다면, ifPresentOrElse() 메서드는 그와 더불어, Optional 객체가 비어있을 경우 처리할 내용까지 정의한다. user.ifPresentOrElse(this::displayAccount, this::displayLogin);
public interface MyInterface {
private static void myPrivateMethod(){
System.out.println("Yay, I am private!");
}
}
try(..)에서 선언된 객체들에 대해서 try가 종료될 때 자동으로 자원을 해제해주는 기능이다.try (BufferedReader br = new BufferedReader(new FileReader("C:\\number.txt"))) {
String str;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
1-1. Java 7 TWR
try에서 객체를 생성하고, try 안의 코드에서 Exception이 발생하는 경우 모든 코드가 실행되지 않을 수 있으므로 fianlly에서 close() 코드를 넣어주고...try(...)안에 객체 선언 및 할당을 해주면 try 문에서 사용할 수 있다.try 문을 벗어나면 TWR는 선언된 객체에 대한 close() 메소드를 호출한다.close()를 호출해줄 필요가 없다. close()를 호출해주지는 않고, AutoCloseble을 구현한 객체만 close()가 호출된다.1-2. Java 9 TWR
try 밖에서 하면 그 변수를 가지고 바로 try 문 안에서 바로 사용할 수는 없었다.try 안에서 새로운 변수를 선언하여 사용해야 했다. BufferedReader brs = new BufferedReader(new FileReader("C:\\number.txt"));
try (BufferedReader br = brs) {
String str;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader br = new BufferedReader(new FileReader("C:\\number.txt"));
BufferedReader br2 = new BufferedReader(new FileReader("C:\\abc.txt"));
try (br; br2) {
String str;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
while ((str = br2.readLine()) != null) {
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
Function<Integer, Integer> function = new Function<>() {
@Override
public Integer apply(Integer input) {
return input * 3;
}
};
% jshell
| Welcome to JShell -- Version 9
| For an introduction type: /help intro
jshell> int x = 10
x ==> 10
var은 변수를 선언할 때 타입을 생략할 수 있으며, Complier가 타입을 추론한다.var string = "Hello, World";
"Marco".isBlank();
"Mar\nco".lines();
"Marco ".strip();
Path path = Files.writeString(Files.createTempFile("helloworld", ".txt"), "Hi, my name is!");
String s = Files.readString(path);
1-1. isBlank()
1-2. strip()
stripLeading(): 문자열 앞의 공백을 제거한다.
stripTrailing(): 문자열 뒤의 공백을 제거한다.
trim()은 U+0020 이하의 값만을 공백으로 인식하여 제거(tab, CR, LF, 공백)하여 유니코드에서의 다양한 공백 문자를 처리할 수 없었다. Java 11 부터는 strip()으로 편하게 처리하고 성능도 수 배 빨라졌다.1-3. lines()
1-4. repeat(n)
String str = "ABC";
String repeated = str.repeat(3); // "ABCABCABC"
2-1. Path writeString(Path, String, Charset, OpenOption)
2-2. String readString(Path, Charset)
2-3. boolean isSameFile(Path, Path)
~$ java MyScript.java
@Nullable 등의 어노테이션을 사용하기 위해 타입을 명시해야 할 때(var firstName, var lastName) -> firstName + lastName
boolean result = switch (status) {
case SUBSCRIBER -> true;
case FREE_TRIAL -> false;
default -> throw new IllegalArgumentException("something is murky!");
};
String htmlBeforeJava13 = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
String htmlWithJava13 = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
default -> {
String s = day.toString();
int result = s.length();
yield result;
}
};
final class Point {
public final int x;
public final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
// 레코드를 사용하면?
record Point(int x, int y) { }
author.age = 35;
---
Exception in thread "main" java.lang.NullPointerException:
Cannot assign field "age" because "author" is null
instanceof 연산자 다음에 cast를 사용하여 작업을 수행해야 했다.if (animal instanceof Cat) {
Cat cat = (Cat) animal;
cat.meow();
// other cat operations
}
instanceof 연산자를 제공한다.if (obj instanceof String s) {
System.out.println(s.contains("hello"));
}
String text = """
Lorem ipsum dolor sit amet, consectetur adipiscing \
elit, sed do eiusmod tempor incididunt ut labore \
et dolore magna aliqua.\
""";
public abstract sealed class Shape
permits Circle, Rectangle, Square {...}
if (obj instanceof String s) {
// Let pattern matching do the work!
// ... s.substring(1)
}
socket.connect(UnixDomainSocketAddress.of(
"/var/run/postgresql/.s.PGSQL.5432"));
public String test(Object obj) {
return switch(obj) {
case Integer i -> "An integer";
case String s -> "A string";
case Cat c -> "A Cat";
default -> "I don't know what it is";
};
}
outside native finction을 호출하고 JVM의 메모리에 액세스할 수 있다.jwebserver
잘 보고 갑니다. 감사합니다!