Java 버전별 특징 (1.7 ~ 13)

Sixhustle·2021년 10월 18일
0

Java

목록 보기
2/10

Java 7

1. ETC

  1. 2011.07.07 발표

2. switch문 인자로 String 허용

public String getTypeOfDayWithSwitchStatement(String dayOfWeekArg) {
     String typeOfDay;
     switch (dayOfWeekArg) {
         case "Monday":
             typeOfDay = "Start of work week";
             break;
         case "Tuesday":
         case "Wednesday":
         case "Thursday":
             typeOfDay = "Midweek";
             break;
         case "Friday":
             typeOfDay = "End of work week";
             break;
         case "Saturday":
         case "Sunday":
             typeOfDay = "Weekend";
             break;
         default:
             throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeekArg);
     }
     return typeOfDay;
}

3. 숫자 사이에 underscore 사용 가능

float pi1 = 3_.1415F;      // Invalid; 
float pi2 = 3._1415F;      // Invalid; 

long socialSecurityNumber1
  = 999_99_9999_L;         // Invalid; 

int x2 = 5_2;              // OK (decimal literal)
int x3 = 52_;              // Invalid; 
int x4 = 5_______2;        // OK (decimal literal)

int x5 = 0_x52;            // Invalid; 
int x6 = 0x_52;            // Invalid; 
int x7 = 0x5_2;            // OK (hexadecimal literal)
int x8 = 0x52_;            // Invalid; 

int x9 = 0_52;             // OK (octal literal)
int x10 = 05_2;            // OK (octal literal)
int x11 = 052_;            // Invalid; 

4. 타입 추론(Type Inference)

// 7 버전 이전
List<String> list = new ArrayList<String>();

// 7 버전 이후
List<String> list = new ArrayList<>();

Java 8 (LTS)

1. ETC

  1. 2014.03.18 발표
  2. CompletableFuture
  3. Repeating Annotation

2.Interface Default Method

interface DefaultInterface {   
   
   public void something();
   
   default void show() {
      ...      
   }
}

3. Lambda

3-1. 기존

interface Movable {
   void move(String param);
}

class Car implements Movable {
   @Override
   public void move(String param) {
      ...
   }
}

Moveable movable = new Movable() {
   @Override
   public void move(String param) {
      ...
   }
}

3-2. Lambda식

아래와 같이 람다 표현식으로 구현하기 위해서는 추상 method가 1개여야만한다.
@FunctionalInterface는 추상 method가 1개임을 나타내는 것이고, 추상 method가 1개가 아닐 경우 compile error가 발생한다.

@FunctionalInterface
interface Moveable {
   void move(String param);
}

Moveable moveable = (param) -> {
   ...
}

Moveable moveable = param -> ...;

4. Optional

null이 될 수도 있는 객체를 감싸고 있는 wrapper class입니다.
NPE(NullPointerException)을 예방할 수 있습니다.

methoddesc
get()객체 반환. 비어있으면 NoSuchElementException
orElse(T other)객체가 비어있으면 other 반환
orElseGet(Supplier<? extends T> other)객체가 비어있는 경우에만 함수가 호출되기 때문에 orElse 대비 성능상 이점을 기대할 수 있음
orElseThrow(Supplier<? extends X> exceptionSupplier)비어있는 객체에 대해 예외를 던짐
@Getter
public class Computer {
   private Speaker speaker;   
}

@Getter
public class Speaker {
   private String name;
}

// computer의 speaker가 null이면 NPE발생
String speakerName = computer.getSpeaker().getName();

// null 체크
if(computer != null && computer.getSpeaker() != null ...) {
   ...
}

// optional
String speakerName = Optional.ofNullable(computer)
   .map(Computer::getSpeaker)
   .map(Speaker::getName)
   .orElse("none");

5. 다양한 DateTime 추가

추가된 APIDesc
java.time.LocalDate날짜. 타임존 사용 X
java.time.LocalTime시간. 타임존 사용 X
java.time.LocalDateTime날짜 및 시간. 타임존 사용 X
java.time.ZonedDateTime날짜 및 시간. 타임존 사용 O
java.time.DateTimeFormatterjava.time에 대한 형식
java.time.Duration시간을 초/나노초 단위로 측정
java.time.Period시간을 년/월/일 단위로 측정
java.time.TemporalAdjuster날짜 조정

5-1. 날짜 출력

LocalDate date = LocalDate.now();				// 오늘 날짜
LocalDate date = LocalDate.of(2021, 12, 23);	// 2021-12-23
LocalDate date = LocalDate.parse("2021-12-23"); // 2021-12-23

5-2. 날짜 증감

LocalDateTime datetime = LocalDateTime.of(2021, 12, 23, 0, 0, 0);
datetime.plusMonths(1);
datetime.plusWeeks(1);
datetime.plusDays(1);
datetime.plusHours(1);
datetime.minusMinutes(1);

6. Permanent Area 제거 (좀 더 공부 필요)

Peramanent Heap 영역이 제거되고, Metasapce Native Memory 영역이 추가되었다.

6-1. Permanent Generation

  1. Heap 영역(JVM에서 관리)
  2. Class metadata(클래스 이름, 생성정보, 필드정보, 메소드 정보 등) 저장하는 곳
  3. 제한된 크기를 가지고 있어 메모리 누수의 원인(?)이 되었던 듯?!

6-2. Metaspace

  1. Native Memory(OS에서 관리)
  2. 크기가 자동으로 증가

7. Stream API

collection, array등 요소들을 하나씩 참조하며 반복처리하는 기능으로 3단계를 거쳐 동작합니다.
1. stream 생성
2. stream 중개 연산(변환, 가공)
3. stream 최종 연산

중개 연산Desc
filter주어진 조건에 맞는 요소만 새로운 stream 반환
distinct중복된 요소가 제거된 새로운 stream 반환. 내부적으로 equals() 사용
map특정 값으로 변환
flatMapstream요소가 배열일 경우, 각 요소를 함수로 전달하여 반환값으로 이뤄진 새로운 stream 반환
limit첫 번째 요소부터 n개만큼 새로운 stream 반환
skip첫 번째 요소부터 n개만큼 제외하고 새로운 stream 반환
sorted,,,
List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4);
Stream<Integer> stream = list.stream().distinct(); // 1, 2, 3, 4
Stream<Integer> stream = list.stream().filter(num -> num % 2 == 0); // 2, 4, 4

List<String> list = Arrays.asList("Java", "Kotlin", "Scala");
Stream<Integer> stream = list.stream().map(String::length); // 4, 6, 5
Stream<String> stream = list.stream().map(String::upperCase); // JAVA, KOTLIN, SCALA

List<String> list = Arrays.asList("Java", "C", "Python");
list.stream().sorted().collect(Collectors.toList());
list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());

Java 9

1. ETC

  1. 2017.09.21 발표
  2. G1 GC 적용
  3. JShell 추가

2. Jigsaw

Gradle, Maven과 같은 Module시스템으로 Application에서 필요한 Module만 명시할 수 있게 되었다.

3. interface내 private method 사용 가능

public interface Interface {
   private void method() {
      ...
   }
   private static void method() {
      ...
   }
}

Java 10

1. ETC

  1. 2018.03.20 발표
  2. GG interface 도입
  3. 최상위 인증 기관 CA의 기본 세트를 제공

2. var 추가

타입추론 변수. 컴파일러가 타입 추론

var list = new ArrayList<String>();   // ArrayList<String>
var numbers = List.of(1, 2, 3, 4, 5); // List<Integer>

3. Parallel Full GC for G1

Java 9의 Concurrent collector가 parallel collector보다 full GC속도가 느림.
따라서 Java 10부터 single thread기반 full gc를 parallel full gc로 변경

4. Thread-Local Handshakes

GC동작으로 인해 stop-the-world(GC thread 외 모든 thread가 멈춤)가 발생하는데,
모든 thread가 동시에 멈추지 않고, 개별로 멈출 수 있게 되었다.


Java 11 (LTS)

1. ETC

  1. 2018.09.25 발표
  2. Oracle JDK 독점 기능이 OpenJDK 버전에 이식(완전 동일해짐을 뜻함)
  3. String method 추가
    1. strip() : 문자열 앞, 뒤 공백 제거
    2. stripLeading() : 문자열 앞의 공백 제거
    3. stripTrailing() : 문자열 뒤의 공백 제거
    4. isBlank()
    5. repeat(n) : 지정된 수 만큼 문자열 append하여 반환
  4. HTTP Client
  5. Lambda Local variable

2. ZGC

일시 중지 시간을 10ms 미만으로 유지. 대량의 메모리를 low-latency로 처리하기 위해 디자인 됨

3. Epsilon Grabage Collector

latency overhead를 줄이는 것이 목적


Java 12

1. ETC

  1. 2019.03.19 발표
  2. GC 개선 --> 뭘 개선했는지 찾아보기

2. switch 문 개선

switch(day) {
   case MONDAY:
   case FRIDAY:
   case SUNDAY:
      System.out.println(6);
      break;
   case TUESDAY:
      System.out.println(7);
      break;
   case THURSDAY:
   case SATURDAY:
      System.out.println(8);
      break;
   case WEDNESDAY:
      System.out.println(9);
      break;
}
switch (day) {
   case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
   case TUESDAY                -> System.out.println(7);
   case THURSDAY, SATURDAY     -> System.out.println(8);
   case WEDNESDAY              -> System.out.println(9);
}

JDK 13

1. ETC

  1. 2019.09.17 발표
  2. switch yield 예약어 추가

2. Text block

줄바꿈 문자가 자동으로 포함됩니다.

String str = """
   This
   is
   text block
""";

References

Java 1.7

Java 1.8

Java 9

Java 10

Java 11

Java 13

0개의 댓글