아이템 45. 불필요한 객체 생성을 피하라
p. 311
SoftReference
모든 소프트 레퍼런스는 OutOfMemoryError가 발생하기 전에 해제되는 것이 보장됩니다.
는 javadoc의 말은 사실이 아니다.
소프트 레퍼런스가 처음 도입된 Java 1.2에서는 사실이었으나, Java 1.3.1부터 JVM 속성 -XX:SoftRefLRUPolicyMSPerMB
가 도입되었습니다.
기본값은 1000밀리초로 설정되어 있으며, 가용 힙이 10MB만 있는 경우 가비지 컬렉터는 10초 이상 사용된 레퍼런스를 해제합니다.
즉, 나머지는 해제되지 않아 OutOfMemoryError가 발생할 수 있으며, 자바독의 보장을 깨뜨립니다(이를 변경하려고 합니다).
문제는 없으며, -XX:SoftRefLRUPolicyMSPerMB=0
으로 설정하면 자바독의 내용이 다시 참이 됩니다.
아이템 46. 함수 타입 파라미터를 갖는 함수에 inline 한정자를 붙여라
코틀린에서 사용되는 crossinline
crossinline 사용 이유
비지역 반환 방지
crossinline
키워드는 람다 내에서 비지역 반환(non-local return)을 방지합니다.
이 함수에서 predicate
람다는 repeat
블록 내부에서 호출되고 있습니다.
만약 predicate
에서 비지역 반환을 사용하면, 이는 all
함수 전체에서 반환하려고 할 것입니다.
그러나 crossinline
을 사용함으로써 predicate
람다는 이 함수(all
)의 논리 흐름을 깨뜨리지 않고, 오직 그 자신의 블록에 대해서만 반환할 수 있습니다.
안전한 람다 전달
람다가 다른 실행 컨텍스트(예를 들어 다른 스레드나 콜백에서 실행될 가능성이 있는 경우)로 전달될 때, crossinline
은 람다가 종료 시 둘러싼 함수를 함께 종료하지 않도록 합니다.
코틀린에서 사용되는 noinline
noinline 사용 이유
람다를 객체로 유지
이 코드에서 noinline
키워드는 configuration
람다 파라미터를 인라인하지 않도록 지정합니다.
이는 configuration
람다가 Task 객체에 대한 확장 함수로 사용되면서, tasks.registering
및 tasks.creating
같은 메서드로 전달될 때, 함수 객체로서 전달되어야 함을 의미합니다.
함수 객체 전달
noinline
으로 지정된 람다는 일반 함수 객체로 취급되어, 필요에 따라 다른 함수에 전달하거나 저장할 수 있습니다.
이 경우, configuration
람다가 다른 메서드에 그대로 전달되어 나중에 호출될 수 있도록 합니다.
아이템 47. 인라인 클래스의 사용을 고려하라
생략
아이템 48. 더 이상 사용하지 않는 객체의 레퍼런스를 제거하라
생략
'독서' 카테고리의 다른 글
[이펙티브 코틀린] 8장. 효율적인 컬렉션 처리 (0) | 2024.08.11 |
---|---|
[이펙티브 코틀린] 6장. 클래스 설계 (0) | 2024.07.28 |
[이펙티브 코틀린] 5장. 객체 생성 (1) | 2024.07.21 |
[이펙티브 코틀린] 4장. 추상화 설계 (5) | 2024.07.15 |
[이펙티브 코틀린] 3장. 재사용성 (0) | 2024.07.08 |