μ½νλ¦° DSL
DLSλ?
- λλ©μΈ νΉν μΈμ΄ (Domain-specific language) βοΈ λ²μ© νλ‘κ·Έλλ° μΈμ΄
- μ μΈμ μΈμ΄
- μΈλΆ μ€νμ μΈμ΄λ₯Ό ν΄μνλ μμ§μ 맑κΉ
- μ»΄νμΌ μμ μ μ λλ‘ κ²μ¦νλ κ²μ΄ μ΄λ €μ
μ½νλ¦° DSLμ΄λ?
- λ²μ© μΈμ΄(= μ½νλ¦°)λ‘ μμ±λ νλ‘κ·Έλ¨μ μΌλΆ
- λ²μ© μΈμ΄μ λμΌν λ¬Έλ² μ¬μ©
- νΈμΆ κ²°κ³Όλ₯Ό κ°μ²΄λ‘ λ³ννκΈ° μν΄ λ Έλ ₯ν νμ μμ
- νμ μμ μ± λ³΄μ₯
μ½νλ¦°μ κ°κ²°ν ꡬ문μ μ΄λ»κ² μ§μνλκ°?
- νμ₯ ν¨μ
- μ€μ νΈμΆ
- μ°μ°μ μ€λ²λ‘λ©
- get λ©μλμ λν κ΄λ‘
- λλ€λ₯Ό κ΄νΈ λ°μΌλ‘ λΉΌλ κ΄λ‘
- μμ κ°μ²΄ μ§μ λλ€
νμ₯ ν¨μ Extension functions
- μ½νλ¦°μ ν΄λμ€λ₯Ό νμ₯ν΄μ μλ‘μ΄ κΈ°λ₯μ κ°λ°ν μ μλλ‘ μ§μ
μμ
κ³Όλ μ‘°κΈ λ€λ₯Έ κ°λ - ex) μΈλΆ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν λ μ΄ μ체 ν΄λμ€λ λ³κ²½ν μ μμ§λ§ μ΄λ₯Ό νμ₯ν΄ μνλ μλ‘μ΄ ν¨μλ₯Ό λ§λ€ μ μμ
"Kotlin".lastChar()
fun String.lastChar(): Char {
return this.get(this.length - 1)
}
μ€μ νκΈ° Infix notation
μ€μνκΈ°λ²?
infix(μ€μνκΈ°λ²) : μΌμμνμμμ μμ νκΈ°λ²μΌλ‘ λ κ°μ νΌμ°μ°μ μ¬μ΄μ μ°μ°μκ° μ‘΄μ¬νλ ννλ°©μμ΄λ€. ex) X + Y
Kotlinμμ infix
ν€μλλ₯Ό μ¬μ©νμ¬ μ€μνκΈ°λ²μΌλ‘ ν¨μλ₯Ό νΈμΆν μ μλ€. λ¨, μλ μ건μ μΆ©μ‘±ν΄μΌ νλ€.
- They must be member functions or extension functions. (λ©€λ² ν¨μ νΉμ νμ₯ ν¨μμΌ λ)
- They must have a single parameter. (λ¨μΌ λ§€κ° λ³μμΌ λ)
- The parameter must not accept a variable number of arguments and must have no default value. (κ°λ³μΈμλ₯Ό λ°μΌλ©΄ μλκ³ κΈ°λ³Έ κ°μ κ°μ§λ©΄ μλλ€.)
1 to "one"
infix fun Any.to(other: Any) = Pair(this, other)
μ°μ°μ μ€λ²λ‘λ© Operator overloading
Point(0, 1) + Point(1, 2)
data class Point(val x: Int, val y: Int) {
operator fun plus(other: Point): Point = Point(x + other.x, y + other.y)
}
- plus ν¨μ μμ
operator
ν€μλλ₯Ό λΆμ¬ μ°μ°μ μ€λ²λ‘λ©μ νλ ν¨μμμ λͺ μ - νμ₯ ν¨μλ‘ μ μν μλ μμ
μ΄ν μ°μ μ°μ° μ€λ²λ‘λ©
μ°μ° μ°μ μμ | μ | ν¨μ μ΄λ¦ |
---|---|---|
1 | a * b | times |
1 | a / b | div |
1 | a % b | mod(1.1λΆν° rem) |
2 | a + b | plus |
2 | a - b | minus |
- λ λ§μ μ°μ°μμ λν λ©μλλ 곡μλ¬Έμ μ°Έκ³
get λ©μλμ λν κ΄λ‘ Indexed access operator
val names = listOf("am", "mazzi")
names.get(0)
names[0]
- getμ΄ μλ μΈλ±μ€λ‘ μ κ·Όνλ€.
λλ€λ₯Ό κ΄νΈ λ°μΌλ‘ λΉΌλ΄λ κ΄λ‘ Passing a lambda to the last parameter
check(false) { "Check failed." }
μμ κ°μ²΄ μ§μ λλ€ Lambda with receiver
- λλ€ ν¨μλ₯Ό μΈ λ λ΄κ° μμ£Ό μ°κ³ μΆμ κ°μ²΄λ₯Ό 미리 μ§μ ν΄μ μ¬μ©νλ λλ€
μμ κ°μ²΄?
- νμ₯ ν¨μμμμ thisλ νμ₯λ ν΄λμ€μ κ°μ²΄
- μ¦ νμ₯ ν¨μλ₯Ό μ¬μ©νλ κ·Έ κ°μ²΄λ₯Ό μλ―Ένλλ° μ΄ κ°μ²΄κ° λ°λ‘ μμ κ°μ²΄
with
- 첫 λ²μ§Έ μΈμλ‘ λ°μ κ°μ²΄λ₯Ό λ λ²μ§Έ μΈμλ‘ λ°μ λλ€μ μμ κ°μ²΄λ‘ λ§λ¦
withλ₯Ό μ¬μ©νμ§ μμ κ²½μ°
fun alphabet(): String {
val result = StringBuilder()
for (letter in 'A'..'Z') {
result.append(letter)
}
result.append("\nNow I know this alphabet!")
return result.toString()
}
result
μ μ€λ³΅μ΄ λ°μ
withλ₯Ό μ¬μ©ν κ²½μ°
fun alphabet(): String {
val stringBuilder = StringBuilder()
return with(stringBuilder) {
for (letter in 'A'..'Z') {
this.append(letter)
}
append("\n amazzi~~~!")
this.toString()
}
}
// λΆνμν stringBuilder λ³μλ₯Ό μμ λ©΄ alpabet ν¨μκ° μμ κ²°κ³Όλ₯Ό λ°λ‘ λ°ννκ² λλ€.
// λλ€ μμ λ³Έλ¬Έμ μλ λ§μ§λ§ μμ κ°μ λ°ν
fun alphabet(): String = with(StringBuilder()) {
for (letter in 'A'..'Z') {
append(letter)
}
append("\nNow I know this alphabet!")
toString()
}
}
- with(stringBuilder, { β¦ }) μ κ°μ λλ€ ν¨μ
apply
- withμ μ μ¬
- μ μΌν μ°¨μ΄λ νμ μμ μκ² μ λ¬λ κ°μ²΄λ₯Ό λ°ν
- κ°μ²΄μ μΈμ€ν΄μ€λ₯Ό λ§λ€λ©΄μ μ¦μ νλ‘νΌν° μ€ μΌλΆλ₯Ό μ΄κΈ°νν΄μΌλλ κ²½μ° μ μ©
fun alphabet(): String = StringBuilder().apply {
for (letter in 'A'..'Z') {
append(letter)
}
append("\nNow I know this alphabet!")
}.toString()
μ΄κΈ°νλ₯Ό μ§μ°νλ λ°©λ²
- μ½νλ¦°μμλ λ³μ μ μΈμ λ¨Όμ νκ³ , μ΄κΈ°νλ λ€λ‘ 미루λ κΈ°λ₯λ€μ μ 곡
- μ¬μ©ν μ§ λͺ¨λ₯Έλ λ°μ΄ν°λ₯Ό 미리 μ΄κΈ°νν νμκ° μμ΄ μ±λ₯ ν₯μμ λμ
lateInit
- νμν λ μ΄κΈ°ννκ³ μ¬μ©
- μ΄κΈ°ν νμ§ μκ³ μ¬μ©νλ©΄ μμΈ λ°μ
var
μλ§ μ¬μ© κ°λ₯- μμ νμ μλ μ μ©ν μ μμ
- custom getter/setter μ¬μ© λΆκ°
- non-null νλ‘νΌν°λ§ μ¬μ© κ°λ₯
lazy
- λ³μλ₯Ό μ μΈν λ μ΄κΈ°ν μ½λλ ν¨κ» μ μ
- λ³μκ° μ¬μ©λ λ μ΄κΈ°ν μ½λλ λμνμ¬ λ³μκ° μ΄κΈ°ν λ¨
0602 μ½λ리뷰
enum class Symbol(val symbol: String) {
DIAMOND("λ€μ΄μλͺ¬λ"),
SPADE("μ€νμ΄λ"),
HEART("ννΈ"),
CLOVER("ν΄λ‘λ²"),
;
}
- 1.4λΆν°
,
λ‘ λλλ μ»΄νμΌ μλ¬κ° μλ¨
Propertyμ Field
Field
- λ¨μν κ°λ§ κ°μ§
- κ°μ κ°μ Έμ€κ±°λ λ³κ²½ν λλ μ§μ μ°Έμ‘°
- ν¨μλ λΈλ‘ λ΄λΆμ μ μΈλ μ§μ λ³μλ λͺ¨λ νλλ‘ κ°μ£Ό
var count = 100 // λ©λͺ¨λ¦¬κ° ν λΉλκ³ κ°μ΄ μ μ₯λ¨
println(count) // count λ³μκ°μ μ§μ μ°Έμ‘°νμ¬ κ°μ Έμ΄
count += 200 // count λ³μκ°μ μ§μ λ³κ²½
Property
- μ΅μμ λ³μ(ν¨μλ ν΄λμ€ μΈλΆμ μ μλ¨)λ ν΄λμ€μ λ©€λ² λ³μλ‘ μ μΈλ¨
- μ μΈ μ ν΄λΉ μμ±μ getter/ setterκ° μλμΌλ‘ μμ±λ¨
val
λ‘ μ μΈμ getter λ§ μμ±λ¨- κ°μ κ°μ§μ§λ§ μμ±μ κ°μ κ°μ Έμ€κ±°λ λ³κ²½ν λλ μλμΌλ‘ κ΄λ ¨ ν¨μκ° νΈμΆλ¨
- μ΄λ₯Ό μ κ·Όμ λΌκ³ ν¨
var count = 100 // λ©λͺ¨λ¦¬κ° ν λΉλκ³ κ°μ΄ μ μ₯λ¨
println(count) // count μμ±μ μ κ·Όμκ° νΈμΆλμ΄ μμ±κ°μ λ°ν
count += 200 // count μμ±μ μ κ·Όμκ° νΈμΆλμ΄ μμ±κ°μ λ³ν
μ₯ κ·Όλ° νλμ λμΌνκ² μ½λλ₯Ό μμ±νλλ°? π€
- νλ‘κ·Έλλ¨Έκ° λ³΄λ κ΄μ μμλ κ°μ§λ§, μ½νλ¦° μ»΄νμΌλ¬λ λ€λ₯΄κ² λμν¨
- λ€μκ³Ό κ°μ΄ count μμ±μ μ κ·Όμλ₯Ό μλμΌλ‘ μμ±
- count μμ±μ κ°μ κ°μ Έμ€κ±°λ λ³κ²½ν λ μλμΌλ‘ νΈμΆ λ¨
var couhnt = 100
get() = field
set(value: Int) {
field = value
}
get()
κ³Όset()
μ΄ μ κ·Όμ
fun main(args: Array<String>) {
pro1 += pro2
println(pro1)
}
var pro1 = 100 // μ΅μμ μμ€μ λ³μμ΄λ―λ‘ μμ±μ
var pro2 = 200 // μ΅μμ μμ€μ λ³μμ΄λ―λ‘ μμ±μ
- pro2μ κ²ν°κ° νΈμΆλμ΄ κ°μ κ°μ Έμ΄
- pro1μ κ²ν°μμ λ°νλ κ°κ³Ό λν¨
- μ΄ κ°μ΄ pro1μ μΈν°μ μΈμλ‘ μ λ¬λμ΄ pro1μ κ°μ΄ λ³κ²½λ¨
- pro1 κ²ν°μμ λ°νλ κ°μ μΆλ ₯
νλ‘νΌν°μ =
μ μ΄μ©ν΄μ ν λΉνλκ±°λ getμ μ¬μ©ν΄μ
val shouldDraw = cards.score()
val shouldDraw2 : Boolean
get() = cards.scroe()
- getμ μ°λ κ²μ λ§€λ² λλλ§λ€ κ³μ°μ΄ λ¨
- νλ‘νΌν°μ μ κ·Όμ κ³μ°λμ΄ μλ κ°μ μ
Backing fieldsο»Ώ
- 컀μ€ν getterμ setterλ₯Ό μ 곡ν κ²½μ° μ¬μ©
- μμ±μ΄ νλμ κ°μ νμλ‘ ν λ μ½νλ¦°μ μ§μ νλ ν€μλλ₯Ό μ 곡
- getterμ setter λ²μμμλ§ μ¬μ© κ°λ₯
field
μ§μμλ₯Ό ν΅ν΄ μμ±μ κ²ν°λ μΈν°μμ μ¬μ©
var counter = 0 // the initializer assigns the backing field directly
set(value) {
if (value >= 0)
field = value
// counter = value // ERROR StackOverflow: Using actual name 'counter' would make setter recursive
}
μλ μμ μ this
λ backing fieldκ° μλ
val isEmpty: Boolean
get() = this.size == 0
Backing propertiesο»Ώ
- Backing fieldsο»Ώμ 체κ³μ λ§μ§ μλ μμ μ μνν κ²½μ° μ΄λ Backing propertiesο»Ώκ° λ¨
class Skills(skills: List<String> = mutableListOf()) {
private val _skills: MutableList<String> = skills.toMutableList()
val skills: List<String>
get() = _skills.toList()
fun soft(soft: String) {
this._skills.add(soft)
}
fun hard(hard: String) {
this._skills.add(hard)
}
}
as
ν€μλ μ¬μ©ν΄λ λλμ¬?
val results = resultBoard.values as List<GameResult>
- μλ°μ νμ λ³νκ³Ό κ°μ κ²