2020-09-16 TIL ing
람다 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(“실행”)); }
}