1SEP

[Kotlin] DataClass

Android (Kotlin) 2020. 9. 14. 22:29

1. 데이터 클래스 기능

equals() 
hashCode()
toString()
componentN()
copy()

data class Book(
	var name: String, 
    var authorName: String = "dudu", 
    var lastModified: Long = 1234567, 
    var rating: Float = 5f, 
    var downloads: Int = 1000
    )

fun main(args: Array<String>) {
	var book = Book("Android tutorials","Hup..", 1234567, 4.5f, 1000)

    	book = Book("Kotlin")
    	book = Book("Swift",downloads = 500)
    	book = Book("Java","zzz",rating = 5f, downloads = 1000)
    	book = Book("Python","YYY",rating = 5f)
        println(book.toString())
    val newBook = book.copy(name = "iOS dev")
    println("Hashcode is ${newBook.hashCode()}")
    if(!newBook.equals(book))
        println("newBook and book are NOT equal")
        
    println(book.component1()) //Python
    println(book.component2()) //YYY
    println(book.component3()) //1234567
    println(book.component4()) //5f
    println(book.component5()) //1000    
}
// 변수 이름을 사용하면 원하는 값만 선택적으로 입력 가능 하다. 
// toString()함수는 클래스의 값을 출력 한다.
// copy() 는 원하는 값만 변경하여 새로운 val 객채를 만들 수 있다.
// hashCode() 헤시코드를 반환 함.
// equals() " == " 과 같음.
// omponent(n) 생성자에 명시된 순서(n)에 맞는 개체로 접근

2. Destructuring

data class Book(val name: String, val authorName: String = "kaka", val lastModified: Long = 1234567, val rating: Float = 5f, val downloads: Int = 1000)

 val book = Book("Android tutorials","dudu", 1234567, 4.5f, 1000)
 val (n,a,date,rating,downloads) = book
 
 ==> 
 n = "Android tutorials"
 a = "dudu"
 date = 1234566
 rating = 4.5f
 downloads = 1000

equals() 
hashCode()
toString()
componentN()
copy()

설정

트랙백

댓글

1SEP

[Kotlin] 클래스 정리

Android (Kotlin) 2020. 9. 13. 18:50

Class 기본 사용

class User {

    var loggedIn: Boolean = false
    val cantChangeValue = "Hi"
    
    fun logOn() {
        loggedIn = true
    }
    
    fun logOff() {
        loggedIn = false
    }
}

fun main(args: Array<String>) {

    val user = User()
    println(user.loggedIn) //false
    user.logOn()
    println(user.loggedIn) //true
    user.logOff()
    println(user.loggedIn) //false
    user.cantChangeValue = "Hey" //won't compile. Can't modify a final variable.

}

Class 생성자 "init"

1.) =============================

class MultiInit(name: String) {

    init {
        println("First initializer block that prints ${name}")
    }

    init {
        println("Second initializer block that prints ${name.length}")
    }
}

fun main(args: Array<String>) {
    var multiInit = MultiInit("Kotlin")
}

출력>>>>>>>
I/System.out: First initializer block that prints Kotlin
I/System.out: Second initializer block that prints 62.) ========= With "also"===========

class MultiInit(name: String) {
    val firstProperty = "First property: $name".also(::println)

    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(args: Array<String>) {

    var multiInit = MultiInit("Kotlin")
}

출력>>>>>>>
I/System.out: First property: Kotlin
I/System.out: First initializer block that prints Kotlin
I/System.out: Second property: 6
I/System.out: Second initializer block that prints 6

Class 보조 생성자 "constructor"

class Student {
    var name: String
    val age : Int

    constructor(name: String, age: Int)
    {
        this.name = name
        this.age = age
    }

    fun printDetails()
    {
        println("Name is $name and Age is $age")
    }

}

fun main(args: Array<String>) {

    var student = Student("gugu", 17)
    student.printDetails()
}

출력 >>>>>>>>
//Name is gugu and Age is 17

init + constructor

class Student(var name: String, val age: Int) {

    var skill: String

    init {
        skill = "play"
    }

    constructor(name: String, age: Int, skill: String) : this(name, age) {
        this.skill = skill
    }

    fun printDetails() {
        if (skill.equals("play"))
            println("Name is $name and Age is $age")
        else
            println("Name is $name and Age is $age Skill is $skill")
    }
}

I/System.out: Name is no-b-rain and Age is 1
I/System.out: Name is dudu and Age is 20 Skill is dodory

 

생성자의 인수 , 인수의 기본값 설정

1.) 
class User(name: String, val isAdmin: Boolean) {

    var username = name     //username = name
    val _isAdmin = isAdmin  //_isAdmin = isAdmin

    init {
        username= username + "https://no-b-rain.tistory.com/"
        println("Author Name is $name. Is Admin? $_isAdmin")
    }
}

fun main(args: Array<String>) {

    var user = User("no-b-rain",false)
    // Error Code : user.isAdmin = true  //won't compile since isAdmin is val
    // Error Code : user._isAdmin = true //won't compile. Same reason.
    user = User("no-Brain",true)
}



예 2.) 
class User(name: String, var website: String = "no-b-rain") {

    init {
        println("Author $name writes at $website")
    }

    init {
        website = website + ".com"
        println("Author $name writes at $website")
    }
}

fun main(args: Array<String>) {

    var user = User("no-b-rain","dudu")
    user = User("no-Brain","dudu")
}

I/System.out: Author no-b-rain writes at dudu
I/System.out: Author no-b-rain writes at dudu.com
I/System.out: Author no-Brain writes at dudu
I/System.out: Author no-Brain writes at dudu.com


커스텀  setter , getter

class Name{
    var post: String = "default"
    set(value) {if(!post.isNotEmpty()) {
        throw IllegalArgumentException(" Enter a valid name")
    }
                field = value
    }
    get() {
        return field.capitalize()
    }

}

fun main(args: Array<String>) {

    var name = Name()
    name.post = "kotlin classes"
    println(name.post)
    name.post = "kotlin data Classes our next Tutorial"
    println(name.post)

}

abstract

abstract class Person(name: String) {

    init {
        println("Abstract Class. init block. Person name is $name")
    }

    abstract fun displayAge()
}

class Teacher(name: String): Person(name) {

    var age : Int

    init {
        age = 24
    }

    override fun displayAge() {
        println("Non-abstract class displayAge function overridden. Age is $age")
    }
}

fun main(args: Array<String>) {

    val person = Teacher("Anupam")
    person.displayAge()

}

//Following is printed in the console.
//Abstract Class. init block. Person name is Anupam
//Non-abstract class. Age is 24

설정

트랙백

댓글