Contents
2024.02.01 - [프로그래밍/Kotlin] - Kotlin 배우기 (1)
이전 포스팅에서는 기본 구문을 공부해봤다. 이번 포스팅에서는 Kotlin에서 자주 사용되는 관용어 위주로 공부할 예정이다.
Kotlin Idioms
우선 공부하기 전에 알아볼 용어들이 있다. DTO, POJO, POCO 라는 용어들이다. 나는 DTO는 알고 있었지만 POJO, POCO는 들어보기만 하고 정확히 뜻은 알지 못해서 이번에 짚고 넘어갈 예정이다.
- DTO (Data Transfer Object) : 계층 간 (Controller, View, Business Layer) 데이터 교환을 위한 Java Bean을 의미한다. 로직을 가지지 않는 데이터 객체이고, getter와 setter 메소드만 가진 클래스를 의미한다.
- DAO (Data Access Object) : DB 데이터에 접근하기 위한 객체이다. DB에 접근하기 위한 로직을 분리하기 위해 사용하고, 직접 DB에 접근하여 데이터를 삽입, 삭제, 조회 등 control 할 수 있는 기능을 수행한다.
- VO (Value Object) : Read-Only 속성을 가진 값 오브젝트이다. 자바에서 단순히 값 타입을 표현하기 위해 불변 클래스 (Read-Only)를 만들어 사용한다. (ex. enum)
- POCO (Plain Old CLR /*Common Language Runtime*/ Objects) : 프레임워크에 종속적이지 않은 객체로 POCO를 자바측에선 POJO라고 불린다.
- POJO (Plain Old Java Objects) : Java로 생성하는 순수한 객체를 뜻한다. 즉, 객체 지향적인 원리에 충실하면서 환경과 기술에 종속되지 않고, 필요에 따라 재활용 될 수 있는 방식으로 설계된 오브젝트를 의미한다.
Create DTOs - DTO 생성
Kotlin의 data class는 주로 데이터를 보관하는 데 사용된다. 각 데이터 클래스에 대해 컴파일러는 여러 작업을 수행할 수 있는 추가 멤버 함수를 자동으로 생성한다.
data class Customer(val name: String, val email: String)
위에서 생성한 Customer class는 다음 기능을 갖춘 클래스를 갖는다.
- 모든 속성에 대한 getter (var 변수인 경우 setter)
- equals()
- hashCode()
- toString()
- copy()
- 모든 속성에 대한 component1(), component2() ...
Default values for function parameters - 함수 매개변수의 기본 값
함수 매개변수를 선언할 때 기본 값을 넣을 수 있다.
fun foo(a: Int = 0, b: String = "") { ... }
Filter a list - 리스트 필터링
val positives = list.filter { x -> x > 0 }
//더 간략하게 줄일 수 있다.
val positives = list.filter { it > 0 }
Check the presence of an element in a collection - 컬렉션 내 요소 포함 여부
if ("john@example.com" in emailsList) { ... }
if ("jane@example.com" !in emailsList) { ... }
String interpolation - 문자열 내 변수 값 넣기
println("Name $name")
Instance checks - 인스턴스 검사
when (x) {
is Foo -> ...
is Bar -> ...
else -> ...
}
Read-only list - 읽기 전용 리스트
val list = listOf("a", "b", "c")
Read-only map - 읽기 전용 맵
val map = mapOf("a" to 1, "b" to 2, "c" to 3)
Access a map entry - 맵 요소 접근하기
println(map["key"])
map["key"] = value
Traverse a map - 맵 탐색
for ((k, v) in map) {
println("$k -> $v")
}
Iterate over a range - 범위 반복
for (i in 1..100) { ... } // 100 포함
for (i in 1..<100) { ... } // 100 미포함
for (x in 2..10 step 2) { ... } // 2 4 6 8 10
for (x in 10 downTo 1) { ... } // 10 9 8 7 ...
(1..10).forEach { ... }
lazy property - lazy 속성
기존 val 변수 선언에 by lazy 를 추가함으로써 생성과 동시에 값을 초기화할 수 있다.
val p: String by lazy {
// compute the string
}
Extension functions - 확장 함수
fun String.spaceToCamelCase() { ... }
"Convert this to camelcase".spaceToCamelCase()
Create a singleton - singleton 생성
singleton은 어떤 클래스가 최초 한번만 메모리를 할당하고 그 메모리에 객체를 만들어 사용하는 디자인 패턴을 말한다. 즉 생성자의 호출이 반복적으로 이루어 지더라도 실제로 생성되는 객체는 최초에 생성된 객체를 반환해 주는 것이다.
object Resource {
val name = "Name"
}
Instantiate an abstract class - 추상 클래스 인스턴스화
abstract class MyAbstractClass {
abstract fun doSomething()
abstract fun sleep()
}
fun main() {
val myObject = object : MyAbstractClass() {
override fun doSomething() {
// ...
}
override fun sleep() {
// ...
}
}
myObject.doSomething()
}
If-not-null-else shorthand - if-not-null-else 약어
좀 더 복잡한 코드가 필요한 경우 run 함수를 사용하여 코드 블록처리 할 수 있다.
val files = File("Test").listFiles()
// files가 null이면 "empty" 출력, null이 아니면 files.size 출력
println(files?.size ?: "empty")
val filesSize = files?.size ?: run {
val someSize = getSomeSize()
someSize * 2
}
println(filesSize)
Get first item of a possibly empty collection - 빈 컬렉션의 첫번째 항목 가져오기
val mainEmail = emails.firstOrNull() ?: ""
Execute if not null - if not null 실행하기
let 함수는 타입 객체의 확장 함수이다. 람다식으로 중괄호를 사용하고, 중괄호 내부에서 객체를 인자로 받아 사용할 때 it 키워드로 객체 호출이 가능하다.
val value = ...
value?.let {
...
}
try-catch expression - try-catch문
fun test() {
val result = try {
count()
} catch (e: ArithmeticException) {
throw IllegalStateException(e)
}
...
}
if expression - if문
val y = if (x == 1) {
"one"
} else if (x == 2) {
"two"
} else {
"other"
}
Single-expression functions - 단일 표현식 함수
//아래 두 함수는 같다
fun theAnswer() = 42
fun theAnswer(): Int {
return 42
}
with function - with 함수
with 함수는 파라미터로 직접 객체를 입력받고, 객체를 사용하기 위한 람다 블록을 받는다. 객체를 입력받으면 it 키워드나 this 키워드 등 없이 객체의 속성을 참조하거나 변경이 가능하다.
class Turtle {
fun penDown()
fun penUp()
fun turn(degrees: Double)
fun forward(pixels: Double)
}
val myTurtle = Turtle()
with(myTurtle) {
penDown()
for (i in 1..4) {
forward(100.0)
turn(90.0)
}
penUp()
}
apply function - apply 함수
apply 함수는 객체의 함수를 사용하지 않고 자기 자신을 다시 반환할 때 사용된다. 블록 함수의 입력을 람다 리시버로 받았기 때문에 블럭 안에서 it 키워드나 this 키워드 등 없이 객체의 속성을 참조하거나 변경이 가능하다. 주로 객체의 초기화나 변경할 때 사용된다.
val myRectangle = Rectangle().apply {
length = 4
breadth = 5
color = 0xFAFAFA
}
also function - also 함수
also 함수는 타입 객체의 확장 함수이며 객체를 it 키워드로 사용할 수 있고 반환값은 객체 자체이다.
var a = 1
var b = 2
a = b.also { b = a }
'프로그래밍 > Kotlin' 카테고리의 다른 글
Kotlin 배우기 (3) (0) | 2024.02.13 |
---|---|
Kotlin 배우기 (1) (0) | 2024.02.01 |
[Kotlin 기초 2] Objects (3) (9) | 2023.02.17 |
[Kotlin 기초 2] Objects (2) (6) | 2023.02.09 |
[Kotlin 기초 2] Objects (1) (4) | 2023.02.09 |
댓글