본문 바로가기
학습/Java

[java] 익명 클래스와 람다식

by KKambi 2020. 6. 10.

익명 클래스

- 추상클래스를 상속하거나 인터페이스를 구현한, 이름없는 클래스

- 재사용이 필요없는 인스턴스를 생성할 때 사용

 

 

사용법

CustomInterface inf = new CustomInteface(){
	//인터페이스의 추상 메소드 구현
};

- 상속(구현)하는 추상클래스(인터페이스)의 모든 추상메소드를 구현해야 한다.

- 익명 인스턴스에서만 사용할 수 있는 필드와 메소드 선언 가능

- 익명 클래스도 컴파일 성공 시, 클래스파일이 생성된다.

 

 

예시

//구현 대상
public interface Person {
    public void foo();
    public void bar();
}


public class SampleApplication {
    public static void main(String[] args) {
    	//인터페이스를 구현한 익명 클래스로 인스턴스 생성
        Person kkambi = new Person(){
            int fooCnt = 0;
            int barCnt = 0;
            
            @Override
            public void foo() {
            	fooCnt += 1;
            }
            
            @Override
            public void bar() {
            	barCnt += 1;
            }
            
            public void print() {
            	System.out.println(fooCnt);
                System.out.println(barCnt);
            }
        }
        
        kkambi.foo();
        kkambi.bar();
        kkambi.print();		// 1 1
    }
}

 

 

람다식을 사용하지 않고, 익명 구현 객체만 사용한 예시

new Thread(new Runnable() {

    @Override
    public void run() {
        for (int i=0; i<10; i++) {
            System.out.println("run!");
        }
    }
}).start();

- Runnable 인터페이스의 run( ) 메소드를 구현하여, 익명 클래스의 익명 인스턴스를 생성했다.

 

 

람다식

- 익명 메소드만 전달하여, 인터페이스를 구현한 익명 클래스의 인스턴스를 생성하는 방법

- 메소드만 전달하지만, 결과적으로 익명 구현 객체를 만들게 된다.

 

 

람다식의 원리

- 람다식이 구현할 인터페이스는 단 1개의 추상 메소드를 가지고 있어야 한다.

- 람다식이 구현할 인터페이스는 @FunctionalInterface 어노테이션이 선언되어 있어야 한다.

- 익명 메소드를 전달하면, 단 1개의 추상 메소드를 구현한 익명 인스턴스를 생성해낸다.

 

 

람다식을 사용한 예시

new Thread(() -> {
    for (int i=0; i<10; i++) {
    	System.out.println("run!");
    }
}).start();

- 인스턴스 생성 코드를 생략하고, 메소드만 전달할 수 있다.

- 자바스크립트의 화살표 함수(Arrow Function)을 전달한 것을 생각하면 된다.

 

 

람다식을 주로 사용하는 곳

1. Runnable 인터페이스의 run( ) 구현

2. Comparable 인터페이스의 compareTo( ) 구현

'학습 > Java' 카테고리의 다른 글

[java] 가비지 컬렉션  (0) 2020.07.05
[java] Stack & Heap과 Reference의 개념  (0) 2020.06.28
[java] Proxy Pattern  (0) 2020.03.23
[java] Annotation Processor란? (추가공부 필요)  (0) 2020.03.21
[java] Optional 클래스  (0) 2020.02.29

댓글