익명 클래스
- 추상클래스를 상속하거나 인터페이스를 구현한, 이름없는 클래스
- 재사용이 필요없는 인스턴스를 생성할 때 사용
사용법
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 |
댓글