본문 바로가기
Coding/Java

[JAVA] 버전에 따른 주요 기능들 (SE8~SE20)

by Gofo 2024. 3. 27.

자바 버전이 변경됨에 따라 추가/변경된 주요 기능들을 담아봤다.

 


SE8 (2014)

Lambda, Method Reference

Lambda Method Reference
s -> s.getSample() Sample::getSample
() -> Thread.currentThread().dumpStack() Thread.currentThread()::dumpStack
(str, i) -> str.substring(i) String::substring
(String s) -> System.out.println(s) System.out::println

 

 

Interface Default Method

원래는 interface 내에는 메소드 정의만 가능하고 구현은 불가능 하였으나,

default method를 이용하면 메소드 구현을 할 수 있다.

public interface Example {
	public default voud doSomething() {
    	// ...
    }
}

 

 

다양한 Stream API 추가

데이터 컬렉션 반복 처리가 가능하다.

stream().forEach(), map(), filter() 등이 있다.

Stream API는 원본은 수정하지 않고 pararell하게 동작할 수 있다는 특징이 있다.

 

 


SE9

try-with-resource

try 괄호에 필요한 reosurce를 정의하면 finally 구문이 없이도 try/catch가 끝날 때 알아서 close 해준다.

try (자원 선언) {
    // ...
}
catch ( ... ) {
    // ...
}

 


SE10 (2018.3)

Local-variable type interface

변수 선언 시 타입을 지정하지 않고 <pre>var</pre> 로 선언하여 타입을 자동으로 추론할 수 있다.

단, 제한적인 경우로만 사용이 가능하다.

  • initializer와 함께 선언되는 로컬 변수
  • enhanced for-loop 내 index 변수
  • traditional for-loop 내 로컬 변수

 

var list = new ArrayList<String>();	//ArrayList<String> 으로 추론

var stream = list.stream();		//Stream<String> 으로 추론

var numbers = List.of(1, 2, 3, 4, 5);	//List<Integer> 으로 추론

for (var number : numbers){		//Integer 추론
	System.out.println(number);
}

 


SE11 (2018.9)

String 관련 메소드들 추가

  • <pre>strip()</pre> : 문자열 앞/뒤 공백 제거
  • <pre>stripLeading()</pre> : 문자열 앞의 공백 제거
  • <pre>stripTrailing()</pre> : 문자열 뒤의 공백 제거
  • <pre>isBlank()</pre> : 문자열이 비어있거나 공백인 경우 true 반환 -> null에 대해 접근하면 오류
  • <pre>lines()</pre> : 문자열을 라인 단위로 쪼개줌 -> Stream<String> 반환
  • <pre>repeat()</pre> : 지정된 수만큼 문자열을 반복 -> String 반환
  • <pre>transform(func)</pre> : 문자열에 func을 실행한 결과를 반환

 

Lamda에서도 var 사용 가능 

Lamda에서도 var를 사용할 수 있다.

 


SE12 (2019.3)

switch 문법 확장

  • 기존 : 같은 블락에 속하더라도 대해 처리하더라도 모든 케이스에 대해 <pre>case</pre>를 통해 각 케이스들을 명시해야한다.
  • 변경 후 : 여러 케이스를 콤마(,)를 통해 묶을 수 있고 <pre>-></pre>을 통해 바로 반환하거나 block을 만들 수 있다.
//기존 방식

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;
}


//Java SE 12 부터의 방식

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);
    }
}

 


SE13 (2019.9)

Switch문에 yield 예약어 추가

switch 문의 결과로 반환한다.

int a = switch (day) {
    case MONDAY, FRIDAY, SUNDAY:
        yield 6;
    case TUESDAY:
        yield 7;
};

 

Text block

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

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

 


SE14

Record 도입 (preview)

record 클래스가 추가되었다.

기본으로 생성자, getter, hashCode(), equals(), toString()을 제공해준다.

데이터 정합성을 보장하기 때문에 DTO를 대체하기에 적합하다.

 


SE17(2021.9)

RandomGenerator (난수 생성기)

여러 알고리즘을 이용한 난수를 생성하는 api가 추가되었다.

RandomGenerator gen = RandomGenerator.of("L128X256MixRandom");

 

참고 : https://www.baeldung.com/java-17-random-number-generators

 

 

Vector

ArrayList와 동일한 구조로,

내부에 값이 추가되면 자동으로 크기가 조절되고 그 다음 객체들은 한자리씩 뒤로 이동된다.

 

그러나 동기화된 메소드로 구성되어있어서 

멀티스레드가 동시에 이 메소드들을 실행할 수 없고 하나의 스레드가 실행을 완료해야만 다른 스레드들이 실행할 수 있다.

즉, 멀티 스레드 환경에서 안전하게 객체를 추가/삭제할 수 있다.

 

대신, 스레드가 1개일 때도 동기화를 하기 때문에 싱글 스레드일때는 arrayList보다 성능이 떨어진다.

 


SE 20

Switch문 개선

Pattern matching이 가능하며,

타입 뒤에 변수를 선언해주면 해당 타입일 경우에 대해서 해당 변수로 접근하여 메소드들을 사용할 수 있다.

switch (x) {
	case Integer i -> i + 1;
    case null -> 0d;
    case String s -> s.toUpperCase();
}

 


참고

 

 

 

 

'Coding > Java' 카테고리의 다른 글

[Java] 자바 동작 과정  (0) 2024.04.01
[JAVA] Collections framework (array, list, set...)  (0) 2021.02.19

댓글