JAVA

[Java] Java 1.8을 왜 많이 쓸까?

포포015 2023. 6. 11. 14:20

1. Java 1.8을 왜 많이 쓸까?

    - 1. 지원 버전 
    - 2. Java 버전에 맞는 JDK 이름 

2. Java 1.8에 생긴 큰 변화

  • 1. 함수형 인터페이스
    -1.1 왜 나왔을까?
  • 2. 디폴트 메소드
    -2.1 왜 나왔을까?
  • 3. 람다식
    -3.1 왜 나왔을까?
  • 4. 스트림
    - 4.1 왜 나왔을까?
  • 5. 옵셔널
    - 5.1 왜 나왔을까?

1. Java 1.8을 왜 많이 쓸까?

1.1 지원 버전

Java 1.8버전은 2014년에 등장했다. (거의 10년전에 나왔네..) 

1.8 버전에서 새로운 개념들이 많이 생기기도 했고, 오라클사에서 오랫동안 지원해준다고 발표했기때문이다. (2030년도까지)

요즘 많이 사용하는 1.8 , 11 , 17 버전 통틀어서 제일 오래전에 나온 1.8 버전이 제일 오랫동안 지원을 받을수 있다.

JDK Version 지원 기간
1.8 2030.12
11 2026.9
17 2029.9

(https://www.oracle.com/java/technologies/java-se-support-roadmap.html)

* 지원이 끝날경우 기존 시스템들이 사용을 못하는건 아니지만, 보안이슈나 호환성 새로운 기능 등 업데이트를 시켜주지 않는다.

 

1.2 Java 버전에 맞는 JDK이름 

원래는 Java SE 1.1, Java SE 1.2 같은 이름이였고 java 5부터 숫자로 붙여진다.
java SE 8 까지는 JDK 버전을 찍으면 JDK 1.8.x.x로 찍히는데 9버전부터는 그냥 JDK 9.x.x로 나온다.
따라서 Java 8 까지는 JDK1.8이라고 쓰지만, 9 이상은 JDK 9 로 쓴다.

JDK Version

 

2. Java 1.8에 생긴 큰 변화

Java 1.8에 생긴 큰 변화들은 내가 생각하기엔 람다,스트림,옵셔널 이 큰 변화라 생각하는데, 일단 1.8에 큰 변화들을 하나씩 살펴보겠다. 

 

2.1 함수형 인터페이스

- 함수형 인터페이스란 함수형 프로그래밍을 자바에 도입하기 위한 중요한 기능이다.(기존의 자바는 객체지향 프로그래밍을 강조하는 언어)

- 함수형 인터페이스는 단일 추상 메서드를 가진 인터페이스를 말한다.(람다 표현식이나, 메서드 참조를 사용해 인스턴스화 가능)

- Java 1.8에서 'java.util.function' 패키지가 도입되었고, 해당 패키지에 다양한 종류의 함수형 인터페이스가 포함되어 있다.

 

함수형 인터페이스에 대해 좀 더 자세한 내용은 아래 링크를 확인하자

-- Link

java.util.function

2.2 디폴트 메소드  

디폴트 메소드는 일반적으로 인터페이스에 정의해서 사용한다.
인터페이스에는 추상 메소드만 정의할 수 있고 해당 인터페이스를 상속받아 구현한다.

 

2.2.1 왜 나왔을까?

"하위호환성"을 위해 나왔다.

인터페이스에는 기능에 대한것만 정의할 수 있으므로, 해당 인터페이스를 상속받아 구현해야한다.
default 키워드의 경우 기존에 상속받은 클래스에 영향을 주지않으니, 인터페이스를 확장 시킬수 있다.

 

간단한 예시로 아래와 같은 코드가 있다고 가정해보자.

아래와 같은 인터페이스는 내가 오픈소스로 만들어서 많은 사람들이 사용을 하고 있다는 가정이다. 

 

근데 갑자기 어떠한 상황으로 인해, 기능을 추가해야한다.

이럴경우 해당 기능을 상속받는 구현체들이 전부 컴파일 에러가 발생한다. (모든 오픈소스를 받아 사용하던 사용자들이 에러가 나겠지..?)

이럴경우 사용하는게 default 키워드 이다.

 

해당 코드를 default 키워드를 사용해 변경해보자.

아래와 같이 변경되었다.

디폴트 메소드로 정의된 기능은 기존 소스에 영향을 주지않는다. 

실무에서 개발을 하며 default 메소드를 사용한적은 거의 없던거 같은데, 

공통 인터페이스를 확장 시킬경우에 사용하면 유용할거 같다.

3. 람다식 

람다식은 자바 함수형 프로그래밍 지원을 위해 등장했다.

간결하고 효율적인 함수형 프로그래밍을 가능하게 하며, 코드의 가독성을 향상 시킨다.

일반적으로 함수형 인터페이스와 람다식을 함께 사용한다.

 

3.1.1 왜 나왔을까?

간단한 예시이다.

아래 코드는 스레드의 Job을 실행시키는것이다.

Runnable 인터페이스에서 정의된 run의 메소드를 익명 클래스를 사용해 구현체를 생성해서 실행했다.

아래와 같이 개발해도 문제는 없지만.. 일단 가독성이 너무 안좋아서 너무 불편하다..

 

아래 코드는 람다식을 사용해 동일한 Runnable 의 메소드 run을 실행시켰다.

 

일단 너무 가독성이 매우 좋아졌고, 사실 람다식 하나로 장점을 누릴만한건 가독성 하나뿐이지만,

밑에서 추가로 설명할 함수형인터페이스&스트림&람다식 의 조합이 매우 큰 장점이다. 

밑에서 추가적으로 살펴보자.

 

 

4. 스트림

자바 8에서 추가된 스트림(Streams)은 컬렉션, 배열 등에 저장된 요소들을 하나씩 참조하면서 코드를 실행할 수 있는 기능이다.

Stream을 사용하면, 불필요한 for문을 사용하지 않을 수 있고, 람다식을 활용할 수 있어서 코드를 직관적이게 처리할 수 있다.

 

스트림은 기본적으로 스트림을 생성 -> 중간연산 -> 최종 연산 와 같은 형식으로 구현한다. 

4.1.1 왜 나왔을까?

이런 요구사항이 있다고 해보자.

 - N마리의 강아지들이 있다. 그 중 강아지 종류가 "푸들"인 강아지들을 찾고, 나이 순 정렬해서 노출 시켜라.

 

아래 코드는 스트림을 사용하지 않고, 작성한 코드이다.

 

아래 코드는 스트림을 사용했다.

스트림에는 스트림생성 -> 중간연산 -> 최종연산 을 사용해 한번에 푸들 종류의 강아지를 뽑아냈다.

빌더 패턴과 같이 한번에 연산을 해 뽑아낼수 있고, 훨씬 가독성이 좋으며 스트림에서는 병렬처리도 지원한다.

무엇보다 편하다....

 

스트림에 대한 내용은 깊어서 더 자세한 내용은 아래 링크에 정리해두었다.

-- Link  

 

 

 

5. 옵셔널

Java 1.8에 나온 Optional 클래스는 null 값을 안전하게 처리할수 있도록 도와준다.
Spring Data JPA를 사용할경우 기본적으로 제공하는 findById의 경우 Optional로 반환해준다. (이땐 그냥 당연하게 썼었지..)

저자의 경우, 옵셔널을 많이 쓰지 않았는데.. 외부와 연동할경우 (외부 모듈, DB 엔티티 조회 시) 유용하게 사용할수 있을거 같다. 

 

5.1.1 왜 나왔을까?

null을 만든 Tony Hoare는 2009년 한 소프트웨어 컨퍼런스에서 null 참조를 만든 것은 10억 달러의 실수라고 했다.

그리고 수 많은 객체지향 책을보면 null을 사용하는건 안티패턴이 라고 한다.. (실무에서 개발할때 Null을 반환하던 내가 떠오른다..)

 

아래 코드는 Optional을 사용하지 않았을경우, 일단 조회해와서 null인지 체크하고 작업해야하는 불편함이 있다.

옵셔널에서 제공하는 메소드를 사용해,

데이터가 없을경우 예외를 날리고 있으니, 이후 로직은 엔티티가 있다는 가정하에 코드를 짤수 있어 편하다.

 

개인적으론 옵셔널을 잘 사용하는 방법을 몰라서 그런지 사용을 많이 안했었는데..

외부 연동의 경우 사용을 하면 Null을 직접 다루지 않아 좀 더 안전한 코드를 짤수 있을거 같다. 

 

 

 

 

'JAVA' 카테고리의 다른 글

[Java] Equlas 와 hascode를 재정의하는 이유  (0) 2022.05.28
[Java] 자료구조 List, Set, Map의 차이  (1) 2021.05.31
java 명명 표기법  (0) 2021.02.26