티스토리 뷰

Java

[JAVA] 람다식-Lambda Expressions

Hwan'ss 2019. 7. 17. 23:32

1. 람다식(lambda expression)

  • 나중에 실행될 목적으로 다른곳에 전달 될 수 있는 함수
  • 이름이 없는 메소드라고 할 수 있음
  • 즉, 람다식은 메소드를 객체로 취급할 수 있는 기능

가. 형식

  • (args1, args2...) -> { body }
  • (type1 args1, type2 args2...) -> { body }

ex)  () -> System.out.println("Hello World");

      (String s) -> { System.out.println(s); }

      () -> 69

      () -> { return 3.141592; }

  • 기본 소스에서 람다식을 만들려면 new class 이름과 함수 껍데기를 벗기면 람다식이 된다. (예제 4 참고)

 

나. 람다식을 사용하는 이유?

  • 메소드가 필요한 곳에 간단히 메소드를 보낼 수 있음
  • 특히 메소드가 딱 한번만 사용되고 메소드의 길이가 짧은 경우에 유용함

다. 람다식의 특징

  • 람다식은 0개 이상의 매개 변수를 가질 수 있다.
  • 매개 변수의 형식을 명시적으로 선언 할 수 있다.
  • 매개 변수는 괄호로 묶이고 쉼표로 구분된다.
  • 빈 괄호는 매개 변수가 없음을 나타낸다.
  • 단일 매개 변수이고 타입은 유추가 가능한 경우에는, 괄호를 사용할 필요는 없다.
  • 람다식의 본문에는 0개 이상의 문장이 포함 될 수 있다.
  • 람다식의 본문은 단일 문장일 경우 중괄호는 없어도 되며 반환 형식은 일반적은 함수와 동일하다.
  • 본문에 하나 이상의 문장이 있으면 중괄호로 묶어야 한다.

 

라. 람다식이 왜 필요한가?

  • 자바에서 메소드를 다른 메소드에 전달할 필요가 생각보다 자주 발생함

(1). 자바에서 그래픽 사용자 인터페이스 코드를 작성할 때, 함수 몸체를 전달하고 싶을 때, 무명 클래스를 많이 사용한다.

 객체에서 발생하는 마우스 클릭 이벤트를 처리하기 위하여 ActionListener를 상속 받아서 무명 클래스를 정의하고 객체를 생성하여 버튼의 마우스 리스너로 등록하였다. 무명 클래스를 이용하면 addActionListener에 우리가 작성한 메소드를 전달 할 수 있다. 하지만 무명 클래스는 상당히 복잡한 방법이다. 람다식을 이용하면 다음과 같이 바꾸어 작성 할 수 있다.

(2). 자바에서 스레드를 작성하려면 먼저 Runnable 인터페이스를 구현하는 클래스부터 작성해야 한다. 이 인터페이스는 run()이라고 하는 메소드 하나만을 가지고 있다.

하지만 람다식을 사용하면 다음과 같이 간단하게 무명 메소드를 정의하고 이것을 Thread 클래스로 전달하는 것이 가능하다.

(3). 주어진 배열의 모든 요소를 출력하는 간단한 코드이다.

에서 forEach()메소드는 람다식이 전달된다. 문장이 훨씬 간결해 진다.

 

2. 함수 인터페이스와 람다식

  • 함수 인터페이스 : 하나의 추상 메소드만 선언된 인터페이스
  • 이제까지 함수 인터페이스의 객체를 생성하기 위하여 무명 클래스를 사용해왔다. 람다식을 사용하면 단순화 할 수 있다.
  • 함수 인터페이스를 지정하지 않으면 형변환은 컴파일러가 자동으로 처리한다.

가. 예제1 : 매개변수를 가지지 않는 람다식

나. 예제2 : 2개의 인수를 받는 람다식

다. 예제3 : 자바 언어에 내장된 함수 인터페이스 사용

라. 예제4 : 실전에서 많이 사용하는 예제(일반코드와 람다식 비교)

  • 아래 소스와 같이 람다식을 사용하면 슈가코드가 된다. 
  • 후에 람다식이 많이 사용되고 지금 이해하지 않으면 나중에 어렵다.

 

3. 람다식과 무명 클래스의 차이

  • 무명 클래스를 사용하는 방법과 람다식을 사용하는 방법의 주요 차이점은 this 키워드 사용에 있다.
  • 무명 클래스에 대해서는 this가 무명 클래스를 가리킨다.
  • 람다식에서는 this가 람다식이 작성된 클래스를 가리킨다.
  • 람다식과 무명 클래스 사이의 또 다른 차이점은 컴파일 되는 방식에 있다. 자바 컴파일러는 람다식을 컴파일 하여 클래스의 private 메소드로 변환한다.

4. 람다식의 장단점

가. 람다식 장점

  • 코드를 간결하게 만들 수 있다.
  • 코드가 간결하고 식에 개발자의 의도가 명확히 드러나므로 가독성이 향상된다.
  • 함수를 만드는 과정없이 한번에 처리할 수 있기에 코딩하는 시간이 줄어든다.
  • 병렬프로그래밍이 용이하다.

나. 람다식 단점

  • 람다를 사용하면서 만드는 무명함수는 재사용이 불가능하다.
  • 디버깅이 다소 까다롭다.
  • 람다를 남발하면 코드가 지저분 해 질 수 있다. (비슷한 함수를 계속 중복 생성할 가능성이 높음)
  • 재귀로 만들경우에는 다소 부적합한면이 있다.

 

2019.07.18(수)~2019.07.19(목)  [Test05 Project]

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2025/01   »
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
글 보관함