π Kotlin - Class(ν΄λμ€)
μλ νμΈμ, μ΄λ² μκ°μλ μ½νλ¦° ν΄λμ€μ λν΄ μ 리ν΄λ³΄κ² μ΅λλ€.
μ΄λ² κ°μΈ νλ‘μ νΈμμ μ½νλ¦°μ μ²μ μ¬μ©ν΄μ κ°λ°μ μ§ννκ³ μμ΅λλ€λ§.. μμ§ μ½νλ¦°μ λ―μ€κΈ°λ§ νλ€μ..
- forλ¬Έ, λ°°μ΄ μμ±, μμ±μ, open ν€μλ, λΆλ³, ?, !, !! λ±λ± ...
κΈ°μ‘΄μ μ¬μ©νλ μλ°μλ λ¬Έλ²μ μΌλ‘ λ€λ₯ΈλΆλΆμ΄ κ½€(?) μ‘΄μ¬νκΈ° λλ¬Έμ λ¨κΈ°κ°μ μΉν΄μ§κΈ°κ° νλ κ² κ°μ΅λλ€.
μλ°μ μ΅μνλ€λ©΄ μ½νλ¦°μ μΌμ£ΌμΌμ λλ©΄ μΆ©λΆνλ€.. λΌλ κΈμ λ³Έ μ μ΄ μμλλ°μ, μ λ μμ§ μλ°μ μ΅μνμ§κ° μλλ΄
λλ€ π
μμΌλ‘ ν·κ°λ¦¬λ λΆλΆμ΄ μκΈΈλλ§λ€ ννν μ½νλ¦°μλν΄ μ 리λ₯Ό νλ €κ³ ν©λλ€.
μ΄λ² μκ°μ μ 리ν λ΄μ©μ ν΄λμ€μ λλ€. μ½νλ¦°μμμ ν΄λμ€λ μμ±μλ open ν€μλ, companion object λ±λ± μλ°μλ μ‘΄μ¬νμ§ μλ ν€μλλ€μ΄ μ‘΄μ¬νκΈ° λλ¬Έμ μ²μ μ νλ€λ©΄ ν·κ°λ¦΄ μ μλλ°μ, μ΄μ λν΄ μ 리ν΄λ³΄κ² μ΅λλ€.
ν΄λΉ ν¬μ€ν μ μ½νλ¦°μ 곡μλ¬Έμλ₯Ό μ°Έκ³ νμ¬ μμ±νμμ΅λλ€.
Classes
μ½νλ¦°μ ν΄λμ€λ μλ°μ λμΌνκ² class ν€μλλ₯Ό μ¬μ©νμ¬ μ μΈν μ μμ΅λλ€.
class Person { /* .. */ }
ν΄λμ€μ μ μΈμ μ΄λ¦κ³Ό ν€λλΆλΆ, λ°λλΆλΆμΌλ‘ ꡬμ±μ΄ λ©λλ€.
- Header : νμ νλΌλ―Έν°, μ£Ό μμ±μ, κΈ°ν λ±λ±
ν€λλΆλΆκ³Ό λ°λλΆλΆμ μ νμ μΌλ‘ μλ λΆλΆμμ λ€μ μ€λͺ λλ¦¬κ² μ΅λλ€.
Constructor(μμ±μ)
μ λ μ½νλ¦°μμ μ΄ μμ±μ λΆλΆμ΄ κ΅μ₯ν ν·κ°λ Έμ΅λλ€. μ΄λ€κ³³μ μκ΄νΈλ₯Ό, μ΄λ€κ³³μ μ€κ΄νΈλ₯Ό μ¬μ©νλλ° λκ°λμ§ λͺ°λμλλ°μ, μΈμ μ΄λ ν λ°©μμ μ¬μ©νλμ§ μμλ³΄κ² μ΅λλ€.
λ¨Όμ μ½νλ¦°μμ μμ±μλ μ£Ό μμ±μ(Primary Constructor)μ ν κ° μ΄μμ λΆ μμ±μ(Secondary Constructors)κ° μμ΅λλ€.
μ£Ό μμ±μλ ν΄λμ€ ν€λλΆλΆμ μμ±νλ©° ν΄λμ€ μ΄λ¦ λ€μμ μμ±νκ³ , λ°λμ νμλ μλλλ€.
λν μ£Ό μμ±μμλ μ΄λ ν μ½λλ ν¬ν¨ν μ μμ΅λλ€.
class Person constructor(name: String)
// μ£Όμμ΄λ κ°μμ± μ κ·Όμ μμΌλ©΄ constructor μλ΅ κ°λ₯
class Person(name: String)
μ΄κΈ°ν μ½λλ init ν€μλλ₯Ό μ¬μ©νμ¬ μ΄κΈ°ν λΈλ‘μμ μ€μ ν μ μμ΅λλ€.
class Init(name: String) {
init {
println("First initializer block that prints $name")
}
val secondProperty = "Second property: ${name.length}".also(::println)
init {
println("Second initializer block that prints ${name.length}")
}
}
fun main() {
Init("Hello Kotlin")
}
λν λ€μμ²λΌ μ£Ό μμ±μμ νλΌλ―Έν°λ₯Ό μ΄κΈ°ν λΈλ‘μμ μ¬μ©ν μ μμ΅λλ€.
class Customer(name: String) {
val customerKey = name.uppercase()
}
μ½νλ¦°μ μ£Ό μμ±μμ μμ±λ€μ μ μΈνκ³ μ΄κΈ°ννλ κ°κ²°ν λ¬Έλ²μ μ 곡ν©λλ€.
class Person(val firstName: String, val lastName: String, var age: Int)
λν λ€μκ³Ό κ°μ΄ μ£Ό μμ±μμμ λν΄νΈ κ°μ μ€μ ν μ μμ΅λλ€.
class Person(val name: String, var isEmployeed: Boolean = true)
λ€μκ³Ό κ°μ΄ trailing commaλ₯Ό ν΅ν΄μλ μ μΈν μ μμ΅λλ€.
class Person(
val firstName: String,
val lastName: String,
var age: Int
)
Secondary constructors(λΆ μμ±μ)
constructor ν€μλλ₯Ό ν΅ν΄ λΆ μμ±μλ₯Ό μ μΈν μ μμ΅λλ€.
class Person(val pets: MutableList<Pet> = mutableListOf())
class Pet {
constructor(owner: Person) {
owner.pets.add(this)
}
}
λ§μ½ ν΄λμ€μ μ£Ό μμ±μ(Primary constructor)μ΄ μλ κ²½μ°, λΆ μμ±μλ μ§κ°μ μ μΌλ‘ λ€λ₯Έ λΆμμ±μλ₯Ό ν΅ν΄ μ£Ό μμ±μμκ² μμμ ν΄μΌν©λλ€.
λμΌν ν΄λμ€μμ λ€λ₯Έ μμ±μμ λν μμμ this ν€μλλ₯Ό μ¬μ©ν μ μμ΅λλ€.
class Person(val name: String) {
val children: MutableList<Person> = mutableListOf()
constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
}
}
μ μ½λμμ this(name)μ ν΅ν΄ μ£Ό μμ±μ(val name: String)μ μμμ νκ³ μμ΅λλ€.
κΈ°λ³Έ μμ±μλ₯Ό 곡κ°νμ§ μκΈ°λ₯Ό μνλ€λ©΄, private ν€μλλ₯Ό μ¬μ©νλ©΄ λ©λλ€.
class Kotlin private constructor ()
β» JVMμμ κΈ°λ³Έ μμ±μμ λͺ¨λ 맀κ°λ³μμ κΈ°λ³Έκ°μ΄ μλ κ²½μ°, μ»΄νμΌλ¬λ μΆκ°μ μΌλ‘ νλΌλ―Έν°κ° μλ(λν΄νΈ) μμ±μλ₯Ό μμ±ν©λλ€. μ΄λ¬ν λ°©μμ 맀κ°λ³μκ° μλ μμ±μλ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μμ±νλ JPAλ Jacksonμ κ°μ λΌμ΄λΈλ¬λ¦¬μ ν¨κ» μ¬μ©ν μ μμ΅λλ€.
class Customer(val name: String = "", val age: Int = 0)
Creating instances of classes
μ΄μ μ½νλ¦°μμ κ°μ²΄λ₯Ό μμ±νλ λ°©λ²μ λν΄ μ΄ν΄λ³΄κ² μ΅λλ€.
κΈ°μ‘΄ μλ°μλ λ€λ₯΄κ² μ½νλ¦°μμλ new ν€μλκ° μ‘΄μ¬νμ§ μμ΅λλ€.
μ΄ λΆλΆλ μ λ μ²μ μ¬μ©ν λ μ½κ° ν·κ°λ¦¬λ λΆλΆμ΄μμ΅λλ€.
class Customer(var name: String = "", var age: Int = 0) {
override fun toString(): String {
return "Customer(name='$name', age=$age)"
}
}
fun main() {
val noArgCustomer = Customer()
val argsCustomer = Customer("JuHyun", 20)
println(noArgCustomer)
println(argsCustomer)
}
Inheritance(μμ)
μ½νλ¦°μμμ μμλν μλ°μ μ½κ° λ€λ¦ λλ€. μλ°μμ μ΅μμ ν΄λμ€λ Objectμ΄μ§λ§, μ½νλ¦°μμλ AnyλΌλ ν΄λμ€μ λλ€.
μ½νλ¦°μμλ κΈ°λ³Έμ μΌλ‘ ν΄λμ€κ° finalμ΄κΈ° λλ¬Έμ μμμ ν μ μμ΅λλ€. λ°λΌμ μμμ κ°λ₯νκ² νλ €λ©΄ open ν€μλλ₯Ό μ μΈν΄μΌ ν©λλ€.
open class Parent(var name: String)
class child(var names: String) : Parent(names)
λ§μ½ λΆλͺ¨ ν΄λμ€μ open ν€μλλ₯Ό μ μΈνμ§ μλλ€λ©΄ μλμ²λΌ μ»΄νμΌ μλ¬κ° λ°μν©λλ€.
Abstract classes(μΆμ ν΄λμ€)
μΆμ ν΄λμ€λ μλ°μ λμΌνκ² abstract ν€μλλ₯Ό μ μΈνλ©΄ λ©λλ€. λν μΆμ ν΄λμ€λ₯Ό μμν κ²½μ° open ν€μλλ₯Ό μ μΈνμ§ μμλ μ»΄νμΌ μλ¬κ° λ°μνμ§ μμ΅λλ€.
abstract class Polygon {
abstract fun draw()
}
class Rectangle : Polygon() {
override fun draw() {
}
}
Companion Object
μ½νλ¦°μμλ μλ°μ staticμ΄ μλλμ Companion Objectλ₯Ό μ¬μ©ν΄ λΈλ‘{} μμ λ©€λ²λ₯Ό ꡬμ±ν©λλ€.
μ¦, ν΄λμ€ μΈμ€ν΄μ€ μμ΄ νΈμΆν μ μλμ μ ν©ν°λ¦¬ λ©μλλ₯Ό μλ―Έν©λλ€.
data class ErrorResponse(
val message: String? = null,
val errors: MutableList<Error>? = mutableListOf()
) {
private constructor(message: String) : this(message, null)
companion object {
fun of(message: String?) = of(message, null)
fun of(message: String?, errors: MutableList<Error>?) = ErrorResponse(message, errors)
}
}
fun main() {
val errorResponse = ErrorResponse.Companion.of("message")
val errorResponse2 = ErrorResponse.Companion.of("message", null)
}
μμ κ°μ΄ companion object ν€μλλ₯Ό ν΅ν΄ 2κ°μ of λ©μλλ₯Ό μ μΈνκ³ , main λ©μλμμ ν΄λμ€λͺ .Companion.λ©μλλͺ μΌλ‘ μ κ·Όμ ν μ μμ΅λλ€. (Companionμ μλ΅μ΄ κ°λ₯ν©λλ€.)
β» κ·ΈλΌ Companion Objectμ staticμ΄ λμΌνκ°μ?
-> κ·Έλ μ§λ μμ΅λλ€. Companion Objectμ κ²½μ° κ°μ²΄μΈλ°μ, μλ μ½λλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
companion objectλ κ°μ²΄μ΄λ€.
class MyClass {
companion object {
val message = "Companion Object message"
fun com() = "com method"
}
}
fun main() {
// 1) companion objectλ κ°μ²΄μ΄λ―λ‘ λ³μμ ν λΉμ΄ κ°λ₯
val com1 = MyClass.Companion
println(com1.message)
println(com1.com())
// 2)
val com2 = MyClass
println(com2.message)
println(com2.com())
}
1) μ com1 λ³μλ MyClassμ CompanionμΌλ‘ ν λΉμ΄ κ°λ₯ν©λλ€.
κ·Έ ν com1λ³μμ μ (.)μΌλ‘ companion objectμ λ©€λ²λ€μ μ κ·Όμ ν μ μμ΅λλ€. μ΄μ²λΌ λ³μμ ν λΉνλ κ²μ μλ°μ ν΄λμ€μμ static ν€μλλ‘ μ μλ λ©€λ²λ‘λ λΆκ°λ₯ν λ°©λ²μ λλ€.
2) λ λ²μ§Έ com2 λ³μλ .Companionμ μ μΈνκ³ μ§μ MyClassλ‘ ν λΉμ νμ΅λλ€. μ΄κ²λν companion objectμ΄λ―λ‘ ν΄λΉ λ©€λ²λ€μ μ κ·Όμ ν μ μμ΅λλ€. μ¦, κΈ°μ΅ν΄μΌ ν μ μ ν΄λμ€ λ΄ μ μλ companion objectλ ν΄λμ€ μ΄λ¦λ§μΌλ‘λ μ°Έμ‘°κ° κ°λ₯νλ€λ μ μ λλ€.
μλ°μμμ static ν€μλλ μ½νλ¦°μ companion objectμλ λ¬λ¦¬ νλμ λ 립λ κ°μ²΄λ‘ μ¬κ²¨μ§ μ μκΈ° λλ¬Έμ, μ°¨μ΄μ μ΄ μμ΅λλ€.
companion objectλ μ΄λ¦μ μ μΈν μ μλ€.
class MyClass {
companion object Info {
val message = "Companion Object message"
fun com() = "com method"
}
}
fun main() {
println(MyClass.Info.message)
println(MyClass.message)
}
companion objectμ λν΄ μΆκ°μ μΌλ‘ κΆκΈνμ λΆμ μλ κΈμ μ€λͺ μ΄ μλμ΄μμΌλ μ°Έκ³ ν΄μ£ΌμΈμ :)
μ 리
κ·Έλμ μ½νλ¦°μ 곡μλ¬Έμκ° μ λ§ μλμ΄μμ΄μ 곡μλ¬Έμλ§ λ΄λ μΆ©λΆνλ€λ κΈμ λͺλͺλ΄€μλλ°μ, μ΄λ²μ μ½νλ¦° 곡μλ¬Έμλ₯Ό 보면μ λ€λ₯Έ λΆλ€μ΄ νμ λ§μμ΄ μλΏμμ΅λλ€. μ§λλ² μ½νλ¦°μ μμ±μ, μμ κ΄λ ¨ν΄μ μλ°μ λ¬Έλ²κ³Όλ κ½€ λ¬λΌμ μ½κ° κ³ μμ νμλλ°μ(?) λ§μ½ κ·Έλ ꡬκΈλ§μ΄ μλ 곡μλ¬Έμλ₯Ό λ°λ‘ νμΈνλλΌλ©΄, ν¨μ¬ λ λΉ λ₯΄κ² λ¬Έμ λ₯Ό ν΄κ²°ν μ μμμ κ² κ°μ΅λλ€.
μμ§ μ½νλ¦°μ΄ μ΅μνμ§ μκΈ°λλ¬Έμ μ½νλ¦°μ μ½νλ¦°λ΅κ² μ¬μ©νμ§ λͺ»νκ³ μλλ°μ, μ무λλ μ μ μ¬μ©νκ³ λ§μ μ½λλ₯Ό μ νλ€λ³΄λ©΄ μ½νλ¦°μ μ½νλ¦°λ΅κ² μ¬μ©νλ λ μ΄ μ€μ§μμκΉ ν©λλ€.. π
β» μλ μμμ μ½νλ¦°μ λν΄ μ¬λ¬ νλ€μ μ μν΄μ£ΌμκΈ° λλ¬Έμ νΉμ μκ°μ΄ λμ λ€λ©΄ κ°λ ₯μΆμ² λ립λλ€ :)
https://www.youtube.com/watch?v=ewBri47JWII
'Kotlin' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Kotlin - Scope functions (let, with, run, apply, also) (0) | 2024.12.15 |
---|---|
[Kotlin] Slack APIλ‘ μ¬λ μ±λμ Message λ°μ‘νκΈ° (3) | 2022.03.27 |
λκΈ