달력

11

« 2024/11 »

  • 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
2019. 2. 10. 10:37

람다식 기본 JAVA2019. 2. 10. 10:37

Java8부터 도입된 람다표현식. 회사에서는 Java6를 쓰고 있다보니 쓸 일이 없어서 무관심 하다가, 신규 서버로 전환 후 일괄 버전업이 되어 이제 쓸 수 있게 되었다. 내친 김에 간단히 정리해본다.


람다표현식이 중요한게 아니라 함수형 프로그래밍의 사상을 아는게 더 중요하다고 생각되는데, 귀찮으니까 링크로 대체...

위키피디아: 함수형프로그래밍 설명

https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D


람다식을 이용하지 않고 인터페이스를 구현하는 경우, 원래는 아래처럼 사용했었다.

클래스로 implements한 뒤 사용하거나, 일회성이라면 익명함수로 바로 구현하거나.


public class Test {

public static void main(String[] args) {

Food food0 = new Banana();

food0.eat("banana");

Food food1 = new Food() {

@Override

public void eat(String target) {

System.out.println("eat:"+target);

}

};

food1.eat("banana");

}

}


interface Food {

void eat(String target);

}


class Banana implements Food{

@Override

public void eat(String target) {

System.out.println("eat:"+target);

}

}



그런데 자바8 이후 람다식이 가능해지면서 더 간단하게 표현이 가능해졌다. 아래와 같이... (익명함수 구현시 7줄이던게 2줄로)


public class Test {

public static void main(String[] args) {

Food food3 = (target) -> System.out.println("eat:"+target);

food3.eat("banana");

}

}

@FunctionalInterface

interface Food {

void eat(String target);

}



이것이 어떻게 가능한고 하니... 자바가 함수형 프로그래밍 언어가 아니다보니 람다를 도입하기 위해 함수형 인터페이스, 즉 '단 하나의 추상 메서드만 가진' 인터페이스라는 개념을 만들었다. 

이 때문에 다음과 같은 추론이 가능하게 된다. (위 예시 기준)

1. new Food() 가 필요 없다. Food 타입을 구현하려는 것이 명확하기 때문에 생략 가능하다.

2. eat()가 필요 없다. Food 인터페이스에는 단 하나의 메서드만이 있기 때문에 구현하고자 하는 메서드가 해당 메서드임이 분명하다.

3. String이 필요 없다. 메서드가 하나이므로, 해당 메서드가 받는 파라미터 수와 타입이 정해져있어 파라미터타입 명시가 불필요하다.


확실히 편해졌다. 그런데 인터페이스에 항상 한 메서드만 있어야 한다는데... 처음 구현할 때야 그렇다 치지만, 나중에 누군가 메서드를 추가하면 어떻게 될까? 물론 컴파일이 되지 않고 에러가 난다. 하지만 좀 더 명확히 하기 위해 해당 인터페이스에 @FunctionalInterface 어노테이션을 붙여주자.


람다식과 함께 새롭게 등장한 녀석중 Stream이 있는데, 람다로 인해 이 API가 빛을 발한다. 이건 나중에 포스팅.



'JAVA' 카테고리의 다른 글

Singleton Pattern(싱글톤 패턴)  (0) 2019.02.13
MAVEN 기초  (0) 2018.07.08
:
Posted by SK