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
'개발 > Kotlin' 카테고리의 다른 글
[Kotlin CS] 자료형 Characters (2) | 2023.11.09 |
---|---|
[Kotlin CS] 자료형 Boolean (0) | 2023.11.08 |
[Kotlin CS] 자료형 Numbers (Kotlin number type, Kotlin Float, Kotlin Number class) (0) | 2023.11.06 |
[Kotlin CS] 코틀린 코딩 컨벤션 (Kotlin Coding conventions, Android coding style, Kotlin Code Style official) (0) | 2023.11.04 |
[Kotlin CS] 코틀린 - 기본 문법(코틀린 문법, 코틀린 문법 정리) (1) | 2023.10.26 |