코틀린+안드로이드

11. class

으누아빠 2020. 7. 17. 16:45
반응형

class

  • 출처 https://www.youtube.com/watch?v=IDVnZPjRCYg&t=8s [Code with Joyce]
  • 클래스는 class 키워드를 붙여 선언 class Invoice { /.../ }
  • 클래스의 이름은 첫글자를 대문자로 함
  • 클래스에 본문이 없으면 중괄호를 생략 가능
  • 코틀란의 class를 객체화를 할때 new 연산자를 사용하지 않음
  • 기본적으로 public
class Human  {
      var name = "joyce"
      fun eatingCake(){
          println("this is so YUMMMYY~~~")
      }
}

fun main(){  
    var human = Human()  
    human.eatingCake() //결과값 this is so YUMMMYY~~~  
    println("this human's name is ${human.name}") // 결과값 this human's name is joyce  
}
  • 생성자는 주생성자 와 부생성자로 구성
  • 주생성자는 클래스 헤더의 일부이며 클레스 이름 뒤에 옴
  • class Person constructor(firstName: String) { /.../ }
  • 기본 생성자에 주석 또는 가시성 수정자(private,protected,public)가 없으면 생성자 키워드는 생략 가능
  • 생성자에는 default 값을 지정할 수 있다.
class Human constructor(name: String){
    var name = name
    fun eatingCake(){
        println("this is so YUMMMYY~~~")
    }
}

class Human(val name: String = "Anonymous"){  
    fun eatingCake(){  
        println("this is so YUMMMYY~~~")  
    }  
}

fun main(){  
    var human = Human("minsu")  
    human.eatingCake() //결과값 this is so YUMMMYY~~~  
    println("this human's name is ${human.name}") // 결과값 this human's name is minsu

    var human =  Human()
    human.eatingCake() //결과값 this is so YUMMMYY~~~
    println("this human's name is ${human.name}") // 결과값 this human's name is Anonymou
}
  • init{} 키워드는 초기화 블록
  • 주생성자 호출 직후 실행되며 부생성자 보다 먼저 실행된다.
class Human(val name: String = "Anonymous"){
    init {
        println("New human has been born!!") // 첫번째로 실행
    }
    fun eatingCake(){
        println("this is so YUMMMYY~~~") //두번째로 실행
    }
}

fun main(){  
    var human = Human()  
    human.eatingCake()  
    println("this human's name is ${human.name}") //세번째로 실행  
}

//결과값  
// New human has been born!!  
// this is so YUMMMYY~~~  
// this human's name is Anonymous
  • 부생성자

  • 클래스의 본문안에서 정의된 생성자

  • constructor()를 이용

  • class Person { constructor(firstName: String){/.../} }

  • 주생성자가 있는상태에서 부 생성자는 자신이 필요한 인수의 정보를 주 생성자에게서 가져와야 하며, 가져오는 방법은 this 키워드를 사용(왜 어려운 말로 위임한다고 할까..)

class Person(val name: String) {
    var children: MutableList<Person> = mutableListOf<>()
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

class Human(val name: String = "Anonymous"){  
    init {  
        println("New human has been born!!")  
    }

    constructor(name: String, age :Int) :this(name) {
        println("my name is ${name}, ${age} years old")
    }
    fun eatingCake(){
        println("this is so YUMMMYY~~~")
    }
}

fun main(){  
    var human = Human("minsu", 52)  
    println("this human's name is ${human.name}")  
}

// 결과값  
// New human has been born!!  
// my name is minsu, 52 years old  
// this human's name is minsu
  • 상속

  • 클래스는 기본적으로 static 이기 때문에 상속이 불가능

  • 그 이유로 open 키워드를 이용하여 부모 클래스를 명시적으로 선언

  • 자바

class ParentClass{/*...*/}
class ChildClass extends ParentClass {}
  • 코틀린
open class ParentClass{/*...*/}
class ChildClass : ParentClass {}
  • open 키워드를 사용하지 않으면 This type is final, so it cannot be inherited from 에러 발생

open class Human2(val name: String = "Anonymous"){
    init {
        println("New human has been born!!")
    }

    constructor(name: String, age :Int) :this(name) {
        println("my name is ${name}, ${age} years old")
    }

    fun eatingCake(){
        println("this is so YUMMMYY~~~")
    }

    fun singASong() {
        println("lalala")
    }
}

class Korean : Human2(){

}

fun main(){
    val korean : Korean = Korean()
    korean.singASong()
}

//결과값
//New human has been born!!
//lalala
  • override

  • 상속받은 클래스 의 메서드를 override 하기 위해서는 해당 메서드에도 open 키워드를 사용한다.

  • override 키워드 사용

open class Human2(val name: String = "Anonymous"){
    init {
        println("New human has been born!!")
    }

    constructor(name: String, age :Int) :this(name) {
        println("my name is ${name}, ${age} years old")
    }

    fun eatingCake(){
        println("this is so YUMMMYY~~~")
    }

    open fun singASong() {
        println("lalala")
    }
}

class Korean : Human2(){  
    // override 키워드 사용  
    override fun singASong(){  
        super.singASong()  
        println("라라라")  
        println("${name}")  
    }  
}

fun main(){  
    val korean : Korean = Korean()  
    korean.singASong()  
}

// 결과값  
//New human has been born!!  
//lalala  
//라라라  
//Anonymous  

'코틀린+안드로이드' 카테고리의 다른 글

13. companion object  (0) 2020.07.18
12. Lambdas 람다  (0) 2020.07.17
10. for, while  (0) 2020.07.17
9. Nullable / NonNull  (0) 2020.07.17
8. List, ArrayList  (0) 2020.07.16