본문 바로가기
Backend Study/나Java봐라~

익명클래스 → 람다 ???

by DaSsom 2023. 4. 19.

추상클래스 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

 

코드라떼::익명클래스와 람다

 

[자바 무료 강의] [심화] 익명 클래스와 람다

익명 클래스와 람다에 대해서 알아보는 강의입니다. 내용 자체가 어려운 부분이 있으므로 차분히 이해하면서 넘어가야 합니다. 그럼에도 이해가 안 된다면 해당 강의는 넘어가셔도 됩니다.

www.codelatte.io

Dreamchaser's Note

 

Java Lambda

개요 자바 람다식은 자바8부터 도입된 함수형 인터페이스를 구현한 코드를 간결하게 쓸 수 있게 해주는 문법이다. 여기서는 람다식의 문법 혹은 람다가 어떻게 도입되었는지, 얼마나 혁명적인

dreamchaser3.tistory.com