오늘이군
Java8 꼭 사용해야 하나요? 본문
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 를 사용하여 병렬연산이 쉬워졌다는 장점이 있습니다.
이러한 특성으로 인해 이렇게 사용했던 코드가
이렇게 간결하게 표현 될 수 있습니다.
'삶.. > 프로그래밍' 카테고리의 다른 글
QueryDSL multiple subselect - (a,b) in (select c,d) (0) | 2019.04.17 |
---|---|
MSA (Micro service architecture) vs monolithic (0) | 2019.01.22 |
오토박싱, 오토언박싱 - auto (un)boxing, 자바 자료형 (0) | 2018.09.10 |
문자열 연결 - String, StringBuilder, StringBuffer, +, concat (0) | 2018.08.14 |
알고리즘 - 시간 복잡도, 공간 복잡도, 빅오(O)표기법 (0) | 2018.08.13 |