Programming/자바(Java)

Java8에는 어떤것들이 바뀌었나?

먹보 개발자 2025. 5. 1. 18:41

Java8이 출시하고 많은 변화를 겪었다고 하여 Java8을 기준으로 전 후를 알아보고 싶었다.

  1. Lambda expression(람다 표현식)
  2. Functional interface(함수형 인터페이스)
  3. Default method(디폴트 메서드)
  4. Stream(스트림)
  5. Optional(옵셔널)
  6. 새롭게 추가된 날짜 API
  7. CompletableFuture(컴플리터블 퓨처)
  8. 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