kotlin

kotlin OOB basic

slow333 2023. 2. 6. 22:24

객체 지향 개념은 java와 동일함(interface 포함)

기본 생성자를 argument 구역에서 지정

class Person(firstName: String, lastName: String){ // 기본 생성자 구간
    // Person { this.firstName = firstName; ...}
    init {
        println("초기화 구간")
    }
}

객체 생성은 new 없이 변수를 지정하여 대입 시킴

fun main(){
    val me = Person("kwan", "kim")
}

값을 지정하면 매개변수 없는 초기화 시 초기값으로 사용

=> 변수로 지정 하지 않으면 객체 생성 후 불러 올수 없음

class PersonInit(firstName: String = "John", lastName: String = "Doe"){
    init {
        println("무명씨를 초기화 함")
        println("first name = $firstName , lastName = $lastName")
    }
}

class PersonInitWithVal(val firstName: String = "John", val lastName: String = "Doe"){
    init {
        println("무명씨를 초기화 함")
        println("first name = $firstName , lastName = $lastName")
    }
}
fun main(){
    val noName = PersonInit(firstName = "KIM")
    println(noName) //맴버 변수를 불러 올수 없음
    val noNameWithVal = PersonInitWithVal()
    println(noNameWithVal.firstName +", "+ noNameWithVal.lastName)
}

constructor를 통한 초기화

primary 생성자 외의 member 변수를 지정하고 초기화 가는 방법

class Person(firstName: String = "YONG", lastName: String = "KIM"){ // primary constructor
    // Member variables - Properties
    var age: Int? = null;
    var hobby: String = "watch show"
    var firstName: String? = null // 기본 초기화에 대한 변수 지정 방법
    // 이렇게 해야 내부, 외부에서 변수로 지정해서 사용 가능

    // Initializer Block
    init {
        this.firstName = firstName // 기본 초기화에 대한 변수 지정 방법
        println("초기화 구간")
    }

    // member 변수에 대한 초기화
    constructor(firstName: String, lastName: String, age: Int)
            : this(firstName, lastName) { // 기존 초기 값에 대한 초기화 필요
                this.age = age
            }

    // Member functions - Methods
    fun myHobby(){
        println("$firstName\'s hobby is $hobby and my age is $age")
    }
}

getter, setter 

기본 적으로 자동 생성됨

사용자 정의 getter, setter 생성 가능

접근자를 통해 접근 제한

fun main(){
    val myCar = Car()
    println( myCar.owner + "\'s is " + myCar.myBrand)
    myCar.owner = "Not My car"
    myCar.myBrand = "Benz"
    myCar.maxSpeed = 200
    println( myCar.maxSpeed)
    println("My car Model is ${myCar.myModel}")
}
// 생성자를 argument 에서 지정 가능
class Car(){

    lateinit var owner : String // 나중에 반드시 초기화 해주어야 함
    var maxSpeed : Int = 140
    get() = field
    set(value) {
        field = if(value > 0) value else throw java.lang.IllegalArgumentException("It should move!!")
    }
    var myBrand : String = "BMW"
//        get() = field    // 자동 생성 => 필요 없음
//        set(value){
//            field = value
//        } // end of getter, setter

    // custom getter
    get(){
        return field.lowercase()
    }

    var myModel : String = "Mi589"
    private set(value){
        field = value
    }

    init {
        this.owner = "MY Car"
    }
}