Kotlin

[Kotlin] 코틀린 기본기

Razelo 2023. 4. 11. 23:22

최근 코틀린을 배워야할 일이 생겼다.

 

당장 쓸 건 아니지만 미리 알아둬야겠다는 생각이 들어서 간단하게 정리해보고자 한다. 


코틀린은 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 

https://jsonobject.tistory.com/606

https://12bme.tistory.com/582

반응형