코틀린

기초구문, 이디엄(관용어)

huzit 2023. 1. 30. 18:53
728x90

기초 구문

간단히 훑어보는 정도로 생각하면 편하다.

패키지 정의

패키지는 소스파일의 처음에 위치해야 한다.

package my.demo

import java.util.*

함수 정의

가장 기본적인 형태

fun sum(i: Int, j: Int): Int{
    return i+j
}

expression body를 사용하고 리턴 타입을 추론

fun sum(i: Int, j: Int) = i + j

의미 없는 값을 리턴하는 함수

fun sum(a: Int, b: Int)/*: Unit*/{
    println("---")
}

Unit리턴 타입은 생략 가능하다


로컬 변수 정의

val a: Int = 1 // 특시 할당 (Immutable)
val a = 1      // 타입추론
val a: Int     //초기화를 하지 않으면 타입 필요
a = 1          //이후 할당
var b = 5      //Mutable
b = 6

문자열 템플릿 사용

println("$t ${sum(3, 4)}")

단순 변수의 값을 가져오려면 중괄호가 필요 없지만 식을 쓰기 위해선 중괄호를 넣어줘야 한다.


조건식 사용

기본 사용법은 다른 언어와 동일하지만 식처럼 사용할 수 있다.

fun test(a: Int, b: Int) = if(a>b) a else b

Null체크

null이 가능할 때는 반드시 레퍼런스를 명시적으로 nullable로 표시해야 한다

fun parseInt(str: String): Int?{ //정수를 리턴하지 않으면 null을 리턴한다고 할 때
    ...
}

nullable 한 값을 리턴할 때 반드시 null체크를 해줘야 한다.


타입 검사와 자동 변환 사용

is연산자는 식이 타입의 인스턴스인지 검사한다.

fun getStringLength(obj: Any): Int?{
    if(obj !is String) return null //문자열이 아닌지 검사
  //obj를 자동으로 String으로 변환
  return obj.length
}

다음도 가능

fun getStringLength(obj: Any): Int?{
    if(obj is String && obj.length > 0) //우변에서 obj를 자동으로 String으로 변환
        return obj.length
  return null
}

for, while, when, in은 뒤에 나올 흐름 제어 파트에서 자세히 다룰예정


이디엄(관용구)

DTO생성

data class Customer(val name: String, val email: String)

데이터 클래스로 생성하면 다음 기능을 가진 Customer클래스를 제공한다.

  • getter, setter
  • equals
  • hashCode
  • toString
  • copy
  • 모든 프로퍼티에 대한 component1(), component2(),...

데이터 클래스를 쓰게 되면 스프링에서 DTO생성 시 기본 메서드 5가지를 롬복을 통해 선언할 필요 없이 자동 제공해준다.


함수 패러미터의 기본 값

fun foo(a: Int = 0, b: String = ""){}

list Filtering

val pos = list.filter{ x -> x > 0 }

더 짧게 표현

val pos = list.filter{ it > 0 }

if not null 축약

val files = File("Test").listFiles()
println(files?.size)

if not null and else 축약

val files = File("Test").listFiles()
println(files?.size ?: "empty")

null이면 문장 실행

val values = ...
val email = values["email"] ?: throw IllegalStateException("email is missing")

null이 아니면 실행

val values = ...
value?.let{
    ...//null 이 아닌 블록 실행
}

null이 아니면 null가능 값 매핑

val value = ..
val mapped = value?.let { transformValue(it) } ?: defaultValueIfValueIsNull

식을 리턴

fun transform(color: String): Int{
    return when(color){
        "RED" -> 0
        "GREEN" -> 1
        "BLUE" -> 2
      else -> throw IllegalArgumentException("Invalid color param value")
    }
}
fun foo(param: Int){
    val result = if(param == 1){
        "One"
    } else{
        "Other"
    }
}

단일식 함수

fun transform(color: String): Int = when (color) {
  "RED" -> 0
  "GREEN" -> 1
  "BLUE" -> 2
else -> throw IllegalArgumentException("Invalid color param value")
}
728x90