일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 객체
- 클래스
- 자바 다형성
- 멤버변수
- Rxjava Observable
- 안드로이드 라이선스
- jvm이란
- 플러터 설치 2022
- 서비스 vs 쓰레드
- 안드로이드 유닛테스트란
- android ar 개발
- rxjava hot observable
- android retrofit login
- 안드로이드 유닛 테스트
- 안드로이드 os 구조
- 안드로이드 레트로핏 crud
- 안드로이드 라이선스 종류
- rxjava cold observable
- 2022 플러터 설치
- 2022 플러터 안드로이드 스튜디오
- 큐 자바 코드
- ar vr 차이
- 안드로이드 유닛 테스트 예시
- 서비스 쓰레드 차이
- ANR이란
- jvm 작동 원리
- 스택 큐 차이
- 안드로이드 레트로핏 사용법
- 스택 자바 코드
- rxjava disposable
- Today
- Total
나만을 위한 블로그
[이펙티브 코틀린] 아이템 9. use를 써서 리소스를 닫아라 본문
더 이상 필요하지 않을 때 close()를 써서 명시적으로 닫아야 하는 리소스가 있다.
- Input/OutputStream
- java.sql.Connection
- java.io.Reader(FileReader, BufferedReader, CSSParser)
- java.new.socket, java.util.Scanner
이런 리소스들은 AutoCloseable을 상속받는 Closeable 인터페이스를 구현하고 있다.
이런 모든 리소스는 최종적으로 리소스에 대한 레퍼런스가 없어질 때 가비지 컬렉터가 처리하지만 굉장히 느리고 그 동안리소스를 유지하는 비용이 많이 들어간다. 따라서 더 이상 필요없다면 명시적으로 close()를 호출하는 게 좋다.
전통적으로 이런 리소스는 try-catch 블록을 써서 처리한다.
fun countCharactersInFile(path: String): Int {
val reader = BufferedReader(FileReader(path))
try {
return reader.lineSequence().sumBy { it.length }
} finally {
reader.close()
}
}
이런 코드는 복잡하고 좋지 않다. 리소스를 닫을 때 예외가 발생할 수도 있는데 이런 예외를 따로 처리하지 않기 때문이다.
또한 try 블록, finally 블록 안에서 오류가 발생하면 둘 중 하나만 전파된다. 둘 다 전파될 수 있으면 좋겠지만 이걸 직접 구현하려면 코드가 길고 복잡해진다. 그래도 많이 쓰이는 일반적인 구현이라 표준 라이브러리에 use란 함수로 포함돼 있다.
use()를 써서 앞의 코드를 바꾸면 아래와 같다.
fun countCharactersInFile(path: String): Int {
val reader = BufferedReader(FileReader(path))
reader.use {
return reader.lineSequence().sumBy { it.length }
}
}
람다 매개변수로 리시버(현재 코드에선 reader)가 전달되는 형태도 있으므로 줄여서 아래처럼 쓸 수도 있다.
fun countCharactersInFile(path: String): Int {
BufferedReader(FileReader(path)).use { reader ->
return reader.lineSequence().sumBy { it.length }
}
}
파일을 리소스로 쓰는 경우가 많고 파일을 한 줄씩 읽어들이는 경우도 많으므로 코틀린 표준 라이브러리는 파일을 한 줄씩 처리할 때 활용될 수 있는 useLines()도 제공한다.
fun countCharactersInFile(path: String): Int {
File(path).useLines { lines ->
return lines.sumBy { it.length }
}
}
이렇게 처리하면 메모리에 파일 내용을 한 줄씩만 유지하므로 대용량 파일도 적절하게 처리 가능하지만 파일의 줄을 단 한번만 쓸 수 있다는 단점이 있다. 파일의 특정 줄을 2번 이상 반복 처리하려면 파일을 2번 이상 열어야 한다. 앞의 코드는 아래처럼 간단히 쓸 수 있다.
fun countCharactersInFile(path: String): Int =
File(path).useLines { lines ->
lines.sumBy { it.length }
}
'책 > Effective Kotlin' 카테고리의 다른 글
[이펙티브 코틀린] 아이템 11. 가독성을 목표로 설계하라 (0) | 2022.06.19 |
---|---|
[이펙티브 코틀린] 아이템 10. 단위 테스트를 만들어라 (0) | 2022.06.05 |
[이펙티브 코틀린] 아이템 8. 적절하게 null을 처리하라 (0) | 2022.05.29 |
[이펙티브 코틀린] 아이템 7. 결과 부족이 발생할 경우 null, Failure를 사용하라 (0) | 2022.05.26 |
[이펙티브 코틀린] 아이템 6. 사용자 정의 오류보다는 표준 오류를 사용하라 (0) | 2022.05.26 |