김동형수 개발기

[Java] Java 8의 새로운 기능 본문

이론정리

[Java] Java 8의 새로운 기능

김동형수 2020. 2. 19. 16:34

Intro

SI분에 몸담으면서 언어와 도구를 사용하기만 했지 한번도 '왜?'라는 의문을 갖은 기억이 없었습니다.

그래서 앞으로는 사용하는 것들에 대해서 '왜?, 어떻게? 뭐가다르지?'와 같은 의문을 품으면서 차곡차곡 이론을 정리해보자 합니다.

 

'기초적인 내용인데 이것도 모르냐?' 라고 물으실 수 있겠지만 '아는 척'보다는 '모르는 것을 인정하고 부족한 부분을 채우자'가 라는 마음가짐으로 임하고 있습니다.

언제나 지적이나 수정사항은 환영하며 댓글로 남겨주신 내용은 적극 반영하도록 하겠습니다. 그럼 시작합니다.

 

프로젝트를 하면서 jdk1.8버전으로 개발환경을 구성하며 사용하고 있습니다. 하지만 왜 쓰는지는 모르죠.

 

stream 기능이나 lambda는 의식적으로 사용하려고 하지만 퍼포먼스는 어떻고, 어떤 경우에 사용하면 좋고(Best practices) 등 이론의 부재가 상당하다고 생각합니다.


Overview

추가된 새로운 기능은 아래와 같습니다.

  • Functional 인터페이스
  • Lambda 표현식
  • Steam
  • Optional
  • Interface default, static method
  • 날짜 관련 클래스들 추가
  • 병렬 배열 정렬
  • StringJoiner

많은 기능이 추가되었네요. (면접때 여기서 절반만 말했어도..)

openJDK 가 13까지 릴리즈 되었는데 8의 기능 제대로 사용하지 못하는 점은 반성하고있습니다. (쥬륵)

 

그러면 나름 제 기준대로 분류해서 작성해보고자 합니다.

 

정리를 하다보니 내용이 많아서 나눠서 작성해보려고 합니다.


함수형 프로그래밍

우선은 함수형 프로그래밍 지원에 관해서 말해보고자 합니다.

아래의 목록을 Java 8에 도입하면서 Java에서도 함수형 프로그래밍이 가능해졌습니다.

  • Funtional 인터페이스
  • Lambda 표현식
  • Stream

Stream도 내용이 방대해서 다른 글에서 정리하도록 하겠습니다. 이번에는 Functional 인터페이스, Lambda 표현식 두가지에 대해서 살펴보겠습니다.

 

함수형 프로그래밍은 무엇을까요? (궁금궁금)

 

함수형 프로그래밍(functional programming)은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. ( 출처 : 위키백과 ) 

 

위키백과를 보니 함수형 프로그래밍의 비교 대상은 명령형 프로그래밍 인것 같습니다.

 

명령형 프로그래밍은 상태를 바꾸거나 변경하는 것을 강조하고 환경에 따라서 결과값이 다를 수 있지만 함수형 프로그래밍은 결과값이 인자값에 의존된다고 합니다.

 

계략적인 내용만 살펴보고 이제 Java 8의 에서 지원하는 내용에 대해서 살펴보도록 하겠습니다.

 


Functional 인터페이스

Javascript에서 함수를 선언한 변수(ex - 콜백함수)를 매개변수로 받고 싶다면 function func(blah, blah, callback) { ... } 과 같은 방식으로 선언한 뒤 호출시에 'callback' 위치에 매개변수를 함수로 넘겨준다면 함수를 매개변수로써 사용할 수 있습니다.

 

Java는 함수의 개념이 없었고 Java 8 이전에는 함수형 프로그래밍을 지원할 수 없었습니다.

 

그리고 행위(메소드)를 매개변수로 넘기려면 익명클래스와 디자인 패턴 중 하나 인 '템플릿 콜백 패턴'을 사용해서 행위를 매개변수로 넘길 수 있었습니다.

 

하지만, Java 8에서 Lambda 표현식을 제공하면서 행위를 매개변수로 넘기는 작업을 더욱 간결하게 수행할 수 있게 되었습니다.

 

Java 8에서 행위를 전달하는 매개변수의 자료형을 지정하는 것이 바로 'Functional 인터페이스' 인데요,

선언하는 방법은 인터페이스에서 단 하나의 메소드 원형이 있어야합니다. 2개 이상일 경우 조건을 만족하지 않습니다.

 

Functional 인터페이스를 작성하는데 실수로 2개이상의 메서드 원형을 선언했다면 해당 인터페이스가 Funtional 인터페이스를 위한 용도인지 아니면 다른 용도인지 판단할 수 없기 때문에 명시적으로 @FunctionalInterface 어노테이션으로 선언해준다면 2개이상의 메소드 원형을 선언했을 때 에러를 발생시킬 수 있다고 합니다.

 

요약하자면 선언하는데 제약조건이 있고 명시적으로 @FuntionalInterface를 선언하고 용도는 Lambda 표현식을 매개변수로 받기위한 자료형 이라고 하면 될 것 같습니다.

 

//정상
@FunctionalInterface
interface Func1 {
	int count();
}

//컴파일 에러
@FunctionalInterface
interface Func1 {
	int count();
	int count2();
}

Lambda 표현식

'Functional 인터페이스의 익명함수를 이용해서 인스턴스화 한다' 라고 생각하면 될 것 같습니다.

 

구성으로는 매개변수 선언 부분, 화살표 함수, 구현부( {} - 코드블럭은 2줄이상일 경우 )로 구성되어있습니다. 

(int a) /* 매개변수 */ -> /* 화살표 함수 */ return a * 2; /* 구현부 */

(int a, int b) /* 매개변수 */ -> /* 화살표 함수 */ {
	/* 구현부 */
	return (a + b) * 2; 
}

//Functional 인터페이스에 자료형이 명시되었기 때문에 자료형 추론 가능
(a) /* 매개변수 */ -> /* 화살표 함수 */ return a * 2; /* 구현부 */

 

Java 8에서는 Lambda 표현식과 Functional 인터페이스를 이용해서 함수형 프로그래밍으로 코딩을 할 수 있습니다.

 


Finish

Java 8에서 추가된 내용 중 함수형 프로그래밍에 관해서 정리를 해봤습니다. 알고 있는것과 내용을 정리하고 기록하는 것에 차이가 있다는 것을 다시 실감하며 조금 더 개념과 이론에 대해서 얻어갈 수 있었습니다.

 

intro에서 언급했듯이 오류나 지적사항은 양팔을 들고 버선발로 환영합니다.

 

다음엔 Stream 내용 정리를 해볼까합니다.


Reference

https://medium.com/inhyuck/java-8%EC%97%90-%EC%B6%94%EA%B0%80%EB%90%9C-%EA%B2%83%EB%93%A4-8c66023cbbae
https://junsday.tistory.com/37
https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
https://skyoo2003.github.io/post/2016/11/09/java8-lambda-expression
Comments