λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Kotlin

Kotlin_Map / Class

by λ„μΊλ¦¬πŸ± 2021. 7. 1.
λ°˜μ‘ν˜•

Map

/**
 *
 * 반볡문 https://androidtest.tistory.com/98
 *
 * Map - 킀와 쌍으둜 데이터가 μ €μž₯되며, μ •μˆ˜λ₯Ό μ‚¬μš©ν•œ 인덱슀 기반 처리 λŒ€μ‹  ν‚€λ₯Ό 기반으둜 데이터λ₯Ό μ²˜λ¦¬ν•œλ‹€.
 * MutableMapOr , mapOf ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ 생성됨.
 * 킀와 벨λ₯˜λ₯Ό μ •μ˜ν•˜κΈ° μœ„ν•΄ toλ₯Ό μ‚¬μš©ν•˜κ³  있음.
 * toλŠ” ν‚€μ›Œλ“œ 처럼 λ³΄μ΄λŠ”λ° λ‚΄λΆ€μ μœΌλ‘œλŠ” μ»΄νŒŒμΌλŸ¬κ°€ "carrie".to(100) μ΄λ ‡κ²Œ λ³€ν™˜ν•œλ‹€. - μ• μ΄ˆμ— μž‘μ„±μ‹œμ— μ΄λ ‡κ²Œ 해도 됨.
 * Pair νƒ€μž…μ„ μ‚¬μš©ν•  μˆ˜λ„ 있음
 *
 * λ˜‘κ°™μ€ key의 값을 μΆ”κ°€ν•˜λ €κ³  ν•˜λ©΄ (μΆ”κ°€λŠ” +=) ν•΄λ‹Ή ν‚€μ˜ 벨λ₯˜λ§Œ 바뀐닀.
 *
 * ν‚€ κ°’μœΌλ‘œ κ°’ κ°€μ Έμ˜¬ 수 μžˆλ‹€.
 *
 * Mapμ—μ„œ 값을 κ°€μ Έμ˜€λŠ” ν•¨μˆ˜
 * [] 인덱슀 μ—°μ‚°μž / getValue / getOrElse / getOrDefault
 *
 *
 * λ³€κ²½ κ°€λŠ₯ν•œ Map 의 λ³€κ²½μž ν•¨μˆ˜
 * [] 인덱슀 μ—°μ‚°μž / += / put / putAll / getOrPut / remove / - / -= / clear
 * */

fun main() {

    // 읽기 μ „μš© map μƒμ„±ν•˜κΈ°
    val customerGold = mapOf("carrie" to 99.999, "elli" to 99.877, "gom" to 99.888)
    val customerGold_1 = mapOf("carrie".to(100), "elli".to(99), "gom".to(100))
    val customerGold_2 = mapOf(Pair("carrie", 100), Pair("elli", 99), Pair("gom",100))

    println(customerGold)
    println(customerGold_1)
    println(customerGold_2)

    // κ°’ κ°€μ Έμ˜€κΈ°
    println(customerGold["carrie"])


    customerGold.forEach{ patron, balance ->
        println("${patron}, balance: ${"%.2f".format(balance)}")
    }
}


 

 

Class

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/trim-indent.html

https://kotlinlang.org/docs/properties.html#getters-and-setters

public/ private/ protected / internal

 

 

/**
 * 클래슀 Class
 * 1. μ½”ν‹€λ¦°μ—μ„œλŠ” ν•˜λ‚˜ λ˜λŠ” μ—¬λŸ¬ 개의 클래슀λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.
 *    μ•± 규λͺ¨ 컀짐에 λ”°λ₯Έ μœ μ§€ 보수 μš©μ΄μ„±μ„ κ³ λ €ν•˜μ—¬ 가급적이면 ν•œ ν΄λž˜μŠ€μ— ν•˜λ‚˜λ₯Ό λ§Œλ“œλŠ” 게 μ’‹λ‹€.
 *    {} μ‚¬μš©ν•˜μ—¬ 클래슀 λͺΈμ²΄λ₯Ό μ •μ˜ν•œλ‹€.
 *
 * companion Objectλ₯Ό μ‚¬μš©ν•˜λ©΄ μ΄ˆκΈ°ν™” 없이 클래슀λ₯Ό μ‚¬μš©ν•  수 있음 - μœ μΌν•œ λ°©λ²•μž„!
 * 즉, 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μœΌλ‘œλŠ”
 * 1. μ΄ˆκΈ°ν™”
 * 2. companion object둜 λ§Œλ“€κΈ°
 *
 * 상속을 μ‚¬μš©ν•˜λŠ” 이유 : κΈ°μ‘΄ μ½”λ“œ μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•¨. → μ½”λ“œλ₯Ό μž¬ν™œμš©ν•˜λŠ”λ°, μ²΄κ³„μ μœΌλ‘œ 계측ꡬ쑰화 ν•΄μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ
 *
 * μ˜€λ²„λΌμ΄λ“œ Parent: open Child: override
 * -  λ™μΌν•œ ν”„λ‘œνΌν‹°λ‚˜ λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ ν•  λ•Œ ν•„μš”ν•œ ν‚€μ›Œλ“œ
 *
 * MainActivityλ₯Ό 보면 AppCompatActivity λ₯Ό 상속 λ°›λŠ”λ°, 이λ₯Ό 톡해 start~ μ΄λŸ¬ν•œ ν•¨μˆ˜λ“€μ„ μ‚¬μš©ν•  수 μžˆλ‹€.
 *
 *
 * μ˜€λ²„λ‘œλ“œ - μƒμ†κ΄€κ³„λž‘μ€ 상관 μ—†μŒ.
 μ„œ */

// λ³€μˆ˜μ™€ ν•¨μˆ˜μ˜ λͺ¨μŒ
class 클래슀λͺ…
{
    // μ΄ˆκΈ°ν™”
    init {
        // 클래슀λ₯Ό μ΄ˆκΈ°ν™” ν•˜λ©΄ ν˜ΈμΆœλœλ‹€.
        // 클래슀 μ΄ˆκΈ°ν™” == λ©”λͺ¨λ¦¬μ— λ‘œλ“œ ν•œλ‹€.
        // 이 클래슀 μΈμŠ€ν„΄μŠ€κ°€ λœλ‹€.
    }
    var variagle:String ="" // λ³€μˆ˜ - ν”„λ‘œνΌν‹°
    // 클래슀 scope

    fun function()  // ν•¨μˆ˜ - λ©”μ†Œλ“œ
    {
        var variable_local = ""
    }

}

//class Log{
//    fun d(param1:String, param2:String){
//        println("[$param1] : $param2")
//    }
//}

class Log{

    companion object{
        fun d(param1:String, param2:String){
            println("[$param1] : $param2")
        }
    }

}


class Happiness{

    companion object{
        var H = "happiness"
        fun laugh(){
            print("haha!")
        }
    }

}

// λ‚˜λŠ” 상속을 ν•  수 μžˆλ‹€ λΌλŠ” 의미둜 μ•žμ— open ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ•Ό ν•œλ‹€.
open class Parent{
    var money = 10000

    // μžμ‹ν•œν…Œ μ˜€λ²„λΌμ΄λ“œκ°€ 되렀면 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œ μ•žμ—μ„œ open 이 λΆ™μ–΄μ•Ό λœλ‹€.
    open var house = "μ²­μ£Ό 100평 μ•„νŒŒνŠΈ"
    open fun showHouse()
    {
        Log.d("Parent","house ${house}")
    }

}

// 상속 λ°›κΈ° - 상속 받은 값을 μ‚¬μš©ν•˜λ €λ©΄ μ΄ˆκΈ°ν™” ν•΄μ•Ό ν•œλ‹€.
class Child : Parent(){

    override var house = "μ²­μ£Ό 10평 μ˜€ν”ΌμŠ€ν…”"
    fun showMoney(){
        // μƒμ†λ°›μœΌλ©΄ κ·ΈλŒ€λ‘œ Parent 클래슀의 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό λ‚΄κ²ƒμ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλ‹€.
        Log.d("Child","money ${money}")
    }

    override fun showHouse()
    {
        Log.d("Child","house ${house}")
    }

}

// μ˜€λ²„λ‘œλ“œ
class Son{

    fun getNumber():Int {
        return 1
    }

    fun getNumber(param: String) : Int {
        return 2
    }
}


fun main() {
    val name = "carrie"
    val healthPoints = 100
    val isBlessed = true
    val isImmortal = false

    val player = Player()

    // 클래슀의 μ‚¬μš© - init ν•¨μˆ˜ 호좜
    var cls = 클래슀λͺ…()
    cls.variagle
    cls.function()

    // companion Object 아닐 λ•Œ
    // var log = Log()
    // log.d("carrie","log")

    Happiness.laugh()

    // child μ΄ˆκΈ°ν™”
    var child = Child()
    child.showMoney()

    //override  μ‚¬μš©
    var parent = Parent()
    var over_child = Child()

    parent.showHouse()
    over_child.showHouse()


}

 

var / val  - setter의 유무

/**
 * μ†μ„±μ˜ κ²Œν„°μ™€ μ„Έν„°.
 * : μš°λ¦¬κ°€ μ •μ˜ν•œ 각 속성에 λŒ€ν•΄ ν•„λ“œμ™€ κ²Œν„°κ°€ μžλ™ μƒμ„±λ˜λ©°, κ²½μš°μ— 따라 세터도 μžλ™ μƒμ„±λœλ‹€.
 * ν•„λ“œ - μ†μ„±μ˜ 데이터가 μ €μž₯λ˜λŠ” κ³³.
 *
 * κ²Œν„°μ™€ μ„Έν„° μ˜€λ²„λΌμ΄λ”©
 * λ‹€ν΄νŠΈλ‘œ μžˆλŠ”λ° getter, setterλ₯Ό μ»€μŠ€ν…€ ν•  수 μžˆλ‹€.
 * λ””ν΄νŠΈ : μ½”ν‹€λ¦°μ—μ„œλŠ” ν•„λ“œλͺ… μžμ²΄κ°€ κ²Œν„° μ„Έν„° 역할을 함
 * μ»€μŠ€ν…€ : ν•„λ“œ field
 *
 *
 * constructor, init λ‘˜ λ‹€ μ΄ˆκΈ°ν™” 인데, 싀행은 init → constructor μˆœμ„œλ‘œ λœλ‹€.
 *
 * trimIndent{}
 *
 *
 * κΈ°λ³Έ default μ£Όμš” μƒμ„±μž
 * class Student
 * class Student{}
 * class Student() {}
 *
 *
 *
 *
 * * */

fun main() {
    val carrie = Student("carrie", 24)
    val elli = Student(null, 24, 2.0f)
    val john = Student("john", 20,1.0f)

    // carrie.realScore = 3.3f

    carrie.showStatus()
    elli.showStatus()
    john.showStatus()


}


// μ£Όμš”μƒμ„±μž 인자λ₯Ό μ΄μš©ν•΄μ„œ ν•„λ“œ μ΄ˆκΈ°ν™”
//class Student(name: String?, age:Int, score:Float = 1.0f)
//{
//    val realName: String = name ?:"guest"
//    val email: String = "${realName}@school.org"
//    val joinedAge: Int = age
//    var realScore: Float = score
//
//    fun showStatus()
//    {
//        val status = """
//            ===   학생 μž¬ν•™ 증λͺ… ===
//            이름: ${realName}
//            λ‚˜μ΄: ${joinedAge}
//            학점: ${realScore}
//            이메일: ${email}
//            ======================
//        """.trimIndent()
//
//        println(status)
//    }
//
//}


//  인자인 λ™μ‹œμ— ν•„λ“œν™”
class Student(val name: String?,val age:Int, var score:Float = 1.0f)
{
    val email: String = "${name}@school.org"

    // var 에 μ»€μŠ€ν…€ getter, setter
    var description: String? = null
        get() = field ?: "null μ΄κ΅¬λ‚˜"
        set(value){
            if(!value.isNullOrEmpty())
                field = value
        }

    fun showStatus()
    {
        val status = """
            ===   학생 μž¬ν•™ 증λͺ… ===
            이름: ${name}
            λ‚˜μ΄: ${age}
            학점: ${this.score}
            이메일: ${email}
            μ„€λͺ…: ${description}
            ====================== 
        """.trimIndent()

        println(status)
    }

}

 

 

late lazy

 

https://www.youtube.com/watch?v=I-TksKaou1Q

 

 

μ»΄νŒŒμΌλŸ¬λŠ” μ΄ˆκΈ°ν™” λΈ”λ‘μ—μ„œ 속성을 μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜μ™€ λΉ„κ΅ν•˜λ©΄μ„œκΉŒμ§€ μ†μ„±μ˜ μ΄ˆκΈ°ν™” μˆœμ„œλ₯Ό κ²€μ‚¬ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€. λ”°λΌμ„œ μ†μ„œμ„ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” μ΄ˆκΈ°ν™” 블둝을 μ •μ˜ν•  λ•ŒλŠ” ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 그런 μ†μ„œμ΄ μ΄ˆκΈ°ν™”λ˜λ„λ‘ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Όν•œλ‹€.

import java.io.BufferedReader
import java.io.IOException
import java.io.InputStreamReader

/**
 * lateinit : λŠ¦μ€ μ΄ˆκΈ°ν™”
 * by lazy : 게으λ₯Έ μ΄ˆκΈ°ν™”(프라퍼티 μœ„μž„ μ΄ˆκΈ°ν™”)
 * Val 같은 κ²½μš°λŠ” 단 ν•œλ²ˆμ˜ μ΄ˆκΈ°ν™”λ§Œ ν•˜λ‹ˆκΉŒ,
 *
 * lateinit
 * >> μ§€κΈˆ λ‹Ήμž₯ null 둜 두고 싢지 μ•Šμ€λ°, λ””ν΄νŠΈλ‘œ λ‹€λ₯Έ κΈ°λ³Έ 적인 것을 ν•˜κΈ°μ—λŠ” 쑰금 κΉŒλ‹€λ‘­λ‹€. κ·Έλž˜μ„œ λ“±μž₯ν•œ 것이 λ°”λ‘œ lateinit!!
 * >> μ˜λ„μ μœΌλ‘œ λ³€μˆ˜ ν”„λ‘œνΌν‹°μ˜ μ΄ˆκΈ°ν™”λ₯Ό μ§€μ—°μ‹œν‚€λŠ” 것
 *
 * init block :
 * μ£Όμš” μƒμ„±μžμ˜ value - parameterλ‚˜ ν”„λŸ¬νΌν‹° νŒŒλΌλ―Έν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ μ΄ˆκΈ°ν™” / init { μ΄ˆκΈ°ν™” μ½”λ“œ }
 *
 * secondary constructors :
 * 2μ°¨ μƒμ„±μžλ₯Ό ν•œ 개 이상 더 μ •μ˜ν•  수 있음 / μ£Όμš” μƒμ„±μž, λ‹€λ₯Έ 2μ°¨ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ΄ˆκΈ°ν™”λ₯Ό μœ„μž„ν•  수 있음
 *
 *
 * */


enum class Monster {
    WaterMon, FireMon, EarthMon, WindMon
}

enum class Clan{
    DarkSide, LightSide
}

class Player(){

    // lateinit - μ§€κΈˆ μš°λ¦¬κ°€ null이든 κΈ°λ³Έ 값이든 아무 것도 μ΄ˆκΈ°ν™” μ•ˆν•΄λ„ error 내지 μ•Šκ² λ‹€! λ‚˜μ€‘μ— μ •λ§λ‘œ κ°’ λΆ€μ—¬ 될텐데 κ·Έλ•ŒλΆ€ν„° μ“°κ² λ‹€.
    lateinit var nick: String // = ""

//    init {
//
//    }
    lateinit var leadMonster:Monster // = Monster.EarthMon

    // μ§„μ˜
    // μ΄ˆκΈ°ν™”λ₯Ό 단 ν•œλ²ˆ ν•„μš”λ‘œ ν•˜λŠ” μ‹œμ μ— κ·Έλ•Œ λ”± ν•˜κ² λ‹€. by lazy!
    val clan:Clan by lazy{
        // Clan을 κ²°μ • μ΄ˆκΈ°ν™” μ½”λ“œ 블둝.
        this.selectClan()
    } // = null // Clan.DarkSide

    // μ§„μ˜ κ³ λ₯΄λŠ” ν•¨μˆ˜
    private fun selectClan(): Clan {

        var mySide: Clan = Clan.DarkSide

        try {
            // Clan 이라고 ν•˜λŠ” μ—΄κ±°ν˜• ν΄λž˜μŠ€μ—λŠ”, static에 λ²„κΈˆκ°€λŠ” ν•¨μˆ˜λ“€μ„ 가지고 있음.
            Clan.values().forEach {
                print("${it.ordinal}: ${it.name} μ§„μ˜ \t")
            }

            print("Player μ§„μ˜μ„ 선택 : ")

            // κ°œν–‰ 문자λ₯Ό 버퍼에 λ„£μ–΄ λ‘μ—ˆλ‹€κ°€, ν•˜λ‚˜μ˜ λ¬Έμžμ—΄λ‘œ ν•˜λ‚˜μ˜ 행을 λ˜μ Έμ£ΌλŠ” ν•¨μˆ˜
            val br: BufferedReader = BufferedReader(
                InputStreamReader(System.`in`)
            )

            val sel = br.readLine()
            if (sel == "1") mySide = Clan.LightSide
        }catch (e: IOException){
            e.printStackTrace()
        }
        return mySide
    }
}


class Professor(_name: String, _age:Int = 30){

    var name: String? = null
    val age: Int = _age

    init{
        // μ£Όμš”μƒμ„±μžμ˜ μ΄ˆκΈ°ν™” 블둝
        // init 블둝 μ•žμ— μžˆλŠ” ν”„λ‘œνΌν‹° μ‚¬μš© κ°€λŠ₯ init 블둝 뒀에 μžˆμ–΄λ„ 싀행은 λ˜μ§€λ§Œ μ£Όμ˜κ°€ ν•„μš”ν•¨.
        name = if(_name.isNotEmpty() && _name.isNotBlank()) _name.toUpperCase() else "Guest"
        println("$name κ΅μˆ˜λ‹˜ ($age) μΈμŠ€ν„΄μŠ€")
    }

    var major: String = "인문학"

    // κ΄„ν˜Έ μ•ˆμ—λŠ” ν”„λ‘œνΌν‹°κ°€ μ•„λ‹Œ 벨λ₯˜ κ°’λ§Œ λ“€μ–΄κ°ˆ 수 있음
    constructor(_name : String, _age: Int, _major: String)
    : this(_name, _age)
    {
        // this.name = _name
        // this.age = _age
        this.major = _major
    }
}





fun main() {
    val p1 = Professor("david", 39) // p.c.
    val p2 = Professor("alice") // p.c.

    val p3 = Professor("park",45,"κ²½μ œν•™") // 2μ°¨ μƒμ„±μž
}

 

 

λ°˜μ‘ν˜•

λŒ“κΈ€