"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

오늘이군

Java8 꼭 사용해야 하나요? 본문

삶../프로그래밍

Java8 꼭 사용해야 하나요?

오늘이군 2019. 1. 4. 14:14
반응형

Java는 안정적으로 변화해 왔습니다.
항상 하위 호환을 지키며 OOP에 대한 고민만 하면 될 것으로 보였습니다.

하지만 Java 버전이 8이 되면서 많은 변화가 생겼는데요, 한번 알아보겠습니다.

 

가장 큰 특성은 First Class Function 입니다.
function 자바에서는 method 인데요
method 를 일급값(First Class Citizen) 으로 사용 할 수 있다는 것입니다.

1. method 를 파라미터로 사용 할 수 있습니다.

2. method 를 리턴값으로 받을 수 있습니다.

 

3. method 를 Data Structure에 저장하거나 변수에 할당 할 수 있습니다.


두번째 Functional Interface 입니다.

Java Language Specification의 설명을 인용하면 다음과 같습니다.

A functional interface is an interface that has just one abstract method (aside from the methods of Object), and thus represents a single function contract.
단 하나의 추상 메소드만(*Object 메소드를 제외)을 가진 인터페이스로 단 하나의 기능적 *계약을 나타냅니다.

구현해야 할 추상메소드가 하나만 있기 때문에 
함수명을 생략하거나 자료형을 생략하는 (x, y) -> x+y 와 같은 형태의 Lambda Expression으로 표현이 가능해지는 것입니다.
람다식의 평가(evaluation) 결과가 FunctionalInterface의 인스턴스입니다.

모든 것이 장단점이 다 있는 만큼 Lambda Expression 도 너무 남발을 하면 안되겠습니다., 
중복되는 코드가 많이 발생할 수 있고 디버깅이 어려울수 있는 단점이 있기 때문에
3줄 이하의 간단한 로직이거나 이것이 문제가 발생할 수 없다라는 확신이 있을 때만 사용하는 것이 좋겠습니다.

신규 작성한 인터페이스를 Functional Interface로 제한하고 싶은 경우 @FunctionalInterface 어노테이션을 지정하면
두 개의 추상 메소드를 넣은 경우 에러가 발생하게 됩니다.

(*Object 메소드)
자바의 객체는 Object 를 상속하고 있으며, Object 메소드는 equals, hashCode, clone 등을 말 합니다.
Object 메소드가 포함이 되어 있어도 Functional Interface 가 되는데는 지장이 없다는 얘기입니다.

(*계약) 
"현실 세계"에서 계약의 개념에서 비롯된 표현입니다. 
Java의 계약 중 하나의 일반적인 예는 재정의 equals()될 때 hashCode()재정의됩니다. 
동일한 것으로 간주되는 두 개의 객체는 계약에 의해 동일한 해시 코드를 가져야합니다. 
구문에 맞게 올바른 코드를 작성하는 것이 가능하지만 제대로 작동하지 않을 수 있으며
그것은 계약을 위반 한 프로그래머의 잘못입니다.


세번째 Stream 입니다.

Stream 인터페이스는 람다식과 결합하여 List를 일괄적으로 처리할 수 있도록 도와준다. 대표적인 메소드로 filter, map, forEach 등이 있다. 
이 API를 이용하면 클래스나 메소드를 만들지 않고도 효과적이고 가독성 높은 코드를 작성할 수 있다.

또한 Stream API 를 사용하여 병렬연산이 쉬워졌다는 장점이 있습니다.


이러한 특성으로 인해  이렇게 사용했던 코드가

옛날 옛적 for loop
Enhanced for loop

이렇게 간결하게 표현 될 수 있습니다.

반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
Comments