티스토리 뷰

Java

[Java 8] - 람다식(Rambda)의 개념과 예제

영지는 달리는중 2020. 8. 6. 02:16

1. 람다 표현식(lambda expression)이란?

함수형 프로그래밍 언어에서 사용되는 개념으로 익명함수라고도 한다

Java 8 부터 지원되며, 불필요한 코드를 줄이고 가독성을 향상시키는 것을 목적으로 두고 있다 

 

표현법

 (매게변수, ...) -> {함수 실행문};

 

람다 표현식 작성 시 유의 사항

  1. 기본적인 람다 표현식의 표현법은 매게변수 화살표 함수몸체 입니다 : (매게변수, ...) -> {함수몸체}
  2. 매게변수가 하나일 경우 매게변수를 생략 할 수 있다 : () -> {함수몸체}
  3. 함수몸체가 단일 실행문이면 괄호({})를 생략할 수 있다 : (매게변수 ,...) -> 함수몸체
  4. 함수몸체가 return 문으로만 구성되어 있는 경우 괄호({})를 생략할 수 없다 : (매게변수,...) -> {return 0;}

람다 표현식의 장점

  1. 코드의 라인수가 줄어든다
  2. 병렬처리가 가능하다

람다 표현식의 단점

  1. 람다식의 호출이 까다롭다
  2. 람다 stream 사용 시 단순 for 문 혹은 while 문 사용시 성능이 떨어진다
  3. 불필요하게 너무 사용되면 오히려 가독성을 떨어 뜨릴 수 있다

람다식 예제

  1. 기존 자바 문법
// 인터페이스 정의
public interface Goods {
	public void doSome();
}

//인터페이스를 상속받아 메소드 오버라이드
public class Computer implements Goods{
	@Override
    public void doSome(){
    	System.out.println("Computer is Running!!");
    }
}

//인터페이스를 상속받아 메소드 오버라이드2
public class Youngji implements Goods {
	@Override
    public void doSome(){
    	System.out.println("Youngji is studying!!");
    }
}

public class Main{
	public static void main(String args[]){
    	Goods com = new Computer();
        com.dosome();  //객체를 선언하여 메소드를 실행
        
        Goods young = new Youngji(); 
        young.doSome();
    }
}

메소드의 다형성을 제공하기 위해 interface를 생성하고 Computer 과 Youngji Class에 interface를 상속받아 메소드를 오버라이드한다.

그리고 interface 타입의 Class들의 객체를 생성한 뒤 메소드를 참조하여 사용했다. 메소드를 반복하여 사용해야 하는 경우 위의 코드를 반복하게 되고 그러면 지저분한 코드가 될 것이다

 

   2.  람다식 사용

@FunctionalInterface
public interface Goods {
	void doSome();
}


public class Main{
	public static void main(String args[]){
    	Goods com = () -> System.out.println("Computer is Running!!");
        Goods young = () -> System.out.println("Youngji is stduying!!");
    }
}

하지만 람다식을 사용하는 경우 위의 코드와 같이 아주 간결하게 표현됨을 볼 수 있다

위의 코드처럼 람다식을 매게변수에 대입하여 사용할 경우 람다식의 타입을 정의해야 하는데 이는 함수형 인터페이스로 정의한다

위에 Goods가 함수형 인터페이스이다

 

함수형 인터페이스란?

일반적으로 구현해야 할 추상 메소드가 하나만 정의된 인터페이스를 뜻한다

이러한 함수형 인터페이스는 람다식의 타입으로 사용된다

즉 람다 표현식을 변수에 대입하기 위해서는 람다 표현식의 타입이  필요한데 이는 함수형 인터페이스가된다

- 오라클 문서 인용 - 

Functional interfaces provide target types for lambda expressions and method references.

 

함수형 인터페이스에 하나의 추상 메소드만 정의되어 있는 이유 - 어떤 식을 람다식으로 표현했는지 알수 없다(익명 함수이기 때문에)

 

함수형 인터페이스 어노테이션을 사용한다면 컴파일 타임에 알아서 에러를 잡아준다 

-> @FunctionalInterface

예) 추상 메소드가 두개 이상 작성된 경우 알아서 에러를 띄워준다

 

이해를 도와준 블로그

 

 

'Java' 카테고리의 다른 글

[Java] - super(), this()  (0) 2020.10.10
[Java] - 배열(Array)과 리스트(List) 에 대하여  (0) 2020.09.03
[Java] - War, Jar의 차이  (0) 2020.08.23
[Java 8] - Stream Api  (0) 2020.08.08
[Java] - 자바 특징 및 실행과정  (0) 2020.07.28
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함