[Kotlin]class

한상욱·2023년 10월 26일

Kotlin문법

목록 보기
12/16
post-thumbnail

들어가며

이글은 Kotlin 문법 정리글입니다.

class

이번에는 class를 알아보겠습니다. kotlin에서는 아래처럼 class를 생성할 수 있어요.

fun main() {
    var sangwook = Human("한상욱", 25)
    println(sangwook.name)
    println(sangwook.age)
}

class Human(
    var name : String,
    var age : Int,
)

>> 한상욱
>> 25

위에서는 Human이라는 class에서 동작코드가 없기 때문에 {}를 생략할 수 있어요. Human class 안에서 프로퍼티들을 var 타입으로 지정한게 보이시죠? 이러한 경우에 외부에서 직접 값을 변경시킬 수 있습니다.

fun main() {
    var sangwook = Human("한상욱", 25)
    println(sangwook.name)
    println(sangwook.age)
    sangwook.age = 20
    println(sangwook.age)
}

class Human(
    var name : String,
    var age : Int,
)

>> 한상욱
>> 25
>> 20

반대로 val타입은 상수죠? 이러한 경우에는 외부에서 값을 직접 지정할 수 없게 됩니다.

그런데, 입력받은값을 제외하고 별도의 프로퍼티를 지정하고 싶다면 스코프를 열어서 지정이 가능합니다.

fun main() {
    var human = Human("한상욱", 25)
    println(human.name)
    println(human.age)
    println(human.job)
}

data class Human(
    var name : String,
    var age : Int,
) {
    var job = "없음"
}

>> 한상욱
>> 25
>> 없음

이 안에서 정의한 프로퍼티는 당연히 외부에서도 접근가능합니다. 변경도 가능하죠. 출력된 것으로 알 수 있겠죠? 그런데, 외부에서 변경을 원치 않고 내부에서 정의한 메소드로 변경하고 싶다면 private set을 사용할 수 있습니다.

fun main() {
    var human = Human("한상욱", 25)
    println(human.name)
    println(human.age)
    human.job = "대학생" // 에러
}

data class Human(
    var name : String,
    var age : Int,
) {
    var job = "없음"
        private set
}

이렇게 지정된 프로퍼티들은 외부에서 재정의할 수 없고, 내부에서 지정한 메소드를 이용해야 재정의할 수 있습니다.

Init

class를 생성한 후, 프로퍼티 전달외에 또다른 기능을 수행하고 싶다면, init을 이용해서 생성자의 기능을 추가할 수 있습니다.

fun main() {
    var human = Human("한상욱", 25)
}

data class Human(
    var name : String,
    var age : Int,
) {
    var job = "없음"
        private set

    init {
        println("$name 생성")
    }
}

>> 한상욱 생성

private 표기

클래스 내부에서 외부에 드러내면 안되는 부분들은 보통 private처리를 하게 되죠? kotlin에서는 그러한 타입의 프로퍼티들은 모두 private이라는 키워드를 붙여주게 됩니다.

fun main() {
    var sangwook = Human("한상욱", 25)
    println(sangwook.name) // 에러발생
    println(sangwook.age) // 에러발생
}

class Human(
    private var name : String,
    private var age : Int,
)

data class

원래 동일한 class에 동일한 프로퍼티로 생성한 객체들은 모두 저장된 메모리공간이 다르기 때문에 같지 않습니다.

fun main() {
    var human1 = Human("한상욱", 25)
    var human2 = Human("한상욱", 25)
    println(human1 == human2)
}

class Human(
    private var name : String,
    private var age : Int,
)

>> false

근데, Dart에서도 Equatable라이브러리를 사용해서 객체의 값을 비교해주는데요. 뭐 잘 모르시는분들을 위해서 간단하게 설명을 드리자면, 저 class 내부에서 get 함수와 hashCode함수를 재정의하면 값이 같으면 true가 나올 수 있도록 정의할 수 있는데요. 그렇게 하면 너무 코드가 길어지죠. 그래서 Equatable은 Dart에서 클래스에 상속시켜주면 그러한 객체 비교가 가능하도록 해주는 라이브러리입니다. 그거를 kotlin에서는 data class라는걸 이용해서 할 수 있습니다.

fun main() {
    var human1 = Human("한상욱", 25)
    var human2 = Human("한상욱", 25)
    println(human1 == human2)
}

data class Human(
    private var name : String,
    private var age : Int,
)

>> true
profile
자기주도적, 지속 성장하는 모바일앱 개발자의 기록

0개의 댓글