IT/development

[Java] Java Lambda 정리(jdk 1.8부터 사용 가능)

알 수 없는 사용자 2022. 11. 23. 07:01
반응형

목차

    image source:https://unsplash.com/s/photos/java

    연차는 쌓이는데 공부는 끝이 없고 아직 모르는게 너무 많다.

    그래서 노쇠해서 코딩을 못하기 전까지는 꾸준히 부족한 부분을 공부해서 메꿀 생각이다.

    Java Lambda 정리(java 1.8 이상부터 가능)

    Java의 Lambda에 대해서 공부한 뒤 이를 기록해 보겠다.😃

    java의 람다식은 익명객체를 생성하기 위한 표현식임(예제를 보면서 이해하는게 역시 빠르다.)


    image source:https://ko.wikipedia.org/wiki/%CE%9B

    람다함수란?🙄

    더보기

    람다함수의 개념은 나무위키를 보면 아래처럼 나와있다.

    람다식, 또는 람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(匿名函數, Anonymous functions)를 지칭하는 용어이다. 

    익명함수는 말 그대로 이름이 없는 함수이다.

    익명함수들은 공통으로 일급객체(First Class citizen)라는 특징을 가지고 있다.

    이는 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리키고 보통 함수에 인자로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다고 위키백과에 나와있다.

    함수를 만들지 않고 함수처럼 사용하는 것(함수를 하나의 식으로 표현)

    람다의 장단점🤔

    람다의 장점

    1. 코드의 간결성 : 람다 사용 시 불 필요한 반복문을 줄이고 복잡한 식을 단순하게 표현 가능

    2. 지연연산 수행 : 람다는 지연연상을 수행 함으로써 불필요한 연산 최소화 가능

    지연연산이란 말 그대로 불필요한 연산을 피하려고 연산을 지연시킴을 의미한다.

    3. 병렬처리 가능 : 멀티쓰레드를 활용하여 병렬처리를 사용할 수 있음

    병렬처리란 쉬운 예로 하나의 일(프로그램)을 여러 명(프로세서)이서 나눠서 함으로 처리 속도를 올리는 걸 의미한다.

    우리나라 속담으로 따지면 "백지장도 맞들면 낫다"

    람다의 단점

    1. 람다식의 호출이 까다롭다.(문법을 모르면 그럴 수 있을 듯)

    2. 람다 stream 사용 시 단순 반복문(for, while) 사용 시 성능이 떨어짐

    3. 불필요하게 남용 시 오히려 가독성을 떨어 뜨릴 수 있음

    4. 람다로 만든 함수는 재사용 불가

    5. 디버깅이 까다로움

    역시 이론보다는 코드를 보는게 난 더 이해가 빠를 것 같다.

    람다식 코드😎

    람다식 이전 java 문법

    인터페이스를 이용해 다형성을 제공하기 위해서 인터페이스(Goods)를 만들고 그것을 구현한 구현체 클래스(Computer)를 만든 뒤 사용 시 인터페이스 타입의 참조변수(com)에 인터페이스의 구현체 클래스의 객체를 생성해서 사용하거나 아래처럼 실행하는 쪽에서 익명 객체를 만들어 사용했었음

    일회용으로 사용하는 경우가 아니라 만일 Goods 구현체가 자주 사용되어야 되는 경우는 위처럼

    익명 객체를 계속 사용 시 코드가 매우 지저분해질 것임

    람다식

    구현체의 출력문을 주석처리하고 메인 메소드에서 람다식으로 바로 출력문을 정의했음

    핵심은 매개변수 + 실행문으로 구성됨(접근자, 반환형 모두 생략되는 구조임)

    () -> {} 형태이고 첫 괄호()에 해당 인터페이스 함수의 매개변수를 입력하면 됨

    그 다음 ->를 입력 후 중괄호{} 안에 수행할 코드를 작성하면 됨

    Ob ob = new Ob(); 인스턴스화 할 필요 없음

    함수를 따로 만들지 않고 (매개변수)를 이용해서 -> {수행코드} 이걸 바로 실행한다고 이해하면 될 듯

    람다식 예제🤡

    1. 기본 사용법( (타입 매개변수)-> {}; )

    람다식에 필요한 기호를 모두 사용한 경우

    2. 매개변수 타입 생략( (매개변수)-> {}; )

    매개변수가 1개 이거나 2개 이상의 매개변수 타입이 모두 같을 경우 타입 생략 가능

    매개변수 타입 같은 경우

    매개변수가 1개인 경우

    3. 매개변수가 없는 경우( ()-> {}; )

    매개변수가 없는 경우 아래처럼 코드 몸통만 구현하면 되는데 만일 return type이 있는 경우 return 해줘야 한다.

    4. 중괄호 생략( ()->; )

    수행할 코드가 1개일 때는 중괄호{}를 생략할 수 있음, 이 때 중요한 점은 return이 필요한 메소드인 경우 return 키워드를 생략해야 함

    예제에 사용된 인터페이스는 return type이 int이기에 return을 생략해야 한다.

    return 붙일 경우 아래처럼 에러 발생

    5. 소괄호 중괄호 생략( 매개변수 -> ; )

    매개변수가 1개이고 수행할 코드도 1개이면 아래처럼 ()와 {} 생략 가능(메소드 return type이 void여야 함)

    하지만 인터페이스 추상 메소드의 return type이 있는 경우는 {} 생략 불가

    위 상태에서 추상 메소드의 return type을 int로 변경하면 아래처럼 에러발생

    String 타입 람다식 

    사용 예제 코드

    함수형 인터페이스

    @FunctionalInterface
    public interface Caculator {
    	// return type void로 바꿨다 int로 바꿨다, 매개변수 추가 하면서 테스트
    	public int cal(int num1);
    }

    람다식 코드

    public class Test2 {
    	public static void main(String[] args) {
    		// 람다식 모든 기호 사용
    		//Caculator cal = (int n1, int n2) -> {return n1 + n2;};
    		//System.out.println(cal.cal(1000, 20000));
    		// 타입 생략(매개변수 2개 타입이 같음)
    		//Caculator cal2 = (n1, n2) -> {return n1+n2;};
    		//System.out.println(cal2.cal(10, 200));
    		// 매개변수 생략
    		//Caculator cal3 = () -> System.out.println("매개변수 없음");
    		//cal3.cal();
    		// 중괄호 생략(수행코드 1개)
    		//Caculator cal = (n1) -> n1 + 1000;
    		//System.out.println(cal.cal(1000000));
    		// 소괄호, 중괄호 생략(매개변수 1개, 수행코드 1개)
    		//Caculator cal = n1 -> System.out.println(n1);
    		//cal.cal(10000);
    		//Caculator cal = n1 -> n1 + 10000;
    		//cal.cal(10000);
    	}	
    }

     

    람다 사용 조건🤗

    람다를 사용하기 위한 인터페이스에는 조건이 있음, 바로 인터페이스의 추상 메소드가 1개인 경우어야 함

    람다식은 익명함수이기 때문에 메소드가 여러개인 경우 어떤 메소드를 익명함수로 구현한 건지 알 수 없다.

    이를 위한 여러가지 규칙이 있지만 제일 명확한 것은 @FunctionalInterface을 붙여주는 것이다.

    아래처럼 람다식 표현에 사용될 인터페이스에 @FunctionalInterface을 붙이면 자바 컴파일러가 알아서 에러를 잡아줌

    함수형 인터페이스에 아래처럼 추상 메소드를 1개 더 만들 경우 에러 발생 시킴

    람다식 사용 인터페이스에 @FunctionalInterface을 붙이는 습관을 기를 것

    참조 : 히진쓰의 서버사이드 기불 블로그, 2018.09.28, https://khj93.tistory.com/entry/JAVA-%EB%9E%8C%EB%8B%A4%EC%8B%9DRambda%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%82%AC%EC%9A%A9%EB%B2%95

     

    [JAVA] 람다식(Lambda)의 개념 및 사용법

    람다함수란? 람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)를 지칭하는 용어입니다. 현재 사용되고 있는 람다의 근간은 수학과 기초 컴퓨터과학 분야에서의 

    khj93.tistory.com

     

    배움이 즐거운 개발자, 2019,04,09, https://galid1.tistory.com/509

     

    Java - Lambda Expression(람다식)이란?

    람다식이란 람다식 이란 무엇일까요. 그 동안 java를 이용하다가 lambda식 이란 것을 처음 보았을때는 매우 생소하고 거부감이 느껴졌습니다. 하지만, java8에서 추가된 stream과 같은곳에서 한두번

    galid1.tistory.com

    틀린 점 있을 경우 댓글 부탁 드립니다.😅

    반응형