JAVA

[JAVA] 익명 클래스에 대하여

때래뚫 2023. 7. 10. 11:01

람다식이란?

메서드를 하나의 식으로 표현한 것으로 실제 로직을 정해두지 않은 익명 객체의 함수를 객체의 선언과 동시에 식을 세우면서 가독성을 높이고, 그때마다 필요한 로직으로 좀 더 자유로운 코딩을 가능하게 해줍니다.

 

익명 객체?

보통 JS나 다른문법에서는 lambda식을 익명 함수라 칭하는 경우가 많습니다. 하지만 익명 객체라 뜻하는 것은 JAVA에서는 메서드가 단독 존재하는 것이 아니라, 항상 어떤 객체안에 메서드가 존재하기때문에 익명함수를 만들기 위해서는 익명 클래스를 먼저 선언한 후 클래스 안에 익명 함수를 선언해야 하기 때문입니다.

 

예제

우선 기존에 존재하는 메서드를 람다식으로 표현하는 예제를 먼저 보겠습니다.

public class lambda {
    public static void main(String[] args) {
	//배열
	int[] a = {1,2,3,4,5};
        
        // 람다식 표현
        Arrays.stream(a).forEach( item -> System.out.println(item));

        System.out.println();
        
        // 기존 표현
        for(int item : a){
            System.out.println(item);
        }
    }
}

위 코드에서 출력하는 결과는 두 식 모두 같습니다. 지금 당장은 수행하는 로직이 한줄밖에 되지않아 차이가 없어보이지만, 두줄에서 세줄만 되어도 가독성 차이가 심해집니다. 이제 익명 클래스를 선언해 보겠습니다.

 

익명 클래스

익명 클래스는 함수형 인터페이스를 통해 설명 드리겠습니다. 함수형 인터페이스는 @FunctionalInterface 어노테이션을 통해 선언하며, 하나의 익명함수만을 가질 수 있습니다.

 

우선 첫 번째로 새로운 인터페이스를 생성합니다.

인터페이스 생성

생성한 인터페이스에 @FunctionalInterface 어노테이션을 붙입니다.

빨간줄이 뜨는 이유는 아직 타깃 메서드를 작성하지 않아서 입니다.

이제 사용할 메서드를 선언합니다.

에러가 사라졌다!

 

하지만 위에서 설명했듯이 메서드를 두개 이상 선언하면 에러가 발생합니다.

두개이상 작성하면 에러!

 

이제 다시 calc메서드만 남기고 다른 클래스에서 사용해보겠습니다.

public class lambda {
    public static void main(String[] args) {
        int x = 10, y = 11;
        
        // 익명 클래스 선언 및 람다식을 통한 재정의
        NewLambda lambda = (int a,int b) -> { return a+b;};

		// 익명함수 작동
        int c = lambda.calc(x,y);
        System.out.println(c);
    }
}

위 처럼 익명 클래스는 객체를 선언 할 때마다 수행 로직을 변경하여 사용할 수 있습니다. 또한 람다식을 사용하여 좀 더 간결한 코드로 보이도록 할 수 있었습니다.

 

익명 객체를 사용하면 여러 객체를 선언함으로써 인터페이스처럼 상황에 맞는 로직을 수행할 수 있습니다. 이번엔 빼기연산을 수행하는 메서드를 추가하겠습니다.

public class lambda {
    public static void main(String[] args) {
        int x = 10, y = 11;
        NewLambda lambda =(int a,int b) -> {return a+b;};
	//새로운 익명 객체 추가
        NewLambda minus = (int a, int b) -> {return a-b;};
	// -연산 메서드 실행 후 리턴값 반환
        int min = minus.calc(y,x);

        System.out.println(min);
    }
}

이 처럼 객체를 선언함과 동시에 익명함수를 새롭게 정의하여 다른 로직을 객체별로 수행하게 만들었습니다. 하지만 너무 남발하면 오히려 가독성이 떨어지는 부분이 생기므로 주의해야합니다.

 

오늘 람다식에 대하여 작성하려했지만 아직 많은 부분이 부족하여 글을 쓰다보니 익명 클래스에 대한 내용이 더 많은 것 같습니다. 읽어주셔서 감사합니다.

 

 

-- 07/14 익명클래스의 설명에 함수형인터페이스와 설명이 섞어 혼동되게 적혔습니다. 수정 완료한 상태이고 잘못된 정보를 공유드려 죄송합니다.