우당탕탕 앱 도전기/kotlin

[kotlin] class 상속,생성자,constructor

그린푸딩 2022. 10. 7. 00:27
728x90
반응형

1강의 마지막 내용!! kotlin의 class에 관한 내용이다. 지금은 처음 배워서 그렇구나 하고 넘어가긴 하는데 나중가면 기존java에서 어떤점을 개선하고자 kotlin에 이런 기능들을 놓게 되었는지 알고 싶다. kotlin 컴파일러 개발자가 썼다는 <kotlin in action> 책을 보면 좀더 알겠지만..  지금 이 강의를 완강하고 보려고했는데 못보고 있다! 1강을 빨리 끝내보자..

 

8. Class

 

마지막 내용은 class에 관한 내용으로 상속,생성자 정의, constructor에 대해서 배운다.

* 오버로드: 생성자 인자다르게 여러개, 오버라이딩: 상속시 매소드 변경

java와 다른 kotlin의 특성

 

  •  파일이름이 꼭 클래스 이름이 아니어도 된다. 여러 클래스 한파일에 가능!
  •  kotlin의 class는 final이기에 상속해서 오버라이딩 하려면 open으로 선언해주어야함
  • 생성자를 class 옆 속성 설정하는것처럼 하면 짧은 코드로 생성자+속성 선언까지 동시에 가능(또한 디폴트 값 지정되면 Human()같이 속성 없는 객체도 선언가능!)
  • 오버로딩을 하려면 주생성자를 위임해야한다. 
  • 객체 선언시 new안해도 됨
  • 그외 코드블록: init{}사용
//자바와 코틀린이 다른점: 꼭 파일이름!= 클래스 이름
//여러 클래스 한 파일에 가능
//자바와 코틀린 생성자 다름 : 초기화 블록 따로 있음 vs
//class Human constructor(val name:String){ // -> property로 있는것과 동일
//자바 클래스 내에 생성자, 오버로딩

//생성자, property 같이 쓰는법(java 몇줄인거 짧게)
//class final


//주생성자1
// -> property로 있는것과 동일 , constructor 생략가능, 주생성자나 init로 하라는 추천 뜸
open class Human (val name:String ="None"){ 
   //디폴트 값 있으면 이거 없는 생성자도 가능

    //오버로딩 하려면? -> 주생성자를 위임받아야함
    constructor(name: String , age : Int) : this(name){ //주생성자 없으면 위임할필요 없음
        println("my name is ${name},${age}years old")
    }

    init{ //코드블록 -> 먼저 실행
       println("Now human came!")

   }
    //여기서 지정
  //  val name : String =  name
   // val name="jamong"

    fun eatingCake(){
        println("Cake!")
    }

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

}
//자바 :extends
//코틀린 class -> final임. 상속하려면 open해줘야함
class Korean: Human(){

    //오버라이딩 못함,-> open해야함

    override fun singASong(){
        super.singASong()
        println("하하하하")
        println("my name is ${name}") //None임
    }

}
fun main(){

//클래스 인스턴스
    //자바에선 new 이지만 바로 할수 있다
    val human= Human("sugar")
    human.eatingCake()
    println("this human's favorite cake is ${human.name}")
    //이름을 객체 생성시 지정해주고 싶다면 - constructer, 생성자 사용
    val stranger=Human() //이거 가능

    val num=Human("kevin",12)
    //println("this human's is ${human.name}")

    val korean= Korean()
    korean.singASong();



}

 

1강끝!!!!!!! 힘들다..

728x90
반응형