자바 9~16 코딩 관련 주요 변천사

doxxx·2022년 8월 3일
0

ETC

목록 보기
2/3
post-thumbnail

JDK 9

인터페이스에 private 메서드 추가

JDK 8 에서 인터페이스에 default 메서드와 static 메서드를 추가할 수 있게 되었다.

JDK 9 에서는 private 메서드를 정의할 수 있게 되었다.

public interface Client {

    void exchange();

    default void get() {
        logging2("before");
        exchange();
        logging("call get");
    }

    private void logging(String msg) {
        System.out.println(msg);
    }

    private void logging2(String msg) {
        System.out.println(msg);
    }
}

try-with-resource + 실질적인 final 변수

try() 안에 실질적으로 final 변수를 넣을 수 있게 되었다.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class TryWithResource {

    public static void main(String[] args) {
        BufferedReader br = Files.newBufferedReader(Paths.get("a.txt"));
        try (br) {
            String line = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

컬렉션 팩토리 메서드 추가

List<Integer> list = List.of(1,2,3);
Map<String, Integer> map = Map.of("k1", 1, "k2", 2);
Set<Integer> set = Set.of(1,2,3);

JDK8 까지는 가변인자를 이용하여 컬렉션을 만들려고 했으면 asList 등을 이용해야 했다.

Arrays 클래스에 compare와 mismatch 메서드 추가

int comp = Arrays.compare(a, b);

서로 같으면 0, a가 앞서면 음수, b가 앞서면 양수를 반환한다.

int firstIdx = Arrays.mismatch(a, b);

서로 달라지는 첫 index를 리턴하고, 서로 같으면 -1을 반환한다.

JDK 10

var

로컬 변수에 var를 이용하여 타입을 생략하고 값을 할당할 수 있다.

var a = 10; // a는 int 타입
var result = new ArrayList<Integer>(); // result는 ArrayList<Integer> 타입

필드나, 메서드의 매개변수에는 var를 사용할 수 없다.

JDK 11 에서는 람다식에서도 var를 사용할 수 있다.

JDK 11

String 클래스에 유용한 메서드들이 추가되었다.

  • isblank(): 공백문자만 포함했는지 여부
    • Character.isWhitespace(int)를 사용
  • lines(): new line 기준으로 각 문장이 Stream 으로 반환된다.
  • repeat(): String str = "1".repeat(10); 과 같이 사용하면 된다
  • strip(), stripLeading(), stripTrailing()
    • Character.isWhitespace(int)를 사용
    • trim()보다 더 넓은 범위의 공백을 제거 한다.

Files

  • Files.writeString()
    • Files.writeString(Path.of("a.txt"), "String", StandardOpenOption.CREATE);
  • Files.readString()
    • String str = Files.readString(Path.of("a.txt"));

기본 인코딩은 UTF-8이다.

JDK 12

String

  • indent(int n)
    • n 만큼 들여쓰기(또는 내어쓰기 - 음수)
  • <R> R transform(Function<? super String, ? extends R> f)
    • "20220804".transform(DateUtil::toLocalDate);

JDK 14

switch 식

class switchExample {

    public static void main(String[] args) {
        String grade = switch (mark) {
            case 90 -> "A";
            case 80 -> "B";
            case 70 -> "C";
            case 60 -> "D";
            default -> "F";
        };
    }
}

switch가 값을 만들 수 없었지만, JDK 14 이후 값을 만들 수 있게 되었다.

값을 만들어 낼 수 있게 되어서 위의 예시와 같이 변수에 지정할 수 있거나 return으로 반환할 수 있다. 하지만 값을 만드는 것이 필수가 되면서, default를 지정하게
되었다.

JDK 15

텍스트 블록

""" """ 를 사용하여 텍스트 블록을 작성할 수 있다.

희미한 줄이 IDE에 생기고, indent를 의미한다. \를 통하여 개행이 아닌 swap을 의미할 수 있다.

String 클래스

  • formatted()
    • String old = String.format("%s %s", "Hello", "World");
    • String v15 = "Hello %s".formatted("World");

코드가 좀 더 짧..? 간결해졌다.

NPE 메시지

System.out.println(name.getFirst().toUpperCase()); 라는 예시에서

NPE가 발생했다면, JDK 15에서는

java.lang.NullPointerException: Cannot invoke "String.toUpperCase()" because "name.getFirst()" is null
과 같이 어떤 위치에서 null이 발생했는지를 알려준다.

JDK 16

Stream

  • toList() 왜 이제나옴..?
    • .collect(Collectors.toList())를 대체할 수 있다.
  • mapMulti()
    • 값 하나로 여러개를 생성할 수 있다.

instanceof와 패턴 매칭

class instanceofExample {

    public static void main(String[] args) {
        if (a instanceof String s) { // s: 패턴 변수
            System.out.println(s); // String type a
        }

        if (a instanceof String t && t.isBlank()) { // t: 패턴 변수, 바로 사용
            System.out.println("blank");
        }

        if (!(a instanceof String b)) { // b: 패턴 변수
            return; // Early return
        }
        System.out.println(b.toUpperCase()); // Early return 블럭 이후 패턴 변수 사용
    }
}

record 클래스

record FullName(String first, String last) {

    public String formatter() {
        return first + " " + last;
    }
}

class recordExample {

    public static void main(String[] args) {
        FullName fn = new FullName("f", "l");
        fn.first();
        fn.last();
    }
}
  • first, last에 대하여
    • private final 필드이다
    • 파라미터를 가진 생성자
    • 같은 이름의 메서드(getter)
    • hashCode, equals, toString
  • 특징
    • 기본 생성자 없음
    • 값 변경 메서드 없음
    • final 클래스(추상 클래스 아님)
    • 다른 클래스 상속 불가

0개의 댓글