2020-09-16 TIL ing

2 minute read

람다 vs 추상 메서드

  • 다음과 같이 추상 메서드가 한 개 있는 인터페이스를 “functional interface”라고 부른다. -이런 경우에 람다 문법으로 사용할 수 있다.
  • Player p1 = new Player() { @Override public void play() { System.out.println(“익명 클래스”); } }; p1.play();

    // 람다 문법으로 인터페이스 구현하기 // => 메서드 한개짜리 인터페이스를 구현한 익명 클래스를 좀 더 간단히 만드는 문법이다. Player p2 = () -> { System.out.println(“람다”); }; p2.play();

람다 파라미터

  • 1) 파라미터는 괄호 안에 선언한다.
  • 2) 파라미터 타입을 생략할 수 있다.
  • 3) 파라미터가 여러개일 때는 괄호도 생략할 수 있다.

람다 리턴

  • 1) 리턴 값은 return 명령을 사용하여 처리한다.
  • 2) 한 문장으로 된 표현식(=값을 리턴하는 한 문장의 코드)인 경우 괄호 생략할 수 있다.
    • 문장은 문장인데 값을 리턴하는 문장을 표현식(expression)이라 부른다.
    • 단 괄호를 생략할 때 return 키워드도 생략해야 한다. 있으면 컴파일 오류다.

익명 클래스를 사용할 수 있는 곳에는 모두 람다 사용 가능

  • interface A { void print(); }

// 스태틱 필드 static A obj1 = () -> System.out.println(“스태틱 필드”);

//인스턴스 필드 A obj2 = () -> System.out.println(“인스턴스 필드”);

public static void main(final String[] args) {

// 로컬 변수
A obj3 = () -> System.out.println("로컬 변수!");

// 파라미터
m1(() -> System.out.println("파라미터"));   }

static void m1(final A obj) { obj.print(); }

람다 문법 - functional interface 의 자격

  • 추상 메서드가 한개이어야 한다.
    • 추상 메서드를 한 개만 갖고 있는 인터페이스에 대해 람다 문법으로 익명 클래스를 만들 수 있다.
  • 추상 메서드가 두개일 경우 람다 문법을 구현할 수 없다. 오로지 한개여야 한다.
  • 여러개의 메서드가 있어도 추상 메서드가 한개이면 구현 가능하다.
    • 스태틱 메서드나 디폴트 메서드가 몇개이든 그 개수는 중요하지 않다.
  • 인터페이스가 아닌 추상 클래스는 람다의 구현 대상이 아니다.

아규먼트에 람다 활용하기

  • 로컬 클래스를 사용했을 때 public class Exam0310 { static interface Player { void play(); }

    static void testPlayer(Player p) { p.play(); }

    public static void main(String[] args) { class MyPlayer implements Player { @Override public void play() { System.out.println(“실행”); } }

    testPlayer(new MyPlayer()); } }

  • 익명 클래스를 사용했을 때 public class Exam0311 { static interface Player { void play(); }

    static void testPlayer(Player player) { player.play(); }

    public static void main(String[] args) { Player player = new Player() { @Override public void play() { System.out.println(“실행”); } };

    testPlayer(player); } }

  • 아규먼트에 익명 클래스를 넣었을 때 public class Exam0312 { static interface Player { void play(); }

    static void testPlayer(Player player) { player.play(); }

    public static void main(String[] args) { testPlayer(new Player() { @Override public void play() { System.out.println(“실행”); } }); } }

  • 아규먼트에 람다를 사용했을 때 public class Exam0313 { static interface Player { void play(); }

    static void testPlayer(Player player) { player.play(); }

    public static void main(String[] args) { testPlayer(() -> System.out.println(“실행”)); }

}

Categories:

Updated: