람다식을 이해하기 전에 익명객체에 대해 먼저 살펴보자.
💡 익명 객체 : 이름이 없는 일회용 객체
// 기존 객체생성 방식 부모타입_참조변수 XXX = new XXX();
// 익명 자식객체 생성방식 부모타입_참조변수 XXX = new XXX() { 상위클래스 메서드 오버라이딩 @Override }
아래의 예는 상위클래스인 Person타입의 익명자식객체(클래스)를 만드는 예제이다.
Person클래스에는 4개의 메서드가 있다.
class Person { // Person 상위 클래스생성
public void wake() { // 메서드01
System.out.println("기상!");
}
public void eat() { // 메서드02
System.out.println("냠냠냠");
}
public void sleep() { // 메서드03
System.out.println("쿨쿨쿨...zzZ");
}
public void live() { // 메서드04
wake();
eat();
sleep();
}
}
public class Main { // Main 클래스
public static void main(String[] args) {
💡 익명자식객체 생성하기
Person 영희 = new Person() { // 중괄호 열어주기
👉🏻 상위타입의 참조변수(Person)에 '영희'자식객체 할당할 수 있음
👉🏻 클래스이름은 없지만 그 주소값이 저장된 '영희'참조변수는 있음
💡 익명 자식객체에 추가된 work() 메서드
private void work() {
System.out.println("근무 시작!");
System.out.println("퇴근!");
}
💡 상위 클래스(Person)의 live()메서드를 오버라이딩하는 코드작성
@Override
public void live() {
super.wake();
super.eat();
super.sleep();
work(); // 오버라이딩 시 work()메서드 추가
}
};
interface Workable { // 인터페이스 생성
void work(); // 반환타입이 없는 추상메서드 선언
}
public class Main { // 메인클래스
public static void main(String[] args) {
💡 Workable인터페이스 참조변수타입에 '철수' 익명 구현 객체 생성
Workable 철수 = new Workable() { //;대신 중괄호로 열어줌
💡 '철수'익명구현객체 workOverTime()메서드 생성
private void workOverTime() {
System.out.println("야근 중...ㅠㅠ");
}
💡 인터페이스 Workable 오버라이딩
@Override
public void work() {
System.out.println("수업 중...");
workOverTime(); //추가
}
};
아래의 코드는 일반적인 sum메서드이다.
int sum(int num1, int num2) { return num1 + num2; }
💡 sum메서드를 람다식으로 바꿔보자!
(int num1, int num2) -> num1 + num2
함수형 인터페이스인 경우 아래와 같이 매개변수타입도 생략이 가능하다.
(num1, num2) -> num1 + num2
함수형 인터페이스에 대해서는 따로 설명하겠다.