
์์ดํ 33. ์์ฑ์ ๋์ ํฉํ ๋ฆฌ ํจ์๋ฅผ ์ฌ์ฉํ๋ผ
ํฉํ ๋ฆฌ ํจ์์ ์ฅ์
- ํจ์์ ์ด๋ฆ์ ์ถ๊ฐํ ์ ์๋ค.
- ArrayList(3) vs ArrayList.withSize(3)
- ์ํ๋ ํ์ ์ ๋ฆฌํด์ด ๊ฐ๋ฅํ๋ค.
- ํธ์ถ๋ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค ํ์๊ฐ ์๋ค.
- ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ null ๋ฆฌํด์ ํ๋๋ก ๋ง๋ค ์ ์๋ค.
- ex) createOrNull(), findByIdOrNull()
- inline, reified๋ก ๋ง๋ค ์ ์๋ค.
- ์ธ๋ผ์ธ ํจ์๋ก ๋ง๋ค๋ฉด ์ปดํ์ผ ํ ์์ฑ๋๋ ๋ฐ์ดํธ์ฝ๋์ ํจ์ ๋ณธ๋ฌธ์ด ๋ค์ด๊ฐ์ ํจ์ ํธ์ถ์ ์ค๋ฒํค๋๊ฐ ์์ด์ง๋ค.
- reified๋ก ๋ง๋ค๋ฉด ์ ๋ค๋ฆญ ํ์ ์ ์ ๋ณด๋ฅผ(Class Type) ๋ฐํ์์๋ ์ฌ์ฉํ ์ ์๋ค.
์ฝํ๋ฆฐ์์ ํฉํ ๋ฆฌ ํจ์
class MyList<T>(
val head: T,
val tail: MyList<T>,
) {
companion object {
fun <T> of(vararg elements: T): MyList<T> { // ํฉํ ๋ฆฌ ํจ์
// ...
}
}
}
// ์ธํฐํ์ด์ค
class MyLinkedList<T>(
val head: T,
val tail: MyLinkedList<T>?
) : MyList<T> {
// ...
}
interface MyList<T> {
// ...
companion object {
fun <T> of(vararg elements: T): MyList<T> {
// ...
}
}
}
val list = MyList.of(1, 2)
ํฉํ ๋ฆฌ ํจ์ ๋ค์ด๋ฐ
- from: ํ๋ผ๋ฏธํฐ๋ฅผ ํ๋ ๋ฐ๊ณ , ๋์ผํ ์ธ์คํด์ค ํ๋๋ฅผ ๋ฆฌํดํ๋ ํจ์
- of: ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ฐ๊ณ , ์ด๋ฅผ ํตํฉํ์ฌ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ํจ์
- instance(getInstance): ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌํ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ํจ์
- get(), new() ...
ํ์ฅ ํฉํ ๋ฆฌ ํจ์
- ๊ฐ์ฒด์ ํจ์์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ ํฉํ ๋ฆฌ ํจ์๋ฅผ ๋ง๋ค์ด์ผ ํ ๋, ์ด๋ฏธ ๋ค๋ฅธ companion ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ํ์ฅ ํจ์๋ฅผ ํ์ฉํ ์ ์๋ค.
// ์ด๋ฏธ companion object๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ
class Tool {
companion object {
fun createSmallTool(): Tool = Tool()
fun createMediumTool(): Tool = Tool()
// ์ฌ๊ธฐ์ ์๋ก์ด ํฉํ ๋ฆฌ ํจ์๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ง๋ง...
// 1) ์์ค์ฝ๋๋ฅผ ์์ ํ ์ ์๊ฑฐ๋
// 2) ๋ค๋ฅธ ๋ชจ๋/๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํด๋์ค์ธ ๊ฒฝ์ฐ
// 3) ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ฅผ ์ํด ๋ณ๋๋ก ๊ด๋ฆฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ
}
}
// ํ์ฅ ํฉํ ๋ฆฌ ํจ์
fun Tool.Companion.createBigTool(size: Int): Tool {
return Tool().apply {
// BigTool ํน๋ณํ ์ด๊ธฐํ ๋ก์ง
}
}
ํฑ๋ ๋ฒจ ํฉํ ๋ฆฌ ํจ์
- ์ปฌ๋ ์ ์์ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ํ์ ์ธ ํฉํ ๋ฆฌ ํจ์ ์ค listOf, setOf, mapOf ๋ฑ์ด ์๋ค.
- public ํฑ๋ ๋ฒจ ํจ์๋ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉํ ์ ์๊ณ , ๋ค์ด๋ฐ ๋ฑ์ ์์ด์ ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํ๋ค.

expect๋ Kotlin Multiplatform์์ ์ฌ์ฉ๋๋ ํค์๋๋ก, ํ๋ซํผ๋ณ๋ก ๋ค๋ฅธ ๊ตฌํ์ ์ ๊ณตํ ์ ์๋๋ก ํ๋ ๋ฉ์ปค๋์ฆ
๊ฐ ํ๋ซํผ๋ณ ์ค์ ๊ตฌํ์ actual ํค์๋๋ก ๊ตฌํํ ์ ์๋ค.
// ๊ณตํต ์ฝ๋์์ ์ ์ธ๋ง ํ๊ณ ๊ตฌํ์ ํ์ง ์์
@SinceKotlin("1.9")
public expect fun <T> listOf(element: T): List<T>
// JVM ํ๋ซํผ ๊ตฌํ
public actual fun <T> listOf(element: T): List<T> =
java.util.Collections.singletonList(element)
// JavaScript ํ๋ซํผ ๊ตฌํ
public actual fun <T> listOf(element: T): List<T> =
arrayOf(element).asList()
// Native ํ๋ซํผ ๊ตฌํ
public actual fun <T> listOf(element: T): List<T> =
ImmutableList.of(element)
์์ดํ 34. ๊ธฐ๋ณธ ์์ฑ์์ ์ด๋ฆ ์๋ ์ต์ ์๊ท๋จผํธ๋ฅผ ์ฌ์ฉํ๋ผ
๊ฐ์ฒด๋ฅผ ์ ์ํ๊ณ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ๊ธฐ๋ณธ ์์ฑ์(primary constructor)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ
class User(val name: String, val surname: String)
val user = User(name = "A", surname = "B")
์ฝํ๋ฆฐ์์๋ ๋ํดํธ ์๊ท๋จผํธ๋ฅผ ์ฌ์ฉํ๋ค.
class Pizza(
val size: String,
val cheese: Int = 0,
val olives: Int = 0,
val bacon: Int = 0
)
val myFavorite = Pizza("L", olives = 3)
val myFavorite = Pizza("L", cheese = 1, olives = 3)
์์ดํ 35. ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ DSL์ ์ ์ํ๋ผ
DSL(Domain Specific Language)์ ๋ณต์กํ ๊ฐ์ฒด, ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด๋ค์ ์ ์ํ ๋ ์ ์ฉํ๋ค.
import javax.management.Query.div
// ์ฝํ๋ฆฐ DSL์ ํตํด ํํํ HTML
body {
div {
a("https://kotlinlang.org") {
target = ATarget.blank
+"Main site"
}
}
+"Some content"
}
// Main site
// Some content
// Android View DSL
verticalLayout {
val name = editText()
button("Say Hello") {
onClick { toast("Hello, ${name.text}!") }
}
}
// Ktor API
fun Routing.api() {
route("news") {
get {
val newsData = NewsUseCase.getAcceptedNews()
call.respond(newsData)
}
get("propositions") {
requireSecret()
...
}
}
}
// kotest
class SearchTest : BehaviorSpec(
{
given("SearchTest") {
`when`("๋๋ค์ผ๋ก ์
ํํ ๋ณํธ์ฌ๊ฐ 8๋ช
๋ณด๋ค ์ ์ ๊ฒฝ์ฐ,") {
then("์
ํ๋ง ์์ด ๋ชจ๋ ๋ณํธ์ฌ๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๋ค.") {
val sut = List(5) { LawyerSearchFixture.create(lawyerId = it.toLong()) }
val actual = LawyerSearch.getShuffledLawyerSearches(sut)
assertSoftly {
actual.size shouldBe sut.size
actual shouldBe sut
}
}
}
}
},
)
์ฌ์ฉ์ ์ ์ DSL
๋ฆฌ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ ํจ์ ํ์ ์ ๋ํ ๊ฐ๋ ์ ์ดํดํด์ผ ํ๋๋ฐ, ํจ์ ํ์ ์ ํจ์๋ก ์ฌ์ฉํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ํ์
// predicate์ ํจ์ ํ์
์ด ํ์ฉ
public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
return filterTo(ArrayList<T>(), predicate)
}
ํจ์ ํ์ ์ ์์
- () → Unit : ์๊ท๋จผํธ๋ฅผ ๊ฐ์ง ์๊ณ , Unit ๋ฐํ
- (Int) → Unit
- (Int, Int) → Int
ํจ์ ํ์ ์ ๋ง๋๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ
- ๋๋ค ํํ์, ์ต๋ช ํจ์, ํจ์ ๋ ํผ๋ฐ์ค
fun plus(a: Int, b: Int) = a + b
// plus() ์ ์ ์ฌ ํจ์
val plus1: (Int, Int) -> Int = { a, b -> a + b }
val plus2: (Int, Int) -> Int = fun(a, b) = a + b
val plus3: (Int, Int) -> Int = ::plus
val plus4: { a: Int, b: Int -> a + b }
'Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์ดํํฐ๋ธ ์ฝํ๋ฆฐ - 6์ฅ ํด๋์ค ์ค๊ณ (0) | 2025.10.25 |
|---|---|
| ์ดํํฐ๋ธ ์ฝํ๋ฆฐ - 4์ฅ ์ถ์ํ ์ค๊ณ (1) | 2025.07.12 |
| ์ดํํฐ๋ธ ์ฝํ๋ฆฐ - 3์ฅ ์ฌ์ฌ์ฉ์ฑ (0) | 2025.06.25 |
| ์ดํํฐ๋ธ ์ฝํ๋ฆฐ 2์ฅ - ๊ฐ๋ ์ฑ (2) | 2025.06.14 |
| ์ดํํฐ๋ธ ์ฝํ๋ฆฐ - 1์ฅ ์์ ์ฑ (2) | 2025.06.03 |
๋๊ธ