문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
java:8 [2013/12/17 11:03] kwon37xi |
java:8 [2017/12/12 10:42] (현재) kwon37xi |
||
---|---|---|---|
줄 1: | 줄 1: | ||
====== Java 8 ====== | ====== Java 8 ====== | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
===== Lambda ===== | ===== Lambda ===== | ||
줄 6: | 줄 11: | ||
===== @Reapeatable ===== | ===== @Reapeatable ===== | ||
* [[http:// | * [[http:// | ||
+ | <code java> | ||
+ | @Repeatable(Annas.class) | ||
+ | @interface Anna { int value(); } | ||
+ | |||
+ | @interface Annas { | ||
+ | Anna[] value(); | ||
+ | } | ||
+ | |||
+ | @Anna(1) | ||
+ | @Anna(2) | ||
+ | class JavaBeat{} | ||
+ | |||
+ | // -> 자동으로 아래 형태로 변환 | ||
+ | @Annas({@Anna(1), | ||
+ | class JavaBeat{} | ||
+ | </ | ||
+ | |||
+ | ===== Stamped Lock ===== | ||
+ | *[[http:// | ||
==== What's new ==== | ==== What's new ==== | ||
* [[http:// | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | ==== Lambda ==== | ||
+ | 이일민님의 Java 8 람다에 관한 정리 | ||
+ | < | ||
+ | 자바 람다식 정리해보자. | ||
+ | |||
+ | 컴파일러에 의해서 람다식 바디는 람다식이 정의된 클래스의 메소드로 변환된다. 람다식이 위치한 자리에는 invokedynamic 명령이 들어간다. 람다 indy의 부트스트랩은 람다 메타팩토리 메소드다. | ||
+ | |||
+ | 람다 메타 팩토리에는 람다가 구현하고 있는 함수형 인터페이스(SAM 타입)와 메소드로 변환된 람다 바디를 가리키는 메소드 핸들, 람다가 캡처할 외부 변수 정보 등이 전달된다. | ||
+ | |||
+ | 람다 메타팩토리는 이름 그대로 람다 팩토리를 만드는 팩토리이다. 람다 메타팩토리는 indy의 부트스크랩 메소드로 동작해서 람다 팩토리에 대한 콜사이트를 리턴한다. | ||
+ | |||
+ | 람다 팩토리는 람다 오브젝트 또는 펑션 오브젝트라고 불리는 람다 메소드 호출을 포장한 오브젝트를 생성한다. 캡처할 변수가 없는 무상태 람다인 경우는 매번 동일한 오브젝트를 리턴하고, | ||
+ | |||
+ | 람다 오브젝트는 메타팩토리에서 동적으로 정의하는, | ||
+ | |||
+ | 람다식을 Indy로 전환하는 이유는? 람다 팩토리를 생성하는 부트스트래핑 과정 바이트코드에 고정하지 않고 언어 런타임(API)에 위임해서 향후 바이트코드 호환성을 유지하면서 람다 팩토리 전략을 발전시킬 수 있게 하기 위해서이다. 향후 디슈가된 람다 메소드를 가리키는 메소드 핸들을 람다 오브젝트를 내부 클래스로 따로 정의하지 않고도 박싱에 의해서 샘 타입으로 사용되게 할 수 있는 자바 버전이 나오면, 람다 메타팩토리를 그 방식으로 전환하기만 하면 된다. 그러면 자바8에서 컴파일된 람다를 사용하는 코드를 재컴파일 없이 그대로 새로운 람다 팩토리를 사용하는 버전에서도 사용할 수 있다. 당연히 반대도 가능하다. | ||
+ | |||
+ | 아직까지는 내부 클래스를 최적화된 방식으로(재사용 가능한 경우 매번 인스턴스를 만들지 않아도 되도록, 익명 클래스를 정적 변수에 정의해서 재사용하는 것과 유사하게) 익명 클래스처럼 만들고, 람다 바디는 메소드 형태로 분리하고 위임해서 동작하도록 만드는 정도이다. | ||
+ | 자바8 람다는 람다를 번거롭게 보이는 SAM 타입으로 포장해서라도 과거 버전 라이브러리를 재사용할 수 있게 만들고, Indy-메타팩토리를 이용해 미래 버전과의 바이트코드 호환성을 지키려는 노력이 잘 담겨있는 꽤나 정성스러운 작업의 결과물인 듯 하다. 까짓거 새로운 언어 만든다 생각하고 바이트코드, | ||
+ | </ | ||
+ | * '' |