기술스택/자바(Spring)

자바 익명 클래스 + 람다식(간단)

ys.k 2025. 2. 18. 00:05

포스팅에 앞서 내용이 틀릴 수 있습니다.
해당 부분 지적 감사히 받습니다.

 

이전시간에는 중첩, 내부 클래스에 대해 배웠다.

 

원래 익명클래스도 한 번에 다뤘어야 했는데, 피곤해서 나눴다.

 

익명클래스는 지역 클래스의 종류이다.

 

근데 이름이 없다.

 

그래서 생성할 때 딱 한 번만 해당 클래스의 인스턴스를 만들 수 있다.

 

 그리고 선언과 동시에 내부를 구현한다.

 

또 기본생성자만 가지며 반드시 부모클래스 혹은 인터페이스가 있어야 만들 수 있다.

 

코드예제를 보자.

 

인터페이스

public interface Printer {
    void print();
}

 

익명 클래스

Printer printer = new Printer() {
    int value = 0;

    @Override
    public void print() {
        System.out.println("value=" + value);

        //인스턴스는 지역 변수보다 더 오래 살아남는다.
        System.out.println("localVar=" + localVar);
        System.out.println("paramVar=" + paramVar);
        System.out.println("outInstanceVar=" + outInstanceVar);
    }
};

printer.print();

 

코드에서 보다시피 Printer 타입의 printer의 인스턴스를 구현함과 동시에 클래스 내용을 중괄호 사이에 입력하였다.

 

익명클래스는 인터페이스를 구현하였으며, 메서드 오버라이딩까지 진행한 것을 볼 수 있다.

 

맨 아래 printer.print()를 통해 바로 접근할 수 있다.

 

다만 같은 내용의 익명클래스를 여러 번 생성해야 하거나, 내용이 너무 복잡한 경우에는 그냥 지역 클래스로 생성하는 것이 맞다.

 

아래 코드로 람다에 대해 간단히만 알아보자.

 

지금은 깊게 다루지 않을 거 기에 구두 설명만 하고 넘어가겠다.

public static void hello(Process process) {
    System.out.println("프로그램 시작");

    //코드 조각 시작
    process.run();
    //코드 조각 종료

    System.out.println("프로그램 종료");
}

public static void main(String[] args) {

    hello(() ->{
        int randomValue = new Random().nextInt(6) + 1;
        System.out.println("주사위 = " + randomValue) });

    hello(()-> {
        for (int i = 0; i < 3; i++) {
        System.out.println("i = " + i);
    }});
}

 

위 hello() 메서드를 보면 Process 인터페이스를 매개변수로 받는다.

 

그리고 인터페이스 Process에는 run()이라는 추상 메서드가 선언되어 있다.

 

즉 main에서는 hello()를 실행하며 Process 타입의 인스턴스 참조값을 넘겨주고 있는 것과 같다.

 

사실 이건 익명 클래스를 넘겨주는 것인데, 람다식이라고 자바 8 버전 이후부터, 클래스를 선언하는 잡다한 부분을 제외하고, 기능을 하는 메서드만 넘겨줄 수 있게 패치되었다.

 

그래서 매개변수로 인터페이스를 넘겨주는데 이안에 메서드만 쓸 수도 있구나~ 정도만 지금은 알아두자.

 

다음엔 예외처리에 대해 배워보자.

 

강의가 길고 개발건 테스트 때문에, 며칠 공백이 생길 수도 있다.