Language/Java

java8과 java11 차이점

JUNGKEUNG 2022. 5. 8. 18:23

자바8

인터페이스에서 디폴트 메소드와 정적 메소드를 포함

디폴트 메소드는 하위 구현 클래스에서 재정의가 가능하지만, 정적 메소드는 구현 클래스에서 재정의할 수 없다.

interface TestInterface {

    default String logic() {
        return "test";
    }

    static String logic2() {
        return "test2";
    }
}

 

람다 표현식

람다식은 메소드를 하나의 식으로 표현한 것을 말한다. 그리고 람다식은 함수의 이름이 없기 때문에 익명 함수라고 부르며, 메소드의 매개 변수로 전달되거나 메소드의 결과로 반환될 수 있는 특징이 있어서 함수를 변수로 다룰 수 있다는 장점이 있다.

람다식은 메소드를 식으로 나타낸 것이긴 하지만, 엄밀히 말하면 이 메소드를 가진 객체를 생성해 낸다는 사실을 기억해야 한다. 그래서 주로 함수형 인터페이스의 익명 객체를 대체하기 위해 람다식을 사용하며, 간결하고 부수 효과가 없는 코드를 만들어 낼 수 있게 된다.

// 외부 반복
for (String value: myCollection) { 
    System.out.println(value); 
}

// 내부 반복
myCollection.forEach(value -> System.out.println(value));

 

 

스트림

스트림은 람다식으로 요소 처리 내용만 전달할 뿐, 반복은 컬렉션 내부에서 일어난다. 따라서 개발자 입장에서 작성할 코드가 간결해진다.

 

스트림의 특징

  • 스트림 API의 특징에는 선언형, 조립할 수 있음, 병렬화가 있다.
  • 스트림은 연속된 요소, 중간 연산, 최종 연산으로 이루어진다.
  • 자바 컬렉션은 외부 반복, 스트림은 내부 반복을 사용한다.
  • 중간 연산은 파이프라인으로 구성되어 최종 연산에서 한 번에 처리된다. 이를 지연 계산된다고 한다.
  • 중간 연산은 Stream을 반환하고, 최종 연산은 스트림이 아닌 결과을 반환한다.
  • 중간 연산의 예시로는 map, filter, flatMap 가 있고, 최종 연산의 예시로는 count, foreach, collect가 있다.

Date and Time API 지원

Java 8부터 LocalDate, LocalTime, LocalDateTime 등의 라이브러리를 통해 기존보다 훨씬 쉽게 날짜 관련 로직을 작성할 수 있게 되었다.

// Java 8 이전 - 오늘 날짜 구하기
Calendar cal = Calendar.getInstance();
String format = "yyyy-MM-dd";
SimpleDateFormat sdf = new SimpleDateFormat(format);
String date = sdf.format(cal.getTime());
System.out.println(date);

// Java 8 이후 - 오늘 날짜 구하기
LocalDate now = LocalDate.now();
System.out.println(now);

Optional 지원

Optional을 통해 null에 대한 참조를 안전하게 할 수 있다. 이전에는 null이 아닌지 검사하기 위한 조건문을 수두룩하게 사용했다면, Java 8부터 Optional을 통해 NPE를 얻을 상황을 손 쉽게 처리할 수 있게 되었다.

public String logic() {
    User user = getUser();
    if (user != null) {
        Address address = user.getAddress();
        if (address != null) {
            String street = address.getStreet();
            if (street != null) {
                return street;
            }
        }
    }
    return "not specified";
}

// Java 8 이후
public String logic() {
    Optional<User> user = Optional.ofNullable(getUser());
    String result = user
      .map(User::getAddress)
      .map(Address::getStreet)
      .orElse("not specified");
    return result;
}

 

 

 

자바11

String 관련 메서드

- isBlank() : 문자열이 비어있거나 공백일 경우 true 반환

- lines() : 문자열을 줄 단위로 쪼개어 스트림 반환

- repeat(n) : 문자열에 대해 n번 반복하여 붙여 반환

 

 

람다에서 var 변수 사용 가능

람다는 타입을 스킵 할 수 있는데 이걸 사용하는 이유는 @Nullable 등의 어노테이션을 사용하기 위해 타입을 명시해야 할때. var를 사용하려면 괄호를 써야하며, 모든 파라미터에 사용해야 하고, 다른 타입과 혼용하거나 일부 스킵은 불가능함.

List<String> sampleList = Arrays.asList("Java", "Kotlin"); 
String resultString = sampleList.stream() 
.map((@Nonnull var x) -> x.toUpperCase()) 
.collect(Collectors.joining(", ")); 
assertThat(resultString).isEqualTo("JAVA, KOTLIN");

 

file 처리

  - writeString() : 파일에 문자열을 쓰고 경로로 반환

  - readString() : 파일 내용을 String으로 반환

  - isSameFile() : 서로 같은 파일을 바라보는지 확인. 같은 파일일 경우 true. 아니면 false

 

 

HTTP Clien

HTTP 클라이언트가 표준 기능이 되었다. (HTTP/1.1 과 HTTP/2을 지원헤요)전반적인 HTTP API의 성능이 향상 되었다.

 

자바 실행

javac를 통해 컴파일 하지 않고도, 바로 java 파일을 실행할 수 있게 되었다.

// Java 11 이전
$ javac HelloWorld.java
$ java Helloworld
Hello Java 8!

// Java 11 이후
$ java HelloWorld.java
Hello Java 11!

 

 

컬렉션 인터페이스에 새로운 메소드 추가

컬렉션의 toArray() 메소드를 오버 로딩하는 메소드가 추가되었고, 원하는 타입의 배열을 선택하여 반환할 수 있게 되었다.

List sampleList = Arrays.asList("Java", "Kotlin"); 
String[] sampleArray = sampleList.toArray(String[]::new); 
assertThat(sampleArray).containsExactly("Java", "Kotlin");

 

 

참고 자료


https://steady-coding.tistory.com/598

https://livenow14.tistory.com/81

 

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

자바에서 제공하는 함수형 인터페이스  (0) 2022.06.18
함수형 인터페이스와 람다 표현식 소개  (0) 2022.06.15
클래스 로더 시스템  (0) 2022.05.05
JVM 구조  (0) 2022.05.05
네이버 페이 (Naver Pay) 기능구현  (0) 2022.04.24