자바 익명 클래스 + 람다식(간단)
포스팅에 앞서 내용이 틀릴 수 있습니다.
해당 부분 지적 감사히 받습니다.
이전시간에는 중첩, 내부 클래스에 대해 배웠다.
원래 익명클래스도 한 번에 다뤘어야 했는데, 피곤해서 나눴다.
익명클래스는 지역 클래스의 종류이다.
근데 이름이 없다.
그래서 생성할 때 딱 한 번만 해당 클래스의 인스턴스를 만들 수 있다.
그리고 선언과 동시에 내부를 구현한다.
또 기본생성자만 가지며 반드시 부모클래스 혹은 인터페이스가 있어야 만들 수 있다.
코드예제를 보자.
인터페이스
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 버전 이후부터, 클래스를 선언하는 잡다한 부분을 제외하고, 기능을 하는 메서드만 넘겨줄 수 있게 패치되었다.
그래서 매개변수로 인터페이스를 넘겨주는데 이안에 메서드만 쓸 수도 있구나~ 정도만 지금은 알아두자.
다음엔 예외처리에 대해 배워보자.
강의가 길고 개발건 테스트 때문에, 며칠 공백이 생길 수도 있다.