728x90

개발/Kotlin 10

[Kotlin in action] 6. μ½”ν‹€λ¦° νƒ€μž… μ‹œμŠ€ν…œ

#1. null κ°€λŠ₯μ„± (nullability) NPEλ₯Ό ν”Όν•  수 있게 돕기 μœ„ν•œ μ½”ν‹€λ¦° νƒ€μž… μ‹œμŠ€ν…œμ˜ νŠΉμ„± Nullable νƒ€μž… μ½”ν‹€λ¦° νƒ€μž… μ‹œμŠ€ν…œμ΄ null이 될 수 μžˆλŠ” νƒ€μž…μ„ λͺ…μ‹œμ μœΌλ‘œ μ§€μ›ν•œλ‹€. νƒ€μž… 이름 뒀에 ?λ₯Ό 뢙이면 κ·Έ νƒ€μž…μ˜ λ³€μˆ˜λ‚˜ ν”„λ‘œνΌν‹°μ— null μ°Έμ‘°λ₯Ό μ €μž₯ν•  수 μžˆλ‹€. ?κ°€ μ—†λŠ” νƒ€μž…μ€ κ·Έ λ³€μˆ˜κ°€ null μ°Έμ‘°λ₯Ό μ €μž₯ν•  수 μ—†λ‹€. Nullable νƒ€μž…μΈ λ³€μˆ˜μ— λŒ€ν•΄ λ³€μˆ˜.λ©”μ„œλ“œ() 처럼 λ©”μ„œλ“œλ₯Ό 직접 ν˜ΈμΆœν•  μˆ˜λŠ” μ—†λ‹€. Nullable 값을 NonNull νƒ€μž…μ˜ λ³€μˆ˜μ— λŒ€μž…ν•  수 μ—†λ‹€. val x: String? = null val y: String = x //=> Error: Type mismatch: inferred type is String? but String was ex..

개발/Kotlin 2021.08.13

[Ktor] 3. Response

Ktor Client κ°€μ΄λ“œ μš”μ•½ 정리 Ktor Documents κΈ°μ€€ 버전: 1.6.2 μ‹œλ¦¬μ¦ˆ 1. ν΄λΌμ΄μ–ΈνŠΈ, Engine 2. Request 3. Response Requestλ₯Ό μƒμ„±ν•˜λŠ” λͺ¨λ“  ν•¨μˆ˜(request, get, post, …)λŠ” HttpResponse 객체λ₯Ό λ°˜ν™˜ν•œλ‹€. Response body Raw body String val httpResponse: HttpResponse = client.get("https://ktor.io/") val stringBody: String = httpResponse.receive() ByteArray val httpResponse: HttpResponse = client.get("https://ktor.io/") val byteArrayBody: By..

개발/Kotlin 2021.08.04

[Ktor] 2. Request

Ktor Client κ°€μ΄λ“œ μš”μ•½ 정리 Ktor Documents κΈ°μ€€ 버전: 1.6.2 μ‹œλ¦¬μ¦ˆ 1. ν΄λΌμ΄μ–ΈνŠΈ, Engine 2. Request 3. Response HttpClient의 request ν•¨μˆ˜λ‘œ HTTP Requestλ₯Ό 생성할 수 μžˆλ‹€. request ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜ - λŒ€ν‘œμ μΈ μ˜ˆμ‹œ inline suspend fun HttpClient.request(urlString: String, block: HttpRequestBuilder.() -> Unit = {}): T inline suspend fun HttpClient.request(builder: HttpRequestBuilder = HttpRequestBuilder()): T 이외 λͺ¨λ“  ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜λŠ” μ—¬κΈ°μ—μ„œ 확인할 수 μžˆλ‹€. Http..

개발/Kotlin 2021.08.04

[Ktor] 1. ν΄λΌμ΄μ–ΈνŠΈ, Engine

Ktor Client κ°€μ΄λ“œ μš”μ•½ 정리 Ktor Documents κΈ°μ€€ 버전: 1.6.2 μ‹œλ¦¬μ¦ˆ 1. ν΄λΌμ΄μ–ΈνŠΈ, Engine 2. Request 3. Response Engine Ktor HTTP ν΄λΌμ΄μ–ΈνŠΈλŠ” JVM, Android, JS, Native(iOS/desktop)κ³Ό 같이 λ‹€λ₯Έ ν”Œλž«νΌμ—μ„œ μ‚¬μš©λ  수 μžˆλ‹€. νŠΉμ • ν”Œλž«νΌμ—μ„œ λ„€νŠΈμ›Œν¬ μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ νŠΉμ • engine이 ν•„μš”ν•  μˆ˜λ„ μžˆλ‹€. 예λ₯Ό λ“€μ–΄, Androidμ—μ„œλŠ” OkHttpλ₯Ό μ‚¬μš©ν•˜κ³  JVMμ—μ„œλŠ” Apacheλ‚˜ CIOλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. ktor-client-core 라이브러리 외에 각 ν”Œλž«νΌμ—μ„œ μ‚¬μš©ν•  engine에 λŒ€ν•œ λ””νŽœλ˜μ‹œλŠ” λ³„λ„λ‘œ μΆ”κ°€ν•΄μ€˜μ•Ό ν•œλ‹€. Engine dependency κ°€μ΄λ“œμ—μ„œ ν”Œλž«νΌ 별 μ‚¬μš© κ°€λŠ₯ν•œ engi..

개발/Kotlin 2021.08.04

[Kotlin In Action] 5. λžŒλ‹€λ‘œ ν”„λ‘œκ·Έλž˜λ°

λžŒλ‹€μ‹/λžŒλ‹€: λ‹€λ₯Έ ν•¨μˆ˜μ— λ„˜κΈΈ 수 μžˆλŠ” μž‘μ€ μ½”λ“œ 쑰각 #1. λžŒλ‹€μ‹κ³Ό 멀버 μ°Έμ‘° λžŒλ‹€: μ½”λ“œ λΈ”λŸ­μ„ ν•¨μˆ˜ 인자둜 λ„˜κΈ°κΈ° λžŒλ‹€ 식을 μ‚¬μš©ν•˜λ©΄ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  ν•„μš”κ°€ μ—†κ³ , μ½”λ“œ λΈ”λŸ­μ„ 직접 ν•¨μˆ˜μ˜ 인자둜 전달할 수 μžˆλ‹€. button.setOnClickListener { /* actions on click */ } -> λžŒλ‹€λ₯Ό λ©”μ„œλ“œκ°€ ν•˜λ‚˜λΏμΈ 무λͺ… 객체 λŒ€μ‹  μ‚¬μš©ν•  수 μžˆλ‹€. λžŒλ‹€μ™€ μ»¬λ ‰μ…˜ μ˜ˆμ‹œ) maxBy: μ»¬λ ‰μ…˜μ—μ„œ νŠΉμ • 쑰건을 κΈ°μ€€μœΌλ‘œ κ°€μž₯ 큰 μ›μ†Œλ₯Ό μ°Ύμ•„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ val people = listOf(Person("Alice", 29), Person("Bob", 31)) println(people.maxBy { it.age }) //λΉ„κ΅μ˜ 기쀀이 될 값을 λžŒλ‹€λ‘œ μ „λ‹¬ν•œλ‹€. ν•¨μˆ˜λ‚˜ ν”„λ‘œνΌν‹°λ₯Ό ..

개발/Kotlin 2021.05.29

[Kotlin In Action] 4. 클래슀, 객체, μΈν„°νŽ˜μ΄μŠ€

#1. 클래슀 계측 μ •μ˜ μΈν„°νŽ˜μ΄μŠ€ μ½”ν‹€λ¦° μΈν„°νŽ˜μ΄μŠ€ μ•ˆμ—λŠ” 좔상 λ©”μ„œλ“œλΏ μ•„λ‹ˆλΌ κ΅¬ν˜„μ΄ μžˆλŠ” λ©”μ„œλ“œλ„ μ •μ˜ν•  수 μžˆλ‹€. μƒνƒœ(ν•„λ“œ)λŠ” λ“€μ–΄κ°ˆ 수 μ—†λ‹€. //μΈν„°νŽ˜μ΄μŠ€ μ •μ˜ interface Clickable { fun click() } //μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„ class Button : Clickable { //코틀린은 클래슀 ν™•μž₯κ³Ό μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„ λͺ¨λ‘ 콜둠(:)을 뢙인닀. //μ˜€λ²„λΌμ΄λ“œ ν‘œμ‹œ override fun click() = println("I was clicked") } μžλ°”μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μΈν„°νŽ˜μ΄μŠ€λŠ” 개수 μ œν•œμ—†μ΄ λ§ˆμŒλŒ€λ‘œ κ΅¬ν˜„ν•  수 μžˆμ§€λ§Œ, ν΄λž˜μŠ€λŠ” 였직 ν•˜λ‚˜λ§Œ ν™•μž₯ν•  수 μžˆλ‹€. μƒμœ„ ν΄λž˜μŠ€μ— μžˆλŠ” λ©”μ„œλ“œμ™€ μ‹œκ·Έλ‹ˆμ²˜κ°€ 같은 λ©”μ„œλ“œλ₯Ό μš°μ—°νžˆ ν•˜μœ„ ν΄λž˜μŠ€μ— μ„ μ–Έν•˜λŠ” 경우, 컴파일이 μ•ˆ 되기 λ•Œλ¬Έμ—..

개발/Kotlin 2021.05.19

[Kotlin In Action] 3. ν•¨μˆ˜ μ •μ˜μ™€ 호좜

#1. ν•¨μˆ˜ 호좜 fun joinToString( collection: Collection, separator: String, prefix: String, postfix: String ): String { val result = StringBuilder(prefix) for ((index, element) in collection.withIndex()) { if (index > 0) result.append(separator) result.append(element) } result.append(postfix) return result.toString() } 이름 뢙인 인자 μžλ°” joinToString(collection, /* separator */ " ", /* prefix */ " ", /* pos..

개발/Kotlin 2021.05.10

[Kotlin In Action] 2. μ½”ν‹€λ¦° 기초

#1. ν•¨μˆ˜ Hello, world! fun main(args: Array) { println("Hello, world!") } ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ fun ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œλ‚˜ νŒŒλΌλ―Έν„° 이름 뒀에 νƒ€μž…μ„ μ“΄λ‹€. ν•¨μˆ˜λ₯Ό μ΅œμƒμœ„ μˆ˜μ€€μ— μ •μ˜ν•  수 μžˆλ‹€. 클래슀 μ•ˆμ— λ„£μ–΄μ•Ό ν•  ν•„μš”κ°€ μ—†λ‹€. 배열도 일반적인 ν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‹€. μ„Έλ―Έμ½œλ‘ (;)을 뢙이지 μ•Šμ•„λ„ λœλ‹€. statement(λ¬Έ)κ³Ό expression(식)의 ꡬ뢄 식: 값을 λ§Œλ“€μ–΄λ‚΄λ©°, λ‹€λ₯Έ μ‹μ˜ ν•˜μœ„μš”μ†Œλ‘œ 계산에 μ°Έμ—¬ν•  수 μžˆλ‹€. λ¬Έ: μžμ‹ μ„ λ‘˜λŸ¬μ‹Έκ³  μžˆλŠ” κ°€μž₯ μ•ˆμͺ½ λΈ”λŸ­μ˜ μ΅œμƒμœ„ μš”μ†Œλ‘œ μ‘΄μž¬ν•˜μ—¬ μ•„λ¬΄λŸ° 값을 λ§Œλ“€μ–΄λ‚΄μ§€ μ•ŠλŠ”λ‹€. μžλ°”μ—μ„œλŠ” λͺ¨λ“  μ œμ–΄κ΅¬μ‘°κ°€ 'λ¬Έ'인 반면, μ½”ν‹€λ¦°μ—μ„œλŠ” 루프λ₯Ό μ œμ™Έν•œ λŒ€λΆ€λΆ„μ˜ μ œμ–΄κ΅¬μ‘°κ°€ '식'이닀. 식이..

개발/Kotlin 2021.05.10

[Kotlin In Action] 1. μ½”ν‹€λ¦°μ΄λž€ 무엇이며, μ™œ ν•„μš”ν•œκ°€?

#1. μ½”ν‹€λ¦°(Kotlin)? μžλ°” ν”Œλž«νΌμ—μ„œ λŒμ•„κ°€λŠ” μƒˆλ‘œμš΄ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ κ°„κ²°, μ‹€μš©μ , μžλ°” μ½”λ“œμ™€μ˜ μƒν˜Έμš΄μš©μ„± μ€‘μ‹œ #2. μ£Όμš” νŠΉμ„± λŒ€μƒ ν”Œλž«νΌ μ„œλ²„, μ•ˆλ“œλ‘œμ΄λ“œ λ“± μžλ°”κ°€ μ‹€ν–‰λ˜λŠ” λͺ¨λ“  κ³³ 정적 νƒ€μž… 지정 μ–Έμ–΄ - 정적 νƒ€μž… 지정 μ–Έμ–΄: ν”„λ‘œκ·Έλž¨ ꡬ성 μš”μ†Œμ˜ νƒ€μž…μ„ 컴파일 μ‹œμ μ— μ•Œ 수 있고, ν•„λ“œλ‚˜ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  λ•Œλ§ˆλ‹€ μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž…μ„ 검증해쀀닀. - 동적 νƒ€μž… 지정 μ–Έμ–΄: νƒ€μž…κ³Ό 관계없이 λͺ¨λ“  값을 λ³€μˆ˜μ— 넣을 수 있고, ν•„λ“œλ‚˜ λ©”μ„œλ“œ 접근에 λŒ€ν•œ 검증이 μ‹€ν–‰ μ‹œμ μ— μΌμ–΄λ‚œλ‹€. 정적 νƒ€μž… μ§€μ •μ˜ μž₯점 μ„±λŠ₯: μ‹€ν–‰ μ‹œμ μ— μ–΄λ–€ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν• μ§€ μ•Œμ•„λ‚΄λŠ” 과정이 ν•„μš”μ—†μ–΄μ„œ λΉ λ₯΄λ‹€. μ‹ λ’°μ„±: μ»΄νŒŒμΌλŸ¬κ°€ κ²€μ¦ν•˜κΈ° λ•Œλ¬Έμ— μ‹€ν–‰ μ‹œ 였λ₯˜λ‘œ μ€‘λœλ  κ°€λŠ₯성이 적닀. μœ μ§€ λ³΄μˆ˜μ„±: μ½”λ“œμ—μ„œ λ‹€λ£¨λŠ” 객..

개발/Kotlin 2021.05.09

Kotlin constructor 정리

μž‘μ„±μΌ: 2019.12.31 Kotlin의 ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ Primary constructor(μ£Ό μƒμ„±μž)와 ν•˜λ‚˜ μ΄μƒμ˜ Secondary constructor(λΆ€ μƒμ„±μž)λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. Primary constructor Primary constructorλŠ” 클래슀 이름 뒀에 ν‘œκΈ°ν•©λ‹ˆλ‹€. class Person constructor(firstName: String) { /*...*/ } Primary constructor에 μ–΄λ…Έν…Œμ΄μ…˜μ΄λ‚˜ μ ‘κ·Ό μ œν•œμž(visibility modifiers)κ°€ μ—†λŠ” 경우, constructor ν‚€μ›Œλ“œλŠ” μƒλž΅ κ°€λŠ₯ν•©λ‹ˆλ‹€. class Person(firstName: String) { /*...*/ } Primary constructorλŠ” μ½”λ“œ λΈ”λŸ­μ„ κ°€μ§ˆ 수 μ—†μœΌλ―€λ‘œ,..

개발/Kotlin 2021.04.08