추상클래스 Person이 있고 그 안에 abstract 메소드가 2개가 있다.
그걸 Main 클래스에서 new 연산자를 이용해 Person 클래스를 상속 받는 익명 클래스의 인스턴스를 만들어준다.
메인 클래스 내부에 익명 클래스를 선언해주어 Person의 abstract 메소드를 override 해준다.
이것이 추상 클래스를 상속받는 익명 클래스의 사용 예시!!
이번엔 익명클래스의 진가를 인터페이스에서 알 수 있다고 하는데, 그 예시를 보자
여기 Calculator 클래스가 있고 그 안에 생성자와 result라는 메소드가 들어있다. result 메소드에 들어온 매개변수 Operate는 아래에서 확인
이렇게 Operate 인터페이스에는 그 인터페이스를 상속받는 Minus 와 Plus 클래스가 있음
이걸 또 다시
메인 클래스에서 구현하려면 이렇게 새로운 객체를 계속 생성해서 반복해주어야 한다. 지금은 Plus 와 Minus 만 예시로 들었지만 더 많은 연산을 시도하려면 또 새로운 클래스를 만들고 객체 만들고 ... 해줘야함
그래서 이걸 ~ 익명 클래스를 활용하면??
이렇게 새로운 클래스를 만들 필요 없이 메인 클래스 내부에서 익명 클래스로 선언하여 사용이 가능하다.
근데 이제 이마저도 너무 길고, 복잡하다고 생각해서 람다를 사용하면 ???
이렇게 초 깔끔해진다는거지.
근데 그렇다고 해서 모든 람다식의 표현을 익명 클래스로 바꿀 수 있는 것은 아니다.
람다식으로 객체를 생성하는 코드를 역어셈블 해보면 invokedynamic 이라는 명세로 뱉어낸다고 함.
invoke ( 부르다 ) + dynamic ( 동적 ) → 말 그대로 "동적으로 부른다."
그러니까 컴파일 시점이 아니라 런타임 시점에 동적으로 클래스를 정의하고 그 인스턴스를 생성해서 반환한다는 뜻
람다가 새로운 함수 체계를 만들었다기 보다 기존 invokedynamic 이라는 바이트코드 명세를 활용해 새로운 차이를 만들어냈다고 한다.
람다가 컴파일 될 때, 컴파일 타임에 클래스가 정의되지 않고 런타임에 JVM이 요리하도록 invokedynamic 바이트 코드를 전달해주면 JVM이 그 시점에 효율적인 방식으로 유연하게 객체를 생성해 쓸 수 있는 장점이 있다.
익명 클래스는 매번 새 클래스를 정의하고 객체를 생성하는 문제점이 있었고 그래서 그 문제를 해결하기 위해 람다식이 등장하였다. 그리고 람다는 동적 구현 방식이 매우 유연하기 때문에 더 효율적으로 발전할 수 있다.
그렇다고 한다...
reference
'Backend Study > 나Java봐라~' 카테고리의 다른 글
연산자 (0) | 2023.08.06 |
---|---|
자바 데이터 타입, 변수 그리고 배열 (0) | 2023.08.03 |
자바 소스파일(.java)을 JVM으로 실행하는 과정 (0) | 2023.07.30 |
인텔리제이에서 shift + F10 을 누르면 생기는 일 (1) | 2023.04.13 |