코딩과 결혼합니다

[Kotlin] 개념과 기초 문법 본문

2세/Spring

[Kotlin] 개념과 기초 문법

코딩러버 2024. 1. 20. 22:00
728x90

Kotlin?

2011년 JetBrains에서 공개한 JVM에서 동작하는 정적 타입의 프로그래밍 언어로, 간결하고 실용적이며 자바코드와 상호운용성을 중시한 언어이다. 안드로이드 애플리케이션 개발에 널리 사용되고 있다.

 

Java언어와의 차이점

  • 코틀린의 문법이 더 간결하고 표현력이 뛰어나 가독성과 생산성을 높일 수 있다.
  • 코틀린은 자바와의 상호 운용성이 뛰어나 기존에 자바로 작성된 코드를 마이그레이션 하는 것이 비교적 쉽고 원활히 이루어진다.
  • 코틀린은 안드로이드 애플리케이션 개발에 많이 사용된다. 구글의 안드로이드 공식 언어로 채택되었다.
  • 코틀린은 비교적 새로운 언어이기 때문에 자바에 비해 학습 곡선이 높을 수 있다. 하지만, 자바와의 유사성으로 자바 개발자들이 쉽게 코틀린으로 전환할 수 있다.

정적 타입 언어

  • 변수의 타입을 컴파일 시점에 결정하고, 컴파일러가 타입 체크를 수행하여 타입에 관련된 오류를 미리 잡을 수 있다.

타입 추론

  • ✔️ 코틀린은 타입 추론으로 변수에 들어오는 값을 보고 타입을 알아서 지정해 주는 기능이 있다.
  • 👓 하지만 여러 명이 같이 작업을 할 때에는 직접 Type을 명시하는 것이 좋다. (혼동 또는 가독성 떨어짐 방지)

nullable type

  • null이 될 수 있는 타입을 지원
  • 컴파일 시점에 null point exception이 발생할 수 있는지 여부를 검사할 수 있다.

함수형 프로그래밍

  • 함수를 일반 값처럼 다룰 수 있다.
  • 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용하여 프로그램을 작성한다.
  • 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용한다.

코틀린 코드를 설치 없이 실행해 볼 수 있는 사이트

 

▪️Kotlin Playgound

 

Kotlin Playground: Edit, Run, Share Kotlin Code Online

 

play.kotlinlang.org

 

var / val

fun main(){
    var a = 1
    a = 2
    print(a)
} O

fun main(){
    val a = 1
    a = 2
    print(a)
} X

 

var - 읽기 쓰기가 가능한 변수 선언

val - 읽기만 가능한 변수 선언, 한번 초기화하면 변경이 불가능

 

fun main() {
    val a = 1
    print(a::class)
}

int (Kotlin reflection is not available)

 

현재의 클래스를 확인


? / ?. / ?: / !!

fun main() {
    val Str : Stging? = null
}

 

? - null이 들어올 수 있음을 명시

 

fun main() {
    val str: String? = "abc"
    println(str?.length)
    
}

?. - Null Safe Call Operator, 이 물음표 앞에 있는 str이 Null이 아니라면 뒤에 있는 명령어를 이어서 실행.
      Null이 들어가 있으면 그래도 Null을 출력

 

fun main() {
    val str: String? = "abc"
    println(str!!.length)
}

!! - 실제로 null이 들어갈 수 있는 변수이기는 하지만 null이 아니라는 것을 보장.
     Null이 들어가 있으면 Ponit Excption 발생

 

fun main() {
    val str: String? = null
    str ?: println("str is null")
}

?: - str이 null이라면 뒤에 있는 명령어를 실행. null이 아니면 아무것도 실행되지 않는다.


if / when

 

▪️대소비교

fun main() {
    val a: Int = 100
    val b: Int = 200
    
    if(a >= b){
        println("a")
    } else {
        println("b")
    }
}

 

fun main() {
    val a: Int = 100
    val b: Int = 200
    val c: Int
    
    c = if(a >= b){
        a
    } else {
        b
    }
    
    println(c)
}

 

▪️null 체크

fun main() {
    val a: Int? = 200
    
    if(a == null){
       println("null check true")
    } else {
       println("a = $a")  
    }
}

 

▪️In 체크

fun main() {
    val a: Int? = 100
    
    if(a in arrayOf(100, 200, 300)){
       println("contain")
    } else {
       println("not contained")  
    }
}

 

▪️if 문을 when문으로 바꾸기

fun main() {
    val a: Int? = 300
    
    if (a == 100){
        println("1")
    } else if (a == 200){
        println("2")
    } else if (a == 300){
        println("3")
    } else { 
    	println("not contained")
    }
}

fun main() {
    val a: Int? = 300
    
    when (a) {
        100 -> print("1")
        200 -> print("2")
        300 -> print("3")
        else -> print("not contained")
    }
}

 

▪️범위지정

fun main() {
    val a: Int? = 318
    
    when (a) {
        in 100..199 -> print("1")
        in 200..299 -> print("2")
        in 300..399 -> print("3")
        else -> print("not contained")
    }
}

class / date class / enum class

fun main() {
    val item: Item = Item("Book", 10_000)
    println("Item name is ${item.name}, price is ${item.price}")
}

class Item(val name: String, val price: Int)

data class Item2(val name: String, val price: Int)

enum class Color{
    RED,
    GREEN,
    BLUE,
}
  • class와 data class의 차이점
    • data class로 만들면 기본적으로 Getter, Setter, Equal, HashCode, ToString, Copy, Component, and 함수들이 생성된다.
    • Setter의 경우 var로 선언해야 만들어진다.