최근 코틀린을 배워야할 일이 생겼다.
당장 쓸 건 아니지만 미리 알아둬야겠다는 생각이 들어서 간단하게 정리해보고자 한다.
코틀린은 Google I/O 2017에서 안드로이드의 공식언어로 채택되었다.
코틀린 장점
- 문법적으로 진보
- 서버 사이드 애플리케이션에 좋음
- 자바 완벽 호환
- 툴 지원 (Intellij)
- 러닝커브가 낫음
코틀린 지원 서버사이드 프레임워크
- Spring
- Vert.x
- kotlinx.html
- 세미콜론 사용하지 않는다.
val temp: int = 10
var temp = 15
val: 변할 수 없는 상수 (read only, 초기화해줘서 선언해야함)
var: 일반적인 변수
fun sum(a: int, b: int): int {
return a + b
}
위 코드는 아래처럼 단순화 가능하다.
fun sum(a: int, b: int): int = a + b
함수에 조건식을 넣는다면 아래처럼 가능하다
fun max(a: int, b: int) = if (a > b) a else b
코틀린은 기본적으로 null을 가질 수 없다.
var a: int = 15
a = null // 오류 발생
var b: int? = null
b = null // 정상 수행
!!: nullable이면 오류 발생
?: nullable
배열
val numbers1: Array<Int> = arrayOf(1,2,3,4,5)
val numbers2 = arrayOf(1,2,3,4,5)
fun getStringLength(obj: Any): Int? {
if (obj !is String) return null
return obj.length
}
아래처럼 사용하는 것도 가능하다.
fun main(args: Array<String>) {
cases("Hello") // String
cases(1) // Int
cases(System.currentTimeMillis()) // Long
cases(MyClass()) // Not a string
cases("hello") // Unknown
}
fun cases(obj: Any) {
when (obj) {
1 -> println("One")
"Hello" -> println("Greeting")
is Long -> println("Long")
!is String -> println("Not a string")
else -> println("Unknown")
}
}
재밌는 기능 중 ranges기능이 있다.
for (x in 1..5){
println(x)
}
참고로 ranges 기능은 if condition 안에서도 가능하다.
if (x !in 0..array.size - 1){
...
}
아래처럼 다양한 방법도 가능하다.
for(i in 10 downTo 1){ // 역순 출력
println(i)
}
for(i in 1..10 step 2){ // 건너뛰기
println(i)
}
for(i in 1 until 10){ // 끝 번호 제외하고 출력
println(i)
}
아래처럼 문자열에 변수를 표현할 수도 있다. 그리고 Unit은 아무 리턴값도 반환하지 않는다는 뜻이다.
fun printSum(a: Int, b: Int): Unit {
println("sum of $a and $b is ${a + b}")
}
var a: Int = 1 // 타입 선언
var b = 2 // 타입 체크
문자열 템플릿을 살펴보자.
fun string_template() {
var a = 1
val s1 = "a is $a"
println(s1)
a = 2
val s2 = "${s1.replace("is", "was")}, but now is $a" //${} 기호 안에서 메소드 접근 가능.
println(s2)
}
코루틴
- 비동기 프로그래밍 간편
- 일시 중단과 재개가 가능한 경량화된 스레드와 비슷한 개념
- 비동기적으로 수행되는 작업들을 동기적으로 작동하는 것처럼 코딩할 수 있음
코루틴 구성 요소
- 코루틴 빌더: 코루틴 생성 및 실행, 주요 빌더(launch, async, runBlocking)
- 일시 중단 함수: 코루틴 내에서 실행되고 내부에서 일시 중단할 수 있는 함수, suspend 키워드 사용
- 코루틴 스코프: 코루틴 생명주기 관리에 사용되는 객체 (GlobalScope, CoroutineScope, lifecycleScope)
- 코루틴 디스패처: 코루틴이 실행될 스레드를 결정하는 컴포넌트, (Main, Defult, IO, Unconfined)
- 코루틴 컨텍스트: 코루틴의 환경 설정을 저장하는 객체
코루틴과 스레드는 개념이 다르다.
코루틴이 하나의 실행-종료 되어야 하는 일(Job이면) 스레드는 그 일이 실행되는 곳임.
그래서 하나의 스레드에 여러 개의 코루틴이 동시에 실행될 수 있음
package com.smpcoroutinesample.basic
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
fun main(args: Array<String>) {
GlobalScope.launch {
delay(1000L)
println("World!")
}
println("Hello,")
Thread.sleep(2000L)
}
아래 자료에서 많은 도움을 받았다.
감사합니다.
https://www.youtube.com/watch?v=PqA6zbhBVZc
https://sas-study.tistory.com/323
https://kotlinlang.org/docs/server-overview.html#next-steps
코루틴
https://whyprogrammer.tistory.com/596
https://blog.yena.io/studynote/2020/04/26/Android-Kotlin-Coroutine.html
http://www.gisdeveloper.co.kr/?p=10279
'Kotlin' 카테고리의 다른 글
[kotlin] 코틀린 inline과 crossinline 키워드 (0) | 2024.04.27 |
---|---|
[kotlin] 코틀린 코루틴에 대한 개념 정리 (4) (0) | 2024.04.25 |
[kotiln] 코틀린 코루틴에 대한 개념 정리 (3) (0) | 2024.04.22 |
[kotlin] 코틀린 코루틴에 대한 개념 정리 (2) (0) | 2024.04.21 |
[Kotlin] 코틀린 코루틴에 대한 개념 정리 (1) (2) | 2024.04.20 |