Java8과 Java7은 많은 부분이 바뀌어서 이제
Java8을 모르는 사람은 다른사람들과 협업하기 어려워 질 수도 있다.
작년에 공부하였던 부분을 다시 복습 할겸 포스팅을 진행한다.
Java8이 도입되면서 많이 변경된 부분이 함수형 프로그램이 가능하도록 되었다는 것이다.
그것의 중심에는 람다식 표현식이 있다.
람다 표현식(lambda expression)
- 람다식 이란?
단순히 정의하면, 프로그래밍에서 식별값 없이 실행 할 수 있는 함수 표현 방법, 함수를 변수에 할당, 파라미터로 전달하는게 가능
이미 많은 언어에서 지원하고 있다. Ruby, C#, Python,,,,,
그러나 자바는 함수형 프로그램 언어가 아니 여서 기존에 사용할 수 없었다.
- 함수형 인터페이스(functional interface)
함수 인터페이스functional interface는 단 하나의 추상 메소드가 정의 가능한 인터페이스이다. 인터페이스가 함수형 인터페이스임을 나타내는 수단으로서 FunctionalInterface 어노테이션이 도입되었다. 예를 들어, java.lang.Runnable은 다음과 같은 함수 인터페이스를 지닌다.
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
하지만, 어노테이션을 통해 명시적으로 지정하지 않더라도 함수 인터페이스의 정의를 만족하는 인터페이스라면 자바 컴파일러가 주석의 유무에 상관없이 함수 인터페이스로서 취급한다
- 람다식 기본 구성
(int x, int y) -> { return x + y; }
(x, y) -> x + y
x -> x * x
() -> x
x -> { System.out.println(x); }
화살표(->)의 왼쪽은 매개변수 목록 즉 입력 값 유형이고, 오른쪽은 몸체 즉 동작에 대한 정의이다.
1 2 3 4 5 6 7 8 9 10 | // 람다 표현식 기본 예제 public class Java8Test { public static void main(String args[]) { Thread testThread = new Thread(() -> { System.out.println("best wedul"); }); testThread.start(); } } | cs |
※ 이미지 참조 : slideshare
- 매개변수 타입 추론
매개변수 타입 추론 1.
numbers.forEach((Integer value) -> System.out.println(value));
-- forEach 메소드와 Consumer 인터페이스
numbers.forEach(new Consumer<Integer>() {
public void accept(Integer value) {
System.out.println(value);
}
});
위의 예제의 경우 자바 컴파일러가 람다식을 분석해 Consumer 인터페이스의 미 구현된 메소드(accept)와 동일한 타입(시그니처)인지 검사하고, 람다식을 마치 Consumer 인터페이스를 구현한 클래스의 인스턴스인 것 처럼 사용한다.
또한 람다 식의 인수의 타입 선언은 대 부분의 경우 컴파일러가 추론할 수 있고, 다음과 같이 생략이 가능하다.
numbers.forEach(value -> System.out.println(value));
1 2 3 4 5 6 7 8 9 | b.addActionListener((ActionEvent e -> { Text.setText("버튼 클릭"); }); Public void addActionListener(ActionListener l) { Public interface ActionListener{ Void actionPerforemd(ActionEvent e) } } | cs |
자바 컴파일러가 람다식을 분석해 ActionListener 인터페이스의 미 구현된 메소드(actionPerformed)와 동일한 타입인지 검사한다.
람다식 장점
- 코드의 간결성 : 효율적인 람다 함수의 사용을 통하여 불필요한 코드를 삭제할 수 있다.
- 필요한 정보만을 사용하는 방식을 통한 퍼포먼스 향상 : 지연 연산을 지원하는 방식을 통하여 효율적인 퍼포먼스를 기대
'JAVA > Java 8' 카테고리의 다른 글
Java8 인터페이스의 정적 메소드 (0) | 2018.05.30 |
---|---|
Java8 인터페이스 default Method (디폴트 메소드) (0) | 2018.05.30 |
Java8 변수 유효 범위 (0) | 2018.05.30 |
Java8 생성자 레퍼런스 (0) | 2018.05.30 |
Java8 메서드 레퍼런스 (0) | 2018.05.30 |