이글은 Kotlin 문법 정리글입니다.
이번에는 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
}
이렇게 지정된 프로퍼티들은 외부에서 재정의할 수 없고, 내부에서 지정한 메소드를 이용해야 재정의할 수 있습니다.
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처리를 하게 되죠? kotlin에서는 그러한 타입의 프로퍼티들은 모두 private이라는 키워드를 붙여주게 됩니다.
fun main() {
var sangwook = Human("한상욱", 25)
println(sangwook.name) // 에러발생
println(sangwook.age) // 에러발생
}
class Human(
private var name : String,
private var age : Int,
)
원래 동일한 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