자바 8-1-Lambda 표현 식 과 함수 식 인터페이스

자바 8 은 자바 역사상 가장 큰 변화 가 있 는 버 전 으로 불 린 다.중요 한 새로운 기능 이 많이 포함 되 어 있 는데 가장 핵심 적 인 것 은 Lambda 표현 식 과 Stream API 를 추가 하 는 것 입 니 다.이 둘 도 결합 해서 사용 할 수 있다.우선 람 다 표현 식 이 무엇 인지 살 펴 보 겠 습 니 다.Lambda 표현 식,위 키 백과 의 해석 은 익명 함수 와 폐쇄 를 나타 내 는 연산 자 입 니 다.이 해석 을 보 니 추상 적 인 것 같 습 니 다.다음은 예 를 들 어 보 겠 습 니 다.
public class SwingTest {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("My JFrame");
        JButton jButton = new JButton("My JButton");

        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {                
                System.out.println("Button Pressed!");
            } 
        }); 
        
        jFrame.add(jButton); jFrame.pack(); 
        jFrame.setVisible(true); 
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    }
}

이것 은 Swing 프로 그래 밍 의 코드 입 니 다.Button 에 감청 이 벤트 를 연결 합 니 다.Button 을 누 르 면 콘 솔 에서"Button Pressed!"를 출력 합 니 다.내용모니터 에 익명 의 내부 클래스 를 만 드 는 인 스 턴 스 를 사 용 했 습 니 다.이것 은 기 존의 일반적인 코드 조직 형식 이기 도 합 니 다.그러나 자세히 보면 우리 가 진정 으로 주목 하 는 것 은 Action Event 형식의 매개 변수 e 와 콘 솔 에 출력 하 는 구문 System.out.println("Button Pressed!")이다.이전 프로그램 에서 익명 내부 클래스 로 인터페이스 인 스 턴 스 를 만 드 는 코드 를 Lambda 표현 식 으로 바 꾼 후 코드 는 다음 과 같 습 니 다 Public class SwingTest{
public static void main(String[] args) {
    JFrame jFrame = new JFrame("My JFrame");
    JButton jButton = new JButton("My JButton");

    jButton.addActionListener(e -> System.out.println("Button Pressed!"));

    jFrame.add(jButton);
    jFrame.pack();
    jFrame.setVisible(true);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}가장 중간 부분 코드 의 변 화 를 주목 하고 원래 의 6 줄 코드 에서 현재 1 줄 로 이 루어 집 니 다.이것 이 바로 람 다 표현 식 의 간단 한 형식 이다.Lambda 표현 식 의 문법 은(param 1,param 2,param 3)->{임 을 알 수 있 습 니 다.
//todo

}이 매개 변수의 유형 프로그램 은 상하 문 에 따라 추측 할 수 있 지만 모든 유형 을 추측 할 수 있 는 것 은 아 닙 니 다.이 때 는 우리 가 표시 하 는 성명 매개 변수의 유형 이 필요 합 니 다.매개 변수 가 하나 일 때 작은 괄호 는 생략 할 수 있 습 니 다.todo 부분 에 한 줄 의 코드 만 있 을 때 바깥쪽 의 큰 괄호 는 생략 할 수 있 습 니 다.위의 예제 와 같이 코드 가 간결 한 것 을 제외 하고 Lambda 표현 식 은 우리 에 게 어떤 변 화 를 가 져 다 주 었 습 니까?자바 에서 함 수 를 매개 변수 로 전달 할 수 없 는 지,반환 값 이 함수 라 고 설명 할 수 없 는 지 기억 해 봅 시다.자바 8 이전에 답 은 긍정 적 이 었 다.그러면 위의 예 에서 우 리 는 코드 논 리 를 매개 변수 로 감청 기 에 전달 할 수 있 고 감청 기 사건 이 발생 할 때 이렇게 할 수 있 으 며 익명 내부 류 의 방식 으로 매개 변수 가 필요 하지 않다 고 알려 줄 수 있다.이것 도 자바 8 이 가 져 온 또 다른 새로운 특성 이다.함수 식 프로 그래 밍 이다.함수 식 프로 그래 밍 을 지원 하 는 언어 는 매우 많 습 니 다.자바 스 크 립 트 에서 함 수 를 매개 변수 로 전달 하거나 반환 값 은 함수 인 경우 가 매우 흔 합 니 다.자바 스 크 립 트 는 매우 흔히 볼 수 있 는 함수 식 언어 입 니 다.Lambda 는 자바 에 부족 한 함수 식 프로 그래 밍 특성 을 추가 하여 함 수 를 1 등 시민 으로 볼 수 있 도록 합 니 다.함수 식 프로 그래 밍 언어 에서 Lambda 표현 식 의 유형 은 함수 입 니 다.자바 에서 Lambda 표현 식 은 대상 입 니 다.특별한 대상 유형 인 함수 식 인터페이스(Functional Interface)에 의존 해 야 합 니 다.다음은 함수 식 인터페이스의 정 의 를 살 펴 보 겠 습 니 다.만약 에 하나의 인터페이스 에 추상 적 인 방법(Object 류 의 방법 은 포함 되 지 않 음)이 있다 면 이 인 터 페 이 스 는 함수 식 인터페이스 로 볼 수 있 습 니 다.
@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface Runnable is used
     * to create a thread, starting the thread causes the object's
     * run method to be called in that separately executing
     * thread.
     * 

* The general contract of the method run is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); }


Runnable 인터페이스의 성명 을 살 펴 보 자.자바 8 이후 Runnable 인터페이스 에 Function alInterface 주석 이 하나 더 생 겨 서 이 인 터 페 이 스 는 함수 식 인터페이스 임 을 나타 낸다.그러나 만약 에 우리 가 Functional Interface 주 해 를 추가 하지 않 는 다 면 인터페이스 에 추상 적 인 방법 이 있 고 추상 적 인 방법 만 있 을 때 컴 파일 러 도 이 인 터 페 이 스 를 함수 식 인터페이스 로 본다.
@FunctionalInterface
public interface MyInterface {
    void test();
    String toString();
}

MyInterface 이것 도 함수 식 인터페이스 입 니 다.toString()은 Object 류 의 방법 이기 때문에 여기 서 복사 만 했 을 뿐 인터페이스 에서 추상 적 인 방법의 수량 을 증가 하지 않 습 니 다.(여기에 자바 8 에서 인터페이스 안의 방법 은 추상 적 인 방법 만 있 는 것 이 아니 라 구체 적 으로 실현 되 는 방법 도 있 습 니 다.기본 적 인 방법(default method)이 라 고 불 립 니 다.이 부분 은 나중에 구체 적 으로 소개 합 니 다.자바 에서 Lambda 표현 식 이 대상 입 니 다.그렇다면 이 대상 의 유형 은 무엇 일 까요?SwingTest 프로그램 을 돌 이 켜 보면 익명 내부 클래스 로 Action Listener 인터페이스 인 스 턴 스 를 만 들 었 습 니 다.
jButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {                
        System.out.println("Button Pressed!");
    } 
}); 

Lambda 표현 식 개선 사용 후
jButton.addActionListener(e -> System.out.println("Button Pressed!"));

즉,우 리 는 Lambda 표현 식 을 사용 하여 ActionListener 인터페이스의 인 스 턴 스 를 만 들 었 고 ActionListener 인터페이스의 정 의 를 보 았 습 니 다.
public interface ActionListener extends EventListener {
    /**
     * Invoked when an action occurs.
     */
    public void actionPerformed(ActionEvent e);
}

하나의 추상 적 인 방법 만 있 습 니 다.FunctionalInterface 주 해 를 추가 하지 않 았 지만 함수 식 인터페이스의 정의 에 부합 되 고 컴 파일 러 는 이것 이 함수 식 인터페이스 라 고 생각 합 니 다.따라서 Lambda 표현 식 을 사용 하면 함수 식 인터페이스의 인 스 턴 스 를 만 들 수 있 습 니 다.즉,Lambda 표현 식 은 함수 식 인터페이스 형식 을 되 돌려 줍 니 다.실제로 함수 식 인터페이스 인 스 턴 스 의 생 성 은 세 가지 방식(FunctionalInterface 설명 참조)이 있 습 니 다.1.Lambda 표현 식 2.방법 참조(후속 장절 소개)3.구조 방법 참조(후속 장절 소개)
소결:이 편 은 자바 8 을 배 우 는 문 을 열 었 습 니 다.lambda 표현 식 이 무엇 인지 알 게 되 었 습 니 다.함수 식 인터페이스의 정의 가 무엇 인지 알 게 되 었 습 니 다.그리고 몇 가지 예 를 들 어 lambda 표현 식 의 편리 함 을 보 여 주 었 습 니 다.이 글 이 당신 에 게 도움 이 된다 고 생각한다 면 칭찬 해 주세요.
다음 편

좋은 웹페이지 즐겨찾기