ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA 람다와 스트림 - 람다식(Lambda Expression)
    개발언어/JAVA 2023. 12. 15. 14:30

    람다식(Lambda Expression)

    자바는 원래 객체 지향(OOP)언어이지만 JDK1.8 부터는 함수형 언어의 기능을 추가했다. 따라서 자바8부터는 OOP언어이 동시에  함수형언어 라고 할 수 있다. 하지만 완전히 함수형 언어도 겸비한다고 하기에는 무리가 있고 함수형 언어의 기능을 포함했다고 보는 편이 더 정확하다.

     

    익명 클래스(anonymous class)

    이름이 없는 일회용 클래스. 정의 생성을 동시에 한다.

     

     

    익명 클래스의 객체 인스턴스 생성 

    new Object(){
    	// 클래스 정의부
    }

     

    class Example{
    	
        //익명 클래스
        Object iv = new Object(){ void method(){} };
        //익명 클래스
        static Object cv = new Object(){ void method(){} };
        
        void myMethod(){
        	//익명 클래스
        	Object lv = new Object(){ void method(){} };
        }
        
    }

    위 코드는 익명 클래스 이기 때문에 compile하고 나면 이름 이 숫자로 붙는다. 그리고 내부 클래스이기 때문에 외부 클래스 이름인 Example이 따라온다.

     

     

    람다식 작성하기 - 규칙

     

    ▶ 함수(메서드)를 간단한 `식(exxpression)`으로 표현하는 방법

    // 매서드 표현
    int max(int a, int b){
        return a > b ? a : b;
    }
    
    //람다식 표현
    (a, b) -> a > b ? a : b

     

     

    ▶함수와 메서드의 차이

    • 근본적으로 동일. 함수는 일반적 용어, 메서드는 객체지향 개념 용어 
    • 함수는 클래스에 독립적, 메서드는 클래스에 종속적 

     

    람다식 작성하기 - 주의사항

    1. 매개변수가 하나인 경우, 괄호() 생략가능(타입이 없을 때만)

     

     

    2. 블록 안의 문장이 하나뿐 일 때, 괄호{} 생략 가능(끝에 `;` 안 붙임)

     

     

    람다식은 익명 함수? 익명 객체!

    람다식은 익명 함수가 아니라 익명 객체이다. 왜냐하면 자바에서는 메서드만 독립적으로 존재할 수 없다. 

     

    // 람다식
    (a, b) -> a > b ? a : b
    
    //익명객체 
    new Object(){
    	int max(int a, int b){
        	return a > b ? a : b;
        }
    }

     

    위 코드의 첫번 째 줄 같은 람다식이 있을때, 밑에 온 코드와 동일 하다  new Object()로 시작하는 아래의 코드는 익명 클래스에 의해 만들어진 익명 객체 인스터스이다.  즉 객체의 선언생성을 동시에 하는 것이다.

     

    아래의 코드를 위의 람다식과 같이 간단하게 쓸수 있도록 하는 것으로 람다식 자체가 익명 객체라고 할 수 있다.  따라서 익명 객체인 람다식을 사용하기 위해서는 이것을 다루기 위함 참조변수가 필요하다. 그렇다면 그 참조 변수의 타입을 무엇을로 해야할까?

     

    ⭐익명 객체의 메서드

    Object obj = new Object(){
    	int max(int a, int b){
        	return a > b ? a : b;
        }
    };

     

    익명 객체의 조상 클래스로 Object를 사용했으므로 참조타입은 Object를 사용하면 된다. 

     

    Object 타입의 익명 객체 인스터스 

    익명 객체는 max라는 메서드를 가지고 있지만 Object 타입은 는 max()를 가지고 있지 않으므로 해당 메소드를 사용할 수 없다. 그래서 `obj`라는 객체 인스턴스는 max()를 가지고 있지만 Object 타입이 가지고 있지 않기 때문에 호출 할 수 없다.

    그래서 필요한 것이 함수형 인터페이스이다

     

    정리

    원래 익명 객체가 있을 때 그 익명 객체의 메서드 부분을 표현한 것이 람다 식이다.  사실은 메서드만 있으면 되는데 JAVA 언어의 규칙 상 메서드만 존재할 수 없기 때문에 익명 객체 안에 넣어서 표현을 해야 한다. 따라서 람다식은  익명 객체 인스턴스이기도 하다.

     

     

    [출처 - 자바의 정석 - 기초편 , 저 남궁성]

    https://www.youtube.com/watch?v=0Sp9eFRV8gE

    댓글

Designed by Tistory.