Today I Learned_230709

3 분 소요

실무 프로젝트로 배우는 Kotlin & Spring : 리팩토링부터 서비스 구현까지

Part 2. 코틀린 문법 학습하기

코틀린 개발 환경 구성하기

OpenJDK 설치 : https://adoptium.net/temurin/releases/

이클립스 재단에서 제공하는 temurin (Azul zulu와 비슷한듯)

intel 칩 사용하고 있으므로 x64로 설치

코틀린 언어만 학습할 때에는 플레이그라운드 사용

https://play.kotlinlang.org

변수

// 변수 선언 시 top level에 위치시킬 수 있다.
var x = 5

fun main() {
    
    x += 1		// 함수 밖에서 선언한 변수에 접근이 가능
    
    val a : Int = 1		//키워드 변수병 : 타입 = 할당할 값
    
    // 타입 생략도 가능하다. 타입 자동 추론이 가능하다.
    val b = 1
    
    // 지연 할당
    val c : Int
    c = 3		// 먼저 선언하고 이후에 할당하는 방식
    
    // 변수 선언 시 타입을 정해주지 않으면 컴파일 에러 발생. 타입을 c와 같이 반드시 넣어줘야 한다.
    val d
    d = 123
    
    // 변수 선언 시 두 가지 키워드 존재
    // val(value) : java의 final처럼 한 번 값이 초기화 된 이후에는 재할당 불가. readonly
    // var(variable) : 가변 변수를 나타내는 키워드. 이후에 재할당이 가능하다.
    
    val e : String = "Hello"
    e = "World" // 컴파일 오류 발생
    
    var f = 123
    f = "hi"	// 컴파일 오류 발생. 최초에 고정된 타입과 다른 타입이 들어오면 안 된다.
}

함수

// 기본적인 함수 선언 스타일
// fun 함수명(함수의 인자) : 함수가 반환할 타입
// { 함수의 몸통 }
fun sum(a: Int, b: Int) : Int {
    return a + b
}

// 표현식 스타일
fun sum2(a: Int, b: Int) : Int = a + b  //몸통 없이 로직만 들어간다

// 표현식 & 반환타입 생략
fun sum3(a: Int, b: Int) = a + b    // 변수의 타입 추론이 되기에 반환타입 생략. 함수도 기본적으로 추론해주므로 생략이 가능하다.

// 몸통이 있는 함수는 반환 타입을 제거하면 컴파일 오류
// 표현식은 반환타입 생략이 가능
fun sum4(a: Int, b: Int) {
    return a + b
}

// 반환타입이 없는 함수는 Unit을 반환한다 (java의 void와 유사)
// Unit의 기능을 사용하기 보다는 반환타입이 없으면 Unit이 된다.
fun prinfSum(a: Int, b: Int) {
    println("$a + $b = ${a + b}")
}

// 디폴트 파라미터
// java에는 디폴트 파라미터가 없다.
fun greeting(message: String = "안녕하세요!") {
    println(message)
}

fun main() {
    greeting()
    greeting("HI!!!")
}

// named argument
fun log(level: String = "INFO", message: String) {
    println("[${level}]$message")
}

// named argument : 함수에 변수 값을 넣을 때 이름과 값을 매핑하는 기법
// 버그를 줄일 수 있는데 유용한 문법. 순서 바꿔 넣거나 헷갈리게 넣을 수 있는 오류를 줄여준다.
fun main() {
    log(message = "인포 로그")
    log(level = "DEBUG", "디버그 로그") // named argument를 직접 지정하지 않아도 level 다음으로 오기에 message에 들어온다
    log("WARN", "워닝 로그") // 순서대로 넣어주기
    log(level = "ERROR", message = "에러 로그")
}

흐름제어

if

fun main() {
    // if..else 사용
    val job = "Software Developer"

    if(job == "Software Developer"){
        println("개발자")
    } else {
        println("개발자 아님")
    }

    // 코틀린의 if...else는 표현식이다
    val age : Int = 10

    val str = if(age> 10) {
        "성인"
    } else {
        "아이"
    }

    // 코틀린은 삼항 연산자가 없다. if...else가 표현식이므로 불필요하다.
    val a = 1
    val b = 2
    val c = if (b > a) b else a // 삼항 연산자 대신 if else 사용
}

when

fun main() {
    // 자바의 switch 코드를 코틀린의 when식으로 변환한 코드
    // 자바의 switch는 표현식이 아니기에 그 자체로 값을 반환하지는 않았다 (최근 자바에서는 지원)
    val day = 2

    val result = when (day) {
        1 -> "월요일"
        2 -> "화요일"
        3 -> "수요일"
        4 -> "목요일"
        5 -> "금요일"
        else -> "기타"
    }

    println(result)

    // else를 생략할 수 있다
    when(getColor()) {
        Color.RED -> print("red")
        Color.GREEN -> print("green")
    }

    // 여러개의 조건을 콤마로 구분해 한줄에서 정의할 수 있다.
    when (getNumber()) {
        0, 1 -> print("0 또는 1")
        else -> print("0 또는 1이 아님")
    }
}

enum class Color {
    RED, GREEN
}

fun getColor() = Color.RED

fun getNumber() = 2

for

fun main() {
    // 범위 연산자 .. 를 사용해 for loop 돌리기
    // .. : 코틀린에서 제공하는 범위 연산자. 뒤에 온 값들을 포함한다.
    for (i in 0 .. 3) {
        println(i) // 0, 1, 2, 3
    }
    println()

    // until을 사용해 반복한다(맨 마지막 값 포함하지 않음)
    for (i in 0 until 3) {
        println(i) // 0, 1, 2
    }
    println()

    // step에 들어온 값 만큼 증가시킨다
    // 특정 값만큼 증가시키면서 반복할 때 사용
    for (i in 0 .. 6 step 2){
        println(i) // 0, 2, 4, 6
    }
    println()

    // downTo를 사용해 반복하면서 값을 감소시킨다
    for (i in 3 downTo 1) {
        println(i)  // 3, 2, 1
    }
    println()

    // 전달받은 배열을 반복
    val numbers = arrayOf(1, 2, 3)

    for(i in numbers) {
        println(i) // 1, 2, 3
    }
}

while

fun main() {
    // 자바의 while문과 동일
    // 조건을 확인하고 참이면 코드 블록을 실행한 후 다시 조건을 확인
    var x = 5

    while (x > 0) {
        println(x) // 5, 4, 3, 2, 1
        x--
    }
}

카테고리:

업데이트: