프로그래밍 언어/Kotlin (코틀린)

[코틀린 레퍼런스 번역] 시작하기 - 관용표현 (Idioms)

날개 2018. 11. 15. 14:11

[코틀린 레퍼런스 번역]

시작하기 - 관용표현 (Idoms)


원문 : Kotlin 공식 사이트 Reference : Getting Started - Idioms

번역 : 날개코더



이글은 코틀린 공식 웹사이트의 레퍼런스를 번역(의역)한 글이며, 원글은 Apache 2 license를 따르고 있습니다.

이 번역글은 자유롭게 링크를 허용합니다. 하지만 그대로 복사하여 자신이 쓴 글인것처럼 블로그나 웹사이트등에 게제 하는 것은 허용하지 않습니다.

내용상 의미가 쉽게 이해되도록 변경한 부분들도 있으며, 의미가 불분명한 부분을 주석을 달아 놓았습니다.

이글을 쓸 당시, 기반이 되는 코틀린의 버전은 1.3입니다. 본 글에서 링크들은 번역된 글이 있으면, 번역된 글로, 아직 번역이 되지 않은 글에는 원문을 링크하였습니다.




코틀린에서 무작위로 자주 사용하는 관용적인적인 사용법에 대한 모음입니다. 혹시 제일 좋아하는 관용적인 방법이 있다면 보내주세요. (역주: 코틀린 커뮤니티에 그런 패턴이 있으면 알려 달라는 뜻인듯)



DTOs (POJOs/POCOs) 만들기


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


여기에서 Customer 클래스는 아래의 기능들을 제공합니다:

- 모든 프로퍼티들에 대한 게터(getter)들과 변수에 따라 세터(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 }



문자열에 삽입하기 


println("Name $name")



인스턴스 체크하기


when (x) {

    is Foo -> ...

    is Bar -> ...

    else   -> ...

}



맵을 키/값 쌍으로 탐색하기


for ((k, v) in map) {

    println("$k -> $v")

}


여기에서 k, v 는 anything 으로 불립니다. (역주: anything은 번역하기가 애매하네요. 번역하면 어색해서 그냥 그대로 사용하면 될 것 같습니다.)



범위 사용하기


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) { ... }



읽기 전용 리스트


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



읽기 전용 맵


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



맵에 접근하기


println(map["key"])

map["key"] = value



Lazy 프로퍼티 (역주 : Lazy도 번역하면 어색하여 그대로 쓰겠습니다. 최신 언어들에서 지원하는 기능 중 하나로, 실제 해당 변수가 사용 될 때 할당됩니다.)


val p: String by lazy {

    // compute the string

}



확장 함수 (Extension Functions)


fun String.spaceToCamelCase() { ... }


"Convert this to camelcase".spaceToCamelCase()



싱글턴 만들기


object Resource {

    val name = "Name"

}



If not null 의 짧은 표현


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


println(files?.size)



if not null and else 의 짧은 표현


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


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



null 일 경우 실행되는 구문


val values = ...

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


(역주) 위 예문의 경우 values에 email 키에 대한 값이 없으면 예외를 발생시킨다.



비어 있을 수도 있는 컬렉션의 첫번째 아이템 가져오기


val emails = ... // 비어 있을 수도 있다.

val mainEmail = emails.firstOrNull() ?: ""


(역주) firstOrNull() 은 첫번째 아이템을 가져오되, 첫번째 아이템이 없으면 null을 반환합니다. (예외 발생하지 않음)



값이 널(null)이 아닐 때 실행


val value = ...


value?.let {

    ... // value 값이 널이 아닐때 실행 될 블록

}



값이 널(null)이 아닐 때, nullable 값을 맵핑


val value = ...


val mapped = value?.let { transformValue(it) } ?: value가-널-일때-사용할-디폴트-값



when 문을 사용하여 반환 (함수 리턴)


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)

    }


    // result 값을 사용해서 무엇인가를 한다.

}



'if' 표현식


fun foo(param: Int) {

    val result = if (param == 1) {

        "one"

    } else if (param == 2) {

        "two"

    } else {

        "three"

    }

}



Unit을 반환하는 메소드의 빌더 스타일 사용


fun arrayOfMinusOnes(size: Int): IntArray {

    return IntArray(size).apply { fill(-1) }

}



단일 표현 함수 (Single-expression function)


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 픽셀의 사각형을 그린다

    penDown()

    for(i in 1..4) {

        forward(100.0)

        turn(90.0)

    }

    penUp()

}



자바 7의 리소스 사용


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 불린형의 사용


val b: Boolean? = ...

if (b == true) {

    ...

} else {

    // `b` 가 false 이거나 null 일때

}





(C) 2018 WingsNote.com (무단 복제 및 게시 금지, 링크 허용)