[코틀린 레퍼런스 번역]
시작하기 - 관용표현 (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 (무단 복제 및 게시 금지, 링크 허용)
'프로그래밍 언어 > Kotlin (코틀린)' 카테고리의 다른 글
[코틀린 레퍼런스 번역] 시작하기 - 기초 문법 (0) | 2018.11.14 |
---|