Kotlin에서 무작위로 자주 사용되는 관용구 모음이다.
Create DTOs (POJOs/POCOs)
data class Customer(val name: String, val email: String)
Customer 클래스에 다음 기능을 제공한다.
- 모든 프로퍼티에 대한 getters (var의 경우 setter 포함)
- equals()
- hashCode()
- toString()
- copy()
- 모든 속성에 대한 component1(), component2(), ...,
함수 파라미터의 기본 값
fun foo(a: Int = 0, b: String = "") { ... }
리스트 필터링
val positives = list.filter { x -> x > 0 }
또는 더 짧게
val positives = list.filter { it > 0 }
컬렉션에 element가 있는지 확인
if ("john@example.com" in emailsList) { ... } // 존재 할 때
if ("jane@example.com" !in emailsList) { ... } // 존재하지 않을 때
문자열 보간
println("Name $name")
인스턴스 확인
when (x) {
is Foo -> ...
is Bar -> ...
else -> ...
}
읽기 전용 리스트
val list = listOf("a", "b", "c")
읽기 전용 맵
val map = mapOf("a" to 1, "b" to 2, "c" to 3)
맵 entry에 접근
println(map["key"])
map["key"] = value
맵 또는 리스트의 pair 탐색
for ((k, v) in map) {
println("$k -> $v")
}
k와 v 는 이름과 나이 같은 편리한 것일 수 있다.
범위 내의 순회
for (i in 1..100) { ... } // closed range: includes 100
for (i in 1 until 100) { ... } // half-open range: does not include 100
for (x in 2..10 step 2) { ... }
for (x in 10 downTo 1) { ... }
if (x in 1..10) { ... }
Lazy 프로퍼티
val p: String by lazy {
// 문자열 연산
}
확장 함수
fun String.spaceToCamelCase() { ... }
"Convert this to camelcase".spaceToCamelCase()
싱글톤 생성
object Resource {
val name = "Name"
}
추상 클래스 인스턴스화
abstract class MyAbstractClass {
abstract fun doSomething()
abstract fun sleep()
}
fun main() {
val myObject = object : MyAbstractClass() {
override fun doSomething() {
// ...
}
override fun sleep() { // ...
}
}
myObject.doSomething()
}
null이 아닌 경우 짧게 사용
val files = File("Test").listFiles()
println(files?.size) // 파일이 null이 아닌 경우 크기가 출력 됨.
null이 아닌 경우 및 대체 짧게 사용
val files = File("Test").listFiles()
println(files?.size ?: "empty") // 파일이 null이면 "empty" 출력
null인 경우 Statement 실행
val values = ...
val email = values["email"] ?: throw IllegalStateException("Email is missing!")
empty 상태일 수도 있는 컬렉션의 첫 번째 항목 가져오기
val emails = ... // 비어 있을 수 있음
val mainEmail = emails.firstOrNull() ?: ""
null이 아닌 경우 실행
val value = ...
value?.let {
... // null이 아니면 이 블럭을 실행한다.
}
null이 아닌 경우 nullable 값 매핑
val value = ...
val mapped = value?.let { transformValue(it) } ?: defaultValue
// 값 또는 변환 결과가 null이면 defaultValue가 반환된다.
when문에서 Statement 반환하기
fun transform(color: String): Int {
return when (color) {
"Red" -> 0
"Green" -> 1
"Blue" -> 2
else -> throw IllegalArgumentException("Invalid color param value")
}
}
try-catch 표현식
fun test() {
val result = try {
count()
} catch (e: ArithmeticException) {
throw IllegalStateException(e)
}
// 결과 작업
}
if 표현식
fun foo(param: Int) {
val result = if (param == 1) {
"one"
} else if (param == 2) {
"two"
} else {
"three"
}
}
Unit 타입을 반환하는 Builder-style 메서드 사용
fun arrayOfMinusOnes(size: Int): IntArray {
return IntArray(size).apply { fill(-1) }
}
단일 표현식 함수
fun theAnswer() = 42
이것은 동등하다.
fun theAnswer(): Int {
return 42
}
이것은 다른 관용구와 효과적으로 결합하여 코드를 단축시킬 수 있다. 예를 들어 When 표현식은 다음과 같다.
fun transform(color: String): Int = when (color) {
"Red" -> 0
"Green" -> 1
"Blue" -> 2
else -> throw IllegalArgumentException("Invalid color param value")
}
오브젝트 인스턴스에서 여러개의 메서드 호출 (with)
class Turtle {
fun penDown()
fun penUp()
fun turn(degrees: Double)
fun forward(pixels: Double)
}
val myTurtle = Turtle()
with(myTurtle) { // 100 pixel의 정사각형을 그린다.
penDown()
for (i in 1..4) {
forward(100.0)
turn(90.0)
}
penUp()
}
오브젝트의 프로퍼티 구성 (apply)
val myRectangle = Rectangle().apply {
length = 4
breadth = 5
color = 0xFAFAFA
}
이것은 오브젝트 생성자에 없는 속성을 구성하는데 유용하다.
Java 7의 try-with-resources
val stream = Files.newInputStream(Paths.get("/some/file.txt"))
stream.buffered().reader().use { reader ->
println(reader.readText())
}
제네릭 타입의 정보가 필요한 제네릭 함수
// public final class Gson {
// ...
// public <T> T fromJson(JsonElement json, Class<T> classOfT) throws JsonSyntaxException {
// ...
inline fun <reified T: Any> Gson.fromJson(json: JsonElement): T = this.fromJson(json, T::class.java)
Nullable Boolean
val b: Boolean? = ...
if (b == true) {
...
} else {
// `b` 는 false 이거나 null이다.
}
2개의 변수 swap
var a = 1
var b = 2
a = b.also { b = a }
코드가 완성되지 않는 것으로 표시 (TODO)
Kotlin의 표준 라이브러리에는 항상 NotImplementedError를 발생시키는 TODO() 함수가 있다. 반환 유형은 Nothing이므로 예상 유형에 관계없이 사용할 수 있다. 매개변수를 허용하는 오버로드도 있다.
fun calcTaxes(): BigDecimal = TODO("Waiting for feedback from accounting")
IntelliJ IDEA의 kotlin plugin은 TODO()의 의미를 이해하고 TODO 도구 창에 코드 포인터를 자동으로 추가한다.
원문
Idioms | Kotlin
kotlinlang.org
'프로그래밍 > Android' 카테고리의 다른 글
[Kotlin] Basic types (기본 타입) (0) | 2021.08.29 |
---|---|
[Kotlin] Coding conventions (0) | 2021.08.26 |
[Kotlin] Basic syntax (기본 구문) (0) | 2021.08.24 |
Android RecylerView 새로고침 & 데이터 추가 (0) | 2021.07.28 |
Android Service 관련 이슈(롤리팝 이상) (0) | 2021.04.20 |