
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("익명 클래스로 실행");
}
};
r.run();Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("익명 클래스로 실행");
}
};
r.run();@FunctionalInterface 애노테이션으로 명시 가능(컴파일러가 체크)| 이름 | 기능 | 메서드 시그니처 |
Runnable | 매개변수 없고 반환값 없는 실행 | void run() |
Supplier<T> | 반환값만 제공하는 함수 | T get() |
Consumer<T> | 매개변수 하나 받아 처리, 반환없음 | void accept(T t) |
Function<T,R> | 매개변수 하나 받고 결과 반환 | R apply(T t) |
Predicate<T> | 매개변수 하나 받고 boolean 반환 | boolean test(T t) |
파라미터 -> 표현식 형태| 형태 | 설명 | 예시 |
(매개변수) -> 실행문 | 매개변수 하나 이상, 실행문 한 줄 | (x) -> x * x |
(매개변수) -> { 실행문들 } | 실행문 여러 줄일 때 중괄호 필요 | (x, y) -> { return x + y; } |
() -> 실행문 | 매개변수 없는 경우 | () -> System.out.println("Hi") |
// 익명 클래스
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("익명 클래스 실행");
}
};
// 람다식
Runnable r2 = () -> System.out.println("람다식 실행");
r1.run();
r2.run();// 익명 클래스
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("익명 클래스 실행");
}
};
// 람다식
Runnable r2 = () -> System.out.println("람다식 실행");
r1.run();
r2.run();this가 익명 클래스 자체를 가리키지만, 람다식은 람다를 포함하는 외부 객체를 가리킴(상황에 따라 중요)public class LambdaExample1 {
public static void main(String[] args) {
// 익명 클래스
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("익명 클래스 실행");
}
};
// 람다식
Runnable r2 = () -> System.out.println("람다식 실행");
r1.run();
r2.run();
}
}public class LambdaExample1 {
public static void main(String[] args) {
// 익명 클래스
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("익명 클래스 실행");
}
};
// 람다식
Runnable r2 = () -> System.out.println("람다식 실행");
r1.run();
r2.run();
}
}@FunctionalInterface
interface Calculator {
int calc(int a, int b);
}
public class LambdaExample2 {
public static void main(String[] args) {
// 덧셈 구현 (람다식)
Calculator add = (a, b) -> a + b;
// 곱셈 구현 (익명 클래스)
Calculator multiply = new Calculator() {
@Override
public int calc(int a, int b) {
return a * b;
}
};
System.out.println("덧셈: " + add.calc(3, 5)); // 8
System.out.println("곱셈: " + multiply.calc(3, 5)); // 15
}
}@FunctionalInterface
interface Calculator {
int calc(int a, int b);
}
public class LambdaExample2 {
public static void main(String[] args) {
// 덧셈 구현 (람다식)
Calculator add = (a, b) -> a + b;
// 곱셈 구현 (익명 클래스)
Calculator multiply = new Calculator() {
@Override
public int calc(int a, int b) {
return a * b;
}
};
System.out.println("덧셈: " + add.calc(3, 5)); // 8
System.out.println("곱셈: " + multiply.calc(3, 5)); // 15
}
}public class OverloadingExample {
// 함수형 인터페이스 정의
interface Printer {
void print();
}
interface IntPrinter {
void print(int n);
}
// 오버로딩 메서드 2개
public static void run(Printer p) {
System.out.println("Printer 호출");
p.print();
}
public static void run(IntPrinter p) {
System.out.println("IntPrinter 호출");
p.print(100);
}
public static void main(String[] args) {
// 어떤 run() 호출될지 명확하지 않음 → 컴파일 오류 발생 가능
// 명확히 하기 위해 캐스팅하거나 람다 변수로 분리 가능
run((Printer) () -> System.out.println("람다 - Printer"));
run((IntPrinter) (n) -> System.out.println("람다 - IntPrinter: " + n));
}
}public class OverloadingExample {
// 함수형 인터페이스 정의
interface Printer {
void print();
}
interface IntPrinter {
void print(int n);
}
// 오버로딩 메서드 2개
public static void run(Printer p) {
System.out.println("Printer 호출");
p.print();
}
public static void run(IntPrinter p) {
System.out.println("IntPrinter 호출");
p.print(100);
}
public static void main(String[] args) {
// 어떤 run() 호출될지 명확하지 않음 → 컴파일 오류 발생 가능
// 명확히 하기 위해 캐스팅하거나 람다 변수로 분리 가능
run((Printer) () -> System.out.println("람다 - Printer"));
run((IntPrinter) (n) -> System.out.println("람다 - IntPrinter: " + n));
}
}ClassName::methodName)도 함께 배우면 효과적