본문 바로가기
프로그래밍/Kotlin

Kotlin - 관용구(Idioms)

by pentode 2019. 5. 6.

프래그래밍에서 관용구(idioms)는 자주 사용하는 코딩 형태나 패턴이 되겠습니다. 보통 같은 결과를 내는 프로그램을 다른 모양으로 작성할 수 있는데, 관용구는 주로 사용되는 형태를 말합니다. 여기에는 Kotlin에서 자주 사용되어지는 관용구(idioms)를 무작위로 모아둔 내용 입니다.


1. DTO(Data Transfer Object)s 객체 만들기

data class Customer(val name: String, val email: String) 


이 간단하게 선언한 Customer 클래스는 다음 기능들을 제공합니다. 코틀린의 Data class에 대해서는 다음에 자세히 알아보겠습니다.

- 모든 속성에 대한 getters (var로 선언 되었을 경우 setters 도 제공) 제공합니다.
- equals()
- hashCode()
- toString()
- copy()
- component1(), component2(), …, 모든 속성에 대해서 제공됩니다.


2. 함수의 매개변수에 대해 기본값을 제공합니다.

fun foo(a: Int = 0, b: String = "") { ... } 



3. 리스트를 필터링 합니다.

val positives = list.filter { x -> x > 0 } 


또는 훨씬 더 짧은 다른 방식도 있습니다.

val positives = list.filter { it > 0 } 



4. 문자열 내에 값을 넣는 방법

println("Name $name") 



5. 인스턴스 체크하기

when (x) { 
    is Foo -> ... 
    is Bar -> ... 
    else   -> ... 
} 



6. map/list내의 모든 데이터를 처리하기

for ((k, v) in map) { 
    println("$k -> $v") 
} 


k, v는 아무거나 호출되어질 수 있습니다.

7. 범위(range) 사용하기

for (i in 1..100) { ... }       // 닫힌 범위 : 100을 포함합니다. 
for (i in 1 until 100) { ... }  // 반 열린 범위 : 100을 포함하지 않습니다. 
for (x in 2..10 step 2) { ... } 
for (x in 10 downTo 1) { ... } 
if (x in 1..10) { ... } 


8. 읽기 전용 리스트(list)

val list = listOf("a", "b", "c") 



9. 읽기 전용 맵(map)

val map = mapOf("a" to 1, "b" to 2, "c" to 3) 



10. 맵(map)내의 데이터 사용하기

println(map["key"]) 
map["key"] = value 



11. 지연(lazy) 속선(property)

val p: String by lazy { 
    // 문자열을 계산합니다. 
} 



12. 확장 기능(function)

fun String.spaceToCamelCase() { ... } 


아래 처럼 사용합니다.

"Convert this to camelcase".spaceToCamelCase() 



13. 싱글톤 만들기

object Resource { 
    val name = "Name" 
} 



14. null 검사 간단히 하기

val files = File("Test").listFiles() 

println(files?.size) 



15. null이거나 아닐경우 간단히 하기

val files = File("Test").listFiles() 

println(files?.size ?: "empty") 



16. null일 경우 문장(statement) 실행하기

val values = ... 
val email = values["email"] ?: throw IllegalStateException("Email is missing!") 



17. 비어 있을 가능성이 있는 컬렉션의 첫번째 항목 가져오기

val emails = ... // might be empty 
val mainEmail = emails.firstOrNull() ?: "" 



18. null이 아니면 실행하기

val value = ... 

value?.let { 
    ... // null이 아니면 이 블럭이 실행됩니다. 
} 



19. null이 아닌 경우 null 가능 값 매핑하기

val value = ... 

val mapped = value?.let { transformValue(it) } ?: defaultValueIfValueIsNull 



20. when 문장으로 return 하기

fun transform(color: String): Int { 
    return when (color) { 
        "Red" -> 0 
        "Green" -> 1 
        "Blue" -> 2 
        else -> throw IllegalArgumentException("Invalid color param value") 
    } 
} 



21. 'try/catch' 표현식


fun test() { 
    val result = try { 
        count() 
    } catch (e: ArithmeticException) { 
        throw IllegalStateException(e) 
    } 

    // 결과를 사용한 작업이 이부분에 옵니다. 
} 



22. 'if' 표현식

fun foo(param: Int) { 
    val result = if (param == 1) { 
        "one" 
    } else if (param == 2) { 
        "two" 
    } else { 
        "three" 
    } 
} 




23. Unit를 반환하는 메소드의 Builder 스타일 사용법

fun arrayOfMinusOnes(size: Int): IntArray { 
    return IntArray(size).apply { fill(-1) } 
} 




24. 단일 표현식 함수

fun theAnswer() = 42 



이 함수는 아래 함수와 동일합니다.

fun theAnswer(): Int { 
    return 42 
} 



이것은 다른 관용구와 효과적으로 결합 할 수 있으므로 더 짧은 코드가 되어질수 있습니다. 예 : when- expression을 사용:

fun transform(color: String): Int = when (color) { 
    "Red" -> 0 
    "Green" -> 1 
    "Blue" -> 2 
    else -> throw IllegalArgumentException("Invalid color param value") 
} 




25. 객체 인스턴스에 대해 여러 메소드 호출하기 (with 사용)

class Turtle { 
    fun penDown() 
    fun penUp() 
    fun turn(degrees: Double) 
    fun forward(pixels: Double) 
} 

val myTurtle = Turtle() 
with(myTurtle) { //draw a 100 pix square 
    penDown() 
    for(i in 1..4) { 
        forward(100.0) 
        turn(90.0) 
    } 
    penUp() 
} 




26. Java 7의 try with resources 사용

val stream = Files.newInputStream(Paths.get("/some/file.txt")) 
stream.buffered().reader().use { reader -> 
    println(reader.readText()) 
} 




27. 제네릭 형식 정보가 필요한 제네릭 함수에 대한 편리한 형식

//  public final class Gson { 
//     ... 
//     public  T fromJson(JsonElement json, Class classOfT) throws JsonSyntaxException { 
//     ... 

inline fun  Gson.fromJson(json: JsonElement): T = this.fromJson(json, T::class.java) 




28. null 가능한 Boolean 사용하기

val b: Boolean? = ... 
if (b == true) { 
    ... 
} else { 
    // 'b' is false or null 
} 




29. 두 변수 교환하기

var a = 1 
var b = 2 
a = b.also { b = a } 


출처 : https://kotlinlang.org/docs/reference/idioms.html

반응형