본문 바로가기

Java

Java8

반응형

Java8 버전을 이용해 개발을 하면서도 정확하게 어떤 특징이 있는지 공부하지 못했단 생각이 듭니다.

이번 기회에 이에 대해 분석하고 글을 작성해보고자 합니다.

 

1. interface 의 변경

기존의 interface는 상수와 추상 메소드만을 정의할 수 있었지만, Java8 이후부터는 default method 를 구현하여 method body를 작성할 수 있습니다. 또한 static method 도 사용이 가능합니다.

 

이제 method body 도 작성할 수 있단 점에서 추상 클래스와 차이점이 없어 보이는데 다른점이 있습니다.

인터페이스는 상수만을 사용할 수 있기 때문에 멤버변수 사용에 제한적입니다.

또한, 생성자가 없어서 생성시 초기화 해주는 작업이 필요한 경우 적합하지 않습니다.

 

무엇보다 가장 큰 차이점은 사용하는 용도가 다르단 점입니다.

Interface는 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용하며

Abstract class는 기능을 확장하는 것에 목적이 있어 공통적인 부분은 상위클래스에,  구현이 필요한 부분은 추상화하여 제공합니다.

 

2. 함수형 인터페이스 생성과 람다표현식 사용이 가능합니다.

여기서 말하는 함수형 인터페이스(Functional Interface)란 1개의 추상메소드를 가지고 있는 인터페이스입니다. 

 

이렇게 하나의 추상메소드를 가진 인터페이스를 의미합니다.

 

람다표현식은 아래와 같이 추상메소드의 오버라이딩을 간단한게 표기할 수 있는 방식입니다.

 

3. Java 에서 제공하는 함수형 인터페이스

docs.oracle.com/javase/8/docs/api/index.html

 

Java Platform SE 8

 

docs.oracle.com

Java 에서 기본적으로 제공하는 함수형 인터페이스는 위의 주소에 나와 있습니다.

 

Function

그중에서도 Function이라는 인터페이스의 apply 라는 메소드에 대해 보겠습니다.

apply method 의 실제 사용은 위그림처럼 lambda표현식으로 나타낼 수 있습니다.

 

compose 메소드의 경우, 매개변수로 주어진 함수를 먼저 수행하고 그 다음 앞의 것을 수행합니다.

 

andThen 메소드의 경우, 앞의 function을 먼저 수행하고 그 다음 매개변수로 주어진 함수를 수행합니다.

BiFunction: 값을 두개 받아 하나를 return 해줍니다.

Precicate : 인자값에 대해 true, false를 return 해주는 함수 인터페이스입니다.

UnaryOperator : 입력값의 타입과 return 타입이 동일한 경우사용합니다.

Consumer: 하나의 입력에 대해 return 은 없습니다.

Supplier : 입력이 없이 return 이 있는 인터페이스입니다.

consumer

 

 

4. 람다 표현식

파라미터의 타입을 굳이 작성하지 않아도 선언시에 작성돼있기 때문에 문제가 되지 않습니다.

비어있는 파라미터를 사용할 수 있습니다.

 

로컬클래스, 익명클래스, 람다 표현식의 차이점에 대해 살펴보겠습니다.

로컬클래스와 익명클래스는 쉐도잉이 되지만, 람다는 되지 않습니다.

로컬, 익명에 동일한 변수가 있다면 가려지지만 람다는 그렇지 않습니다. 왜냐면 람다는 같은 scope이기 때문입니다.

첫번째의 로컬클래스 , 두번째의 익명클래스에선 base라는 변수를 자신들의 scope내에서 재정의하여 사용할 수 있었지만, 마지막의 람다함수에서는 base라는 것을 재정의할 수 없습니다.

왜냐하면 이미 같은 scope에 base라는 변수가 선언되어 있기에 재선언이 불가하기 때문입니다.

 

셋 모두의 공통점은 로컬클래스, 익명클래스, 람다표현 에서 사용하는 변수는 final이여야합니다.

이렇게 람다안에서 사용하는 base라는 변수를 변경하게 되면 에러가 발생합니다.

왜냐면 final이나 effectively final 이 아니기 때문입니다. 이런 코드 내부에서는 외부의 final 변수만 접근 가능합니다. Java8 에서 final이 붙지는 않았지만 값이 변하지 않는 변수를 Effectively final이라고 합니다. 또한 이런 변수들은 익명클래스 내부에서 접근할 수 있어 final을 생략할 수 있습니다.

반응형

'Java' 카테고리의 다른 글

equals, hashCode  (0) 2020.12.21
Refresh Token  (0) 2020.12.15
Thread Safe  (0) 2020.09.22
컴파일 과정  (0) 2020.09.18
HashMap & HashSet  (0) 2020.09.16