경제적 자유를 위해

열심히 살아보자

개발/Kotlin

[Kotlin CS] 코틀린 - 관용구 (Kotlin idioms, Kotlin, if return)

따식 2023. 10. 27. 18:25
728x90

DTOs를 만드는 방법

data class Customer(val name: String, val email: String)
  • val 프로퍼티는 getter
  • var 프로퍼티는 getter, setter
  • copy() 사용 가
DTO = Data Transfer Object의 약어로 계층간 데이터 전송에 사용되는 객체

 


함수 파라미터에 Default value

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

리스트 필터

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

Collection에 요소가 있는지 확인하기

if ("yts@example.com" in emailsList) { ... }

if ("yts@example.com" !in emailsList) { ... }

위처럼 in 키워드를 사용하여 리스트에 "yts@example.com"이란 요소가 있는지 확인이 가능하다.


문자열 보간

println("Name $name")

인스턴스 Checks

when (x) {
    is Foo -> ...
    is Bar -> ...
    else   -> ...
}

위 처럼 is 키워드를 사용하여 인스턴스를 확인할수 있다. 실무에서도 자주 사용되는 문법


Read-only List, map

val list = listOf("a", "b", "c")

val map = mapOf("a" to 1, "b" to 2, "c" to 3)

Map을 읽는 방법

println(map["key"])
map["key"] = value
for ((name, age) in map) {
    println("$k -> $v")
}

위처럼 [key]값으로 호출이 가능하고 for문을 이용하여 pairs로 읽어 드릴수 있다.


Ranger 반복문 (Iterate)

for (i in 1..100) { ... }  // 1,2,3,...100
for (i in 1..<100) { ... } // 1,2,3,....99
for (x in 2..10 step 2) { ... } // 2,4,6..10
for (x in 10 downTo 1) { ... } // 10,9,8,7....1
(1..10).forEach { ... } // 1,2,3,4....10

Lazy property

val name: String by lazy { // the value is computed only on first access
   "태식"
}

 

  • 값을 처음 사용될 때까지 초기화하지 않음으로써 성능을 향상시킬 수 있다.
  • 값이 처음 사용될 때까지 의존하는 값이 초기화되지 않은 경우에도 사용할 수 있다.

확장 함수 (Extension functions)

fun String.spaceToCamelCase() { ... }

"Convert this to camelcase".spaceToCamelCase()

확장 함수도 실무때 자주 사용된다. 
함수 이름 앞에 타입. 을 찍어주면 된다.


싱글톤 만드는 방법 (Create a singleton)

object Resource {
    val name = "따시기"
}

위처럼 간단하게 object로 생성하면 된다.


추상 클래스 인스턴스화 (Instantiate an abstract class)

abstract class AbstractClass {
    abstract fun one()
    abstract fun two()
}

fun main() {
    val myObject = object : AbstractClass() {
        override fun one() {}

        override fun two() { }
    }
    myObject.one()
}

If-not-null, If-not-null-else 약어 (If-not-null, If-not-null-else shorthand)

val files = File("따시기").listFiles()

println(files?.size) //1 출력

if-not-null 약어인 ? 키워드를 사용하여 print하는 코드

val files = File("따시기").listFiles()

// For simple fallback values:
println(files?.size ?: "empty") // if files is null, this prints "empty"

// To calculate a more complicated fallback value in a code block, use `run`
val filesSize = files?.size ?: run {
    val someSize = getSomeSize()
    someSize * 2
}
println(filesSize)

files?.size ?: "empty"에서 if-not-null-else 약어를 처리한다. 
?: (else문)에서 추가적인 계산이 필요하다면 run (scope function)을 사용하여 처리한다.

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

위처럼 null인경우에 throw IllegalStateException와 같명령문을 실행할수 있다.


비어 있을 수 있는 컬렉션의 첫 번째 항목 가져오기 (Get first item of a possibly empty collection)

val emails = ... // might be empty
val mainEmail = emails.firstOrNull() ?: ""

mainEail의 값은 아래와 같다.

  • 비어 있다면 = ""
  • 비어 있지 않다면 = emails[0]

비어 있지 않다면 실행 (Execute if not null)

val value = ...

value?.let {
    ... // execute this block if not null
}

let( Scope functions )을 사용하여 비어 있지 않는 경우에만 block이 실행된다.


null이 아닌 경우 null 허용 값 매핑 (Map nullable value if not null)

val value = ...

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

value가 null이라면 defaultValue의 값을 갖게 될것 이다.


when 문 반환 (Return on when statement)

fun transform(color: String): Int {
    return when (color) {
        "Red" -> 0
        "Green" -> 1
        "Blue" -> 2
        else -> throw IllegalArgumentException("Invalid color param value")
    }
}

위처럼 결과값을 반환할 수 있고, 명령문을 반환할 수 있다.


try-catch문 (try-catch expression)

fun test() {
    val result = try {
        count()
    } catch (e: ArithmeticException) {
        throw IllegalStateException(e)
    }
}

if 문 (if expression)

val y = if (x == 1) {
    "one"
} else if (x == 2) {
    "two"
} else {
    "other"
}

단일 표현식 함수 (Single-expression functions)

fun theAnswer() = 42

//위와 아래는 같다.

fun theAnswer(): Int {
    return 42
}

fun transform(color: String): Int = when (color) {
    "Red" -> 0
    "Green" -> 1
    "Blue" -> 2
    else -> throw IllegalArgumentException("Invalid color param value")
}

// when문을 사용하여 표현할 수 있다.

with을 사용 하여 객체 인스턴스에서 여러 메서드 호출 (Call multiple methods on an object instance )

class Turtle {
    fun penDown()
    fun penUp()
    fun turn(degrees: Double)
    fun forward(pixels: Double)
}

val myTurtle = Turtle()
with(myTurtle) { //draw a 100 pix square
    penDown()
    for (i in 1..4) {
        forward(100.0)
        turn(90.0)
    }
    penUp()
}

위처럼 with(Scope function)을 사용하여 객체 인스턴스에서 여러 메서드를 호출 할 수 있습니다.


apply을 사용하여 속성 정의 (Configure properties of an object)

val myRectangle = Rectangle().apply {
    length = 4
    breadth = 5
    color = 0xFAFAFA
}

apply는 객체에 속성을 정의할 때 주로 사용합니다.


제네릭 타입 정보가 필요한 제네릭 함수 (Generic function that requires the generic type information)

//  public final class Gson {
//     ...
//     public <T> T fromJson(JsonElement json, Class<T> classOfT) throws JsonSyntaxException {
//     ...

inline fun <reified T: Any> Gson.fromJson(json: JsonElement): T = this.fromJson(json, T::class.java)

also를 사용하여 두 변수 바꾸기 (Swap two variables)

var a = 1
var b = 2
a = b.also { b = a }

TODO 코드를 불완전한 것으로 표시(Mark code as incomplete (TODO))

fun calcTaxes(): BigDecimal = TODO("Waiting for feedback from accounting")

 


마무리

오늘은 Kotlin 기초중에 관용어에 대해 정리 해봤다.
기본 구문은 아래글을 참고해주길 바란다.
2023.10.26 - [개발/Kotlin] - [Kotlin CS] 코틀린 - 기본 구문


참고 사이트
https://kotlinlang.org/docs/basic-syntax.html

 

728x90