본문 바로가기
Java

Java_익명 내부 클래스, 람다식

by 유서담 2024. 2. 26.

익명 내부 클래스

 

  • 클래스의 정의와 함께 인스턴스를 생성하는 방법 중 하나.
  • 주로 인터페이스나 추상 클래스의 인스턴스를 만들어 사용할 때 유용하게 쓰인다

 

interface MyInterface {
    void myMethod();
}

public class Main {
    public static void main(String[] args) {
        // 익명 내부 클래스를 사용한 MyInterface의 인스턴스 생성
        MyInterface myInterface = new MyInterface() {
            @Override
            public void myMethod() {
                System.out.println("Hello from myMethod!");
            }
        };

        // 익명 내부 클래스의 메서드 호출
        myInterface.myMethod();
    }
}

 

추상 메소드인 myMethod 를 가진 인터페이스 MyInterface 를 정의,

클래스 Main 에서 익명 내부 클래스를 사용하여 MyInterface 인터페이스의 추상 메소드( myMethod  )를 생성하고 구현한 예시코드

 

익명 내부 클래스를 사용하면 인터페이스나 추상 클래스의 인스턴스를 생성하면서 동시에 필요한 메소드를 구현할 수 있다

 

 

 

익명 내부 클래스를 사용했을 때 장점

 

 

간결성과 편의성 : 익명 내부 클래스를 사용하면 클래스의 정의와 인스턴스화를 한 줄로 처리할 수 있다. 이로 인해서 코드가 간결해짐

// 익명 내부 클래스를 사용하지 않을 경우
Runnable runnable = new MyRunnable();

// 익명 내부 클래스를 사용할 경우
Runnable runnable = new Runnable() {
    public void run() {
        // 구현 내용
    }
};

 

 

인터페이스의 즉석 구현 : 주로 인터페이스나 추상 클래스의 메소드를 직접 구현하는 데 사용된다. 필요한 메소드만을 오버라이드하고, 불필요한 부분은 무시할 수 있다

// Comparator를 익명 내부 클래스로 구현
Arrays.sort(array, new Comparator<Integer>() {
    public int compare(Integer a, Integer b) {
        // 비교 로직
    }
});

 

 

지역 변수 접근 : 익명 내부 클래스는 외부 범위의 지역 변수에 접근할 수 있다

// Java 7 이전에 지역 변수를 사용하는 익명 내부 클래스
final int localVar = 10;
Runnable runnable = new Runnable() {
    public void run() {
        System.out.println(localVar);
    }
};

 

 

Java 8부터는 람다식이 나와서 익명 내부 클래스보다 더 간결하고 가독성이 좋아 람다식을 더 많이 사용한다

 

 

람다식

람다식은 함수형 인터페이스를 구현하기 위한 간결한 방법으로 사용된다

 

함수형 인터페이스 : 하나의 추상 메소드를 갖는 인터페이스

다시말하면 람다식은 추상 메소드가 한 개인 인터페이스에만 작성할 수 있다

 

 

 

람다식의 구조

(매개변수들) -> { 실행문들 }

 

매개변수들: 람다식이 사용할 매개변수

->: 람다 연산자로, 매개변수들과 실행문들을 구분하는 역할

{ 실행문들 }: 람다식이 수행할 코드 블록

 

 

람다식 예시

// 인터페이스 선언
interface MyFunction {
    int apply(int x);
}

public class LambdaExample {
    public static void main(String[] args) {
        // 람다식 사용
        MyFunction myFunction = (x) -> x * 2;
        
        // 메서드 호출
        int result = myFunction.apply(5);
        System.out.println(result);  // 출력: 10
    }
}

 

'Java' 카테고리의 다른 글

Java_스레드와 동기화  (1) 2023.12.04
Java_네트워크, I/O  (0) 2023.11.29
Java_I/O(입출력)  (1) 2023.11.27
Java_객체의 직렬화와 역직렬화  (1) 2023.11.26
Java_예외처리  (0) 2023.11.22