1. Single-expression function
: ๋๋ค์์ ์ด์ฉํด ๋ฉ์๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฆฌ ๊ฐ๋ฅ
* ๋๋ค์ ๊ตฌ์กฐ : ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ๋๊น / ํจ์์ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ฐํ / ๋ณ์์ ์ ์ฅ ํ๋ ํจ์
{๋งค๊ฐ๋ณ์1, ๋งค๊ฐ๋ณ์2... ->
์ฝ๋
}
* ์์ 1 : ์ธ ๊ฐ์ ์ซ์๋ฅผ ๋ฐ์ ํ๊ท ์ ๋ฐํํ๋ ํจ์(๋ฅผ ๋๋ค์์ผ๋ก ์ ์)
fun add(num1:Int, num2:Int, num3:Int) = (num1+num2+num3)/3
fun main(){
println(lambdaExample({x,y -> x+y}, 20, 30)) //๋๋ค์ ํจ์๋ฅผ ์ธ์๋ก ๋๊น
}
fun lambdaExample(sum: (Int, Int) -> Int, a: Int, b: Int): Int = sum(a, b)
//์์ ๋์ผ
fun lambdaExample(sum: (Int, Int) -> Int, a: Int, b: Int) : Int) : Int {
//์๋ฃํ์ด ๋๋ค์์ผ๋ก ์ ์ธ๋จ
return sum(a,b) //sum์ ๋๋ค์์ ํํ๋ฌธ์ ๋ฐ๋ผ a+b์ ์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํจ
}
* ์์ 2 : ๋์ผํ ๋ก์ง์ ๋ฉ์๋ ์ ์ธ ์์ด ์ ์ฅํ๊ธฐ
var add = {num1: Int, num2: Int, num3: Int -> (num1+num2+num3) / 3}
// -> ๋ฅผ ํตํด = ์์ด ์ฐ์ธก ์ฝ๋๋ฅผ ๊ฐ์ง์ ๋ํ๋. ๋ณ์์ฒ๋ผ!
println("ํ๊ท ๊ฐ์ ${add(10,20,30)}์
๋๋ค")
// ๋ณ์์ ํ ๋นํ๋ ๋๋ค์ ๋ณ์ @@์ถ๊ฐํ๊ธฐ
fun main(){
var result : Int
val example = {x: Int, y: Int -> x * y} //์ผ๋ฐ ๋ณ์์ ๋๋ค์ ํ ๋น
result = example(10,30) //๋๋ค์์ด ํ ๋น๋ ๋ณ์๋ ํจ์์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ
println(result)
}
//300
val example: (Int, Int) -> Int //๋๋ค์์ ์๋ฃํ ์ ์ธ
= {x: Int, y: Int -> x*y}
2. ์ฑ๊ธํด
: ๋ฉ๋ชจ๋ฆฌ ์ ์ญ์์ ์ ์ผํ ๊ฐ์ฒด์์ ๋ณด์ฅ (๋ชจ๋ ๊ฐ์ฒด์ ์ํด ๊ณต์ ๋๋ ํจ๊ณผ...)
- ์ฑ๊ธํด์ผ๋ก ๋ง๋ ์ธ์คํด์ค๋ ๋ฉ๋ชจ๋ฆฌ ์ ์ญ์์ ์ ์ผ & ์์น์ ๋ณด๊ฐ ๊ณ ์ ๋จ. ๋์ผ
- ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ์์ ์ ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋จ
(+) ์ ์ญ์ ์ผ๋ก ํ์ฉ ๊ฐ๋ฅ, ๋ค๋ฅธ ํด๋์ค๋ค์์ ์ฝ๊ฒ ์ ๊ทผ ๊ฐ๋ฅ
(+) ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ์ฉ ๊ฐ๋ฅ
(+) ๊ฐ์ฒด ์ฐจ์์์์ ์ถฉ๋ ๋ฐฉ์ง
//ex. 1๊ฐ์ ํ๋ฆฐํฐ๊ธฐ, ๊ณต๋์ฌ์ฉ
companion, object๋ก ๊ตฌํ
- ์์ฑ์ ์ ์ ์ด๋ ๋จ. ์๋ฐ๋ ๋ค๋ฅด๋ค
?@JvmStatic ๋ญ์ง...281~
class KCustomer{
companion object{
const val LEVEL = "INTERMEDIATE"
@JvmStatic fun login() = println("Login")
}
}
@JvmStatic ์ ๋ ธํ ์ด์ : ์๋ฐ ์์ค์์ ์ฝ๋๋ฅผ ํด์ํ ๋ Companion์ ์๋ตํ ์ ์๊ฒ ํจ
KCustomer.login();
KCustomer.Companion.login(); //์ ๋
ธํ
์ด์
์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ
@JvmField ์ ๋ ธํ ์ด์ : ํ๋กํผํฐ๋ฅผ ์๋ฐ์์ ์ฌ์ฉํ๊ณ ์ ํ ๊ฒฝ์ฐ
//object ํค์๋๋ฅผ ์ฌ์ฉํ ๋ฐฉ์
object OCustomer{
var name = "์ฒ ์ด"
fun greeting() = println("Hello World")
val HOBBY = Hobby("Basketball")
init{
println("Init!")
}
}
//์ปดํจ๋์ธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋ฐฉ์
class CCustomer{
companion object{
const val HELLO = "hello" //์์ ํํ
var name = "๋ฏธ์ "
@JvmField val HOBBY = Hobby("Football")
@JvmStatic fun greeting() = println("Hello World")
}
}
class Hobby(val name: String)
fun main() {
OCustomer.greeting() //๊ฐ์ฒด์ ์ ๊ทผ ์์
OCustomer.name = "๊ธฐ์"
println("name = ${OCustomer.name}")
println(OCustomer.HOBBY.name)
CCustomer.greeting()
println("name = ${CCustomer.name}, HELLO = ${CCustomer.HELLO}")
println(CCustomer.HOBBY.name)
}
- object๋ก ์ ์ธ๋ OCustomer๋ ๋ฉค๋ฒ ํ๋กํผํฐ, ๋ฉ์๋๋ฅผ ๊ฐ์ฒด ์์ฑํ์ง ์๊ณ ๋ . ์ผ๋ก ์ ๊ทผํ ์ ์์
- ๋จ์ผ ์ธ์คํด์ค๋ฅผ ์์ฑํด ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ฑ๊ธํค ํจํด์ ์ฌ์ฉ๋จ
- object ์ ์ธ ๋ฐฉ์ ์ฌ์ฉ ์ ์ ๊ทผ ์์ ์ ๊ฐ์ฒด ์์ฑ๋จ -> ์์ฑ์ ํธ์ถ์ ํ์ง ์์ = object ์ ์ธ ์ ์ฃผ/๋ถ ์์ฑ์ ์ฌ์ฉ ๋ถ๊ฐ
- ์์ ๊ฐ๋ฅ
2024.03.15 - [์ธ์ด/Kotlin] - [Kotlin ๊ณต๋ถ] object์ ์ฑ๊ธํค, object์ compaion
[Kotlin ๊ณต๋ถ] object์ ์ฑ๊ธํค, object์ compaion
dd
sugapowderjj.tistory.com
๊ฐ์ฒด ์์ฑํ์ง ์๊ณ ๋ ํด๋์ค ์ ๋ณด์ ์ ๊ทผ ๊ฐ๋ฅ
1) ์์ฑ์ ํธ์ถํ์ง ์๋ ๊ฒฝ์ฐ
fun main() {
Bird.fly("์ฐธ์") //๊ฐ์ฒด ์์ฑ ์์ด ํด๋์ค ์ด๋ฆ.๋ฉ์๋( )
}
object Bird {
fun fly(name:String) {
println("${name}๊ฐ ๋ ์์~")
}
}
class Person{
var id: Int=0
var name: String = "์ฒ ์ด"
companion object{
var language : String = "Korean"
fun work(){
println("working")
}
}
}
fun main(){
println(Person.language) //์ธ์คํด์ค ์์ฑํ์ง ์๊ณ ๋ ์ฌ์ฉ ๊ฐ๋ฅ
Person.language = "Engligh" //๊ธฐ๋ณธ๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ
println(Person.language) //๋ณ๊ฒฝ๋ ๋ด์ฉ์ ์ถ๋ ฅํจ
Person.work() //๋ฉ์๋ ์คํ
//println(Person.name) //name์ ์ปดํจ๋์ธ ๊ฐ์ฒด๊ฐ ์๋๋๊น ์๋จ
}
2) ์์ฑ์๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ
fun main() {
// trash์ ๊ฐ์ด ์์ฑ์์ ๋งค๊ฐ๋ณ์ ์ ๋ฌ ๊ฐ๋ฅ
var singletonObject1 = MySingletonClass.getInstance(trash = 1)
singletonObject1.setNum(5)
println("num๊ฐ์: ${singletonObject1.getNum()}")
// singletonObject2์์ num์ 10์ผ๋ก ๋์
var singletonObject2 = MySingletonClass.getInstance(trash = 1)
singletonObject2.setNum(10)
// singletonObject1์ num์ด 10์ผ๋ก ์ถ๋ ฅ๋จ
// singletonObject1๊ณผ singletonObject2๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ
println("num๊ฐ์: ${singletonObject1.getNum()}")
}
class MySingletonClass private constructor() {
private var num:Int = 0
companion object {
@Volatile private var instance: MySingletonClass? = null
private var trash = 0
fun getInstance(trash: Int): MySingletonClass {
this.trash = trash
// ์ธ๋ถ์์ ์์ฒญ์์๋ instance๊ฐ null์ธ์ง ๊ฒ์ฆ
if(instance == null) {
// synchronized๋ก ์ธ๋ถ ์ฐ๋ ๋์ ์ ๊ทผ์ ๋ง์
// ์ฐ๋ ๋๋ ๋ค์์ฑํฐ์์ ์๊ฐํฉ๋๋ค!
// ์ฐ๋ ๋๊ฐ์ ๊ฐ์ฒด์ํ ํผ๋์ ๋ง๊ธฐ์ํด ์ฌ์ฉํ๋ค๊ณ ์ดํดํด์ฃผ์ธ์
synchronized(this) {
instance = MySingletonClass()
}
}
return instance!!
// ์๋น์ค์ฐ์ฐ์์ ๋ท์ฅ์์๋ฐฐ์ธ scope function์ ์ด์ฉํ๋ฉด
// ์๋์๊ฐ์ด ๋์ฑ ์ง๊ด์ ์ธ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค
// return instance ?: synchronized(this) {
// // also๋ ํธ์ถํ ๊ฐ์ฒด๋ฅผ it์ผ๋ก ๋๊น
// // instance๊ฐ null์ด๋ผ๋ฉด ์๋ก ์์ฑํ๊ณ ์๋๋ฉด ๋ฌด์ํจ
// instance ?: MySigletonClass().also {
// instance = it
// }
// }
}
}
fun setNum(num: Int) {
this.num = num
}
fun getNum(): Int{
return this.num
}
}