본문은 Effective Kotlin을 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다.
1. use를 사용하여 Closeable 리소스 닫기
close 메서드를 사용해서 명시적으로 닫아야 하는 리소스들이 있다.
- InputStream / OutputStream
- java.sql.Connection
- java.io.Reader(FileReader, BufferedReader, CSSParser)
- java.new.Socket과 java.util.Scanner
위 친구들은 AutoCloseable을 상속받는 Closeable 인터페이스를 구현하고 있다.
Closeable의 구현체들은 반드시 close()를 호출해서 리소스를 반납해줘야 하는데, 이는 가비지 컬렉터의 처리가 늦고 리소스의 비용이 높기 때문이다.
package java.io;
import java.io.IOException;
public interface Closeable extends AutoCloseable {
public void close() throws IOException;
}
- 참고로 Closeable은 구버전의 호환성을 위해 존재하는 인터페이스로, 그 목적 자체는 AutoCloseable과 동일하고 던지는 Exception만 다르다 (링크)
자바에선 try-with-resources를 사용하면 되는데, 코틀린에도 이에 대응하는 use라는 함수가 있다.
try-with-resour이펙티브 자바 아이템9를 참고하자.
fun countCharactersInFile(path: String): Int {
BufferedReader(FileReader(path)).use { reader ->
return reader.lineSequence().sumBy { it.length }
}
}
여러 개의 리소스를 한 블럭 내에서 사용할 수 있는 try-with-resources와 달리, use는 확장함수로 제공되어 단일 리소스를 대상으로 한다는 것이 특징이다.
// try-with-resources
// https://www.baeldung.com/java-try-with-resources
private void orderOfClosingResources() throws Exception {
try (AutoCloseableResourcesFirst af = new AutoCloseableResourcesFirst();
AutoCloseableResourcesSecond as = new AutoCloseableResourcesSecond()) {
af.doSomething();
as.doSomething();
}
}
// use
// https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/use.html
inline fun <T : Closeable?, R> T.use(block: (T) -> R): R
'책 > Effective Kotlin' 카테고리의 다른 글
[이펙티브 코틀린] 아이템17: 이름 있는 아규먼트를 사용하라 (0) | 2023.07.23 |
---|---|
[이펙티브 코틀린] 아이템16: 프로퍼티는 동작이 아니라 상태를 나타내야 한다 (0) | 2023.07.21 |
[이펙티브 코틀린] 아이템8: 적절하게 null을 처리하라 (0) | 2023.07.04 |
[이펙티브 코틀린] 아이템7: 결과 부족이 발생할 경우 null과 Failure를 사용하라 (0) | 2023.07.04 |
[이펙티브 코틀린] 아이템5: 예외를 활용해 코드에 제한을 걸어라 (0) | 2023.07.03 |