Java8이 출시하고 많은 변화를 겪었다고 하여 Java8을 기준으로 전 후를 알아보고 싶었다.
- Lambda expression(람다 표현식)
- Functional interface(함수형 인터페이스)
- Default method(디폴트 메서드)
- Stream(스트림)
- Optional(옵셔널)
- 새롭게 추가된 날짜 API
- CompletableFuture(컴플리터블 퓨처)
- JVM의 변화
1. lambda 표현식
Java8때 출시한 lambda 표현식에 대해서 먼저 알아봤다.
lambda가 탄생하게된 목적이 무엇일까? lambda 표현식이란 하나의 메소드를 하나의 식으로 표현한것이다.
처음엔 저 한 문장이 이해가 안갔다. Java8이전에 있었던 '익명함수'라는 놈을 살펴보면 익명함수란 함수에 이름을 붙이이 않고 바로 정의해서 사용하는 방법인데
Runnable oldWay = new Runnable() {
@Override
public void run() {
System.out.println("익명클래스 방식");
}
};
이렇게 구현체를 따로 생성하지 않고 인터페이스를 구현할 수 있었다. 하나의 함수인것이다. 또한 '일회용 함수'로서 유용했다.
익명함수의 존재와 목적을 알고나니 람다의 탄생과 목적이 조금이나마 이해가 갔다. 위의 코드에 나와있는것처럼 익명 내부클래스는 그 구성이 복잡해질수록 코드도 장황해져 함수처럼 간편하게 다루기가 힘들었다. 여기서 람다 표현식의 탄생이유가 이해되었다.
Runnable lambdaWay = () -> System.out.println("람다방식");
람다 표현식을 사용하면 익명 클래스보다 훨씬 간결하고 가독성이 뛰어나다.
1. 불필요한 반복코드 즉 보일러플레이트를 제거하고
2. 함수형 인터페이스(추상 메서드를 하나만 가지고 있음)를 구현하기에 메서드의 매개변수로도, 반환값으로도 바로 전달할 수 있다.
3. 또한 코드를 읽을때 어떤 일을 하는 함수라는게 한눈에 파악 가능하다.
람다 표현식을 조금씩 파헤쳐보며 새로안 사실이 있었다. 위에서도 기입했지만 함수형 인터페이스만 가능하다는것. 즉 메서드가 두 개 이상 있는 인터페이스에서는 쓸 수 없고 일반 클래스나 추상 클래스에서는 쓸 수 없다는 사실도 처음 알았다. 사실 공부하며 '아니 람다가 있으면 더 이상 익명함수는 필요가 없겠네? 익명 함수에서 발전된거니까...?' 라고 느끼고 있었는데 람다 표현식을 쓸 수 없는 상황에는 익명함수로 쓸 수 있다는게 재밌었다. 더불어 익명함수에는 제약이 없다는것, 인터페이스 구현도 되고, 추상 클래스 상속도 된다는것 = "람다가 쓰지 못하는 곳에서는 언제나 익명 내부 클래스로 대체할 수 있다." 라는 것.
2. 함수형 인터페이스
자연스럽게 함수형 인터페이스로 넘어가서 함수형 인터페이스가 java8에 생겼나? 그건 아닌것같다. 정확히 말하자면 "추상 메서드가 하나인 인터페이스"는 만들 수 있었다. Java8부터 @FunctionalInterface 애너테이션을 통해 추상 메서드가 정확히 하나인지 컴파일러가 검증해주고, 람다 표현식과 스트림 API 같은 함수형 프로그래밍 요소들을 함수형 인터페이스 전용으로 정의 할 수 있게 지원해줬다. 여기서 java개발자가 사용자들의 니즈(?)를 반영하려하는 마음이 크게 느껴졌다. 역시 무언가 생기기 까지의 과정과 배경 및 목적을 알았을때 프로그래밍의 재미가 더해지는것같다. 정리해보면 함수형 인터페이스는 "추상메서드가 하나만 있는 인터페이스"인것이다.
3. 디폴트 메서드
충격이었다. 디폴트 메서드가 Java8에 도입된 기능이라니. 이것을 모르고 java17부터 온갖 편한 기능이 다 있는 상태속 공부를 하기 시작했던 나는 당연한줄 알았던 디폴트 메서드가 원래 처음부터 있다고 생각했었다. 결국 Java7까지는 인터페이스의 모든 메서드가 추상 메서드였다는게 아닌가. 그렇다면 새로운 기능을 추가할 때 기존 인터페이스를 구현하고 있는 구현체들은 반드시 메서드를 오버라이딩해야하는 상황이 발생하는데 어허.. 이러면 불편한점이 반드시 생겼었을것같다. default 메서드는 인터페이스에 default 키워드를 붙여 기존 구현체를 건드리지 않고도 인터페이스에 메서드를 추가할 수 있게 해준다.
'Programming > 자바(Java)' 카테고리의 다른 글
| 자바에서 가장 많이 호출되는것은 무엇일까 (0) | 2025.01.10 |
|---|---|
| 13-3 쓰레드의 구현과 실행 (0) | 2024.10.18 |
| 13-1 프로세스와 쓰레드 (0) | 2024.10.18 |
| 12-23 애너테이션이란? (2) | 2024.10.17 |
| 12-17 열거형 (0) | 2024.10.17 |