이미지 출처: https://kotlinlang.org/assets/images/open-graph/kotlin_250x250.png
Kotlin Idioms
kotlinlang 사이트의 가이드문서를 기반으로 포스팅 되었음을 밝힘니다.
Kotlin에서 무작위로 자주 사용되는 Idiom 모음입니다.
코딩언어를 배울때 Basic Syntax라는 말은 많이 들어본거 같은데 Idiom이라는 말은 처음들어본거 같습니다. (ㅡ_ㅡ;)
직역하면 관용구 정도가 되는거 같은데 느낌상 주요문법 정도라고 생각하면 될 것 같습니다.
Getting Started > Idioms
출처: https://kotlinlang.org/docs/reference/idioms.html
샘플코드: https://github.com/hanjoongcho/kotlin-cookbook
Table of Contents
DTO 만들기
1 2 3 4 5 6 7 8 9 10 11 12
| // 아래처럼 클래스를 선언하면 멤버변수 및 생성자 오버로딩을 별도로 하지 않아도 되는군요~
data class Customer(val name: String, val email: String) {}
fun main(args: Array<String>) { var customer = Customer("Hanjoong Cho", "hanjoongcho@test.com") println(customer.name) println(customer.email) } -------------------------------------------------------- Hanjoong Cho hanjoongcho@test.com |
함수 파라미터 기본값 설정
1 2 3 4 5 6 7 8 9 10 11 12 13
| fun foo(a: Int = 0, b: String = "apple") { println("Index $a is $b") }
fun main(args: Array<String>) { foo() foo(1) foo(2, "peach") } -------------------------------------------------------- Index 0 is apple Index 1 is apple Index 2 is peach |
리스트에서 필터사용하기
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
| fun main(args: Array<String>) { // listOf 함수를 이용하여 리스트 선언 var list = listOf(-3, -1, 0, 1, 3, 5) // 필터를 이용하여 0보다 큰값만 필터링 val positives = list.filter { x -> x > 0 } // 필터를 이용하여 0보다 큰값만 필터링 val positives2 = list.filter { it > 0 } // in 연산자를 이용해서 리스트를 순회 for (item in positives) { println(item) } // in 연산자와 indices를 이용해서 index로 리스트를 순회 for (index in positives2.indices) { println("$index: " + positives2[index]) } } -------------------------------------------------------- 1 3 5 0: 1 1: 3 2: 5 |
String 리터럴 안에 표현식 넣기
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| // 문자열 리터럴 안에 변수값을 넣을수 있습니다. fun main(args: Array<String>) { var name = "Hanjoong Cho" // Kotlin println("Name: $name") // Java println(String.format("Name: %s", name)) } -------------------------------------------------------- Name: Hanjoong Cho Name: Hanjoong Cho |
map 순회하면서 key & value 출력하기
1 2 3 4 5 6 7 8 9 10 11 12
| fun main(args: Array<String>) { // hashMapOf 함수로 map 인스턴스 생성 및 key & value 설정 var map = hashMapOf("key1" to "apple", "key2" to "banana") // map 순회하면서 key & value 출력 for ((k, v) in map) { println("$k -> $v") } } -------------------------------------------------------- key1 -> apple key2 -> banana |
in 연산자를 이용한 for, if문 제어하기
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 31 32 33 34 35 36 37 38
| fun main(args: Array<String>) { // i값이 1부터 시작해서 10까지 1씩 증가하면서 순회 for (i in 1..10) { print("$i ") if (i == 10) println() }
// i값이 1부터 시작해서 9까지 1씩 증가하면서 순회 for (i in 1 until 10) { print("$i ") if (i == 9) println() }
// i값이 2부터 시작해서 10까지 2씩 증가하면서 순회 for (i in 2..10 step 2) { print("$i ") if (i == 10) println() }
// i값이 10부터 시작해서 1까지 1씩 감소하면서 순회 for (i in 10 downTo 1) { print("$i ") if (i == 1) println() }
var num = 3 // num값이 1 ~ 10 사이에 포함되면 true if (num in 1..10) { print("$num is fit the range") }
} -------------------------------------------------------- 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 2 4 6 8 10 10 9 8 7 6 5 4 3 2 1 3 is fit the range |
리터럴 할당이 한번만 가능한 읽기전용 객체
1 2 3 4 5 6 7 8 9 10 11 12
| fun main(args: Array<String>) { // Read-only list val readOnlyList = listOf("a", "b", "c") println(readOnlyList)
// Read-only map val readOnlyMap = mapOf("a" to 1, "b" to 2, "c" to 3) println(readOnlyMap) } -------------------------------------------------------- [a, b, c] {a=1, b=2, c=3} |
Map 객체 이용하기
1 2 3 4 5 6 7 8 9 10 11
| fun main(args: Array<String>) { var map = hashMapOf("key1" to "apple", "key2" to "banana") println(map["key1"]) println(map) map["key3"] = "pineapple" println(map) } -------------------------------------------------------- apple {key1=apple, key2=banana} {key1=apple, key2=banana, key3=pineapple} |
lazy로 상수 초기화 하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| fun main(args: Array<String>) { val lazyValue: String by lazy { println("computed!") "Hello" } println(lazyValue) println(lazyValue) println(lazyValue) } -------------------------------------------------------- computed! Hello Hello Hello |
상속없이 함수 확장하기
1 2 3 4 5 6 7 8
| fun main(args: Array<String>) { fun String.spaceToCamelCase() { println("call String.spaceToCamelCase()") } "Convert this to camelcase".spaceToCamelCase() } -------------------------------------------------------- call String.spaceToCamelCase() |
nullable 객체 컨트롤하기
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 31 32 33
| fun main(args: Array<String>) { val files = File("Test").listFiles()
// files 객체가 null이면 null를 출력하고 null이 아니면 size를 출력함 println(files?.size)
// files 객체가 null이면 empty를 출력하고 null이 아니면 size를 출력함 println(files?.size ?: "empty")
// map에 email 키값이 없을경우 "email not registered"를 리턴함 val map = mapOf("name" to "Hanjoong Cho") val email = map["email"] ?: "email not registered" println(email)
// 상수가 null이 아니면 블럭실행 val data = 81 data?.let { println("Execute if not null data is $data") }
// map이 null이 아니면 transformData 함수를 실행하고 결과값을 리턴 // map이 null이면 -1을 리턴 val mapped = map?.let { transformData(map) } ?: -1 println(map) println(mapped) } -------------------------------------------------------- null empty email not registered Execute if not null data is 81 {name=Hanjoong Cho} {name=HANJOONG CHO} |