자바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 |