| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 버전의 중요성
- 접근제한자
- 인텔리제이
- for문
- dbms
- Kapt
- 널 안전성
- MySQL
- 로그캣
- 스프링부트 버전
- downto
- typeAlias
- 안드로이드 스튜디오
- 컴패니언
- 통합개발환경
- do while문
- 스프링부트2.7.9
- when문법
- 엘비스
- Until
- 오버라이드
- 타입별칭
- 오브젝트
- 코틀린
- 람다함수
- while문
- 맥북M1
- 초기화 미루기
- lateinit
- 반복문
- Today
- Total
좌충우돌 코딩
코틀린 - 다양한 클래스 본문
코틀린의 다양한 클래스가 있죠.
그 중 오늘 알아볼 클래스는 데이터 클래스와 오브젝트 클래스, 컴패니언 클래스입니다.
데이터 클래스
데이터 클래스는 data 키워드로 선언하여 VO(value-object)클래스를 편리하게 이용할 수 있게 해줍니다.
data class DataClass(val name: String, val age: Int)
데이터 클래스는 데이터를 다루는데 편리한 기능을 제공하는 것이 주목적이므로 위의 코드처럼 주 생성자에 val, var 키워드로 매개변수를 선언해 클래스의 맴버 변수로 활용을 하는 것이 일반적이죠.
데이터 클래스는 객체의 데이터를 비교도 가능합니다.
data class DataClass(val name: String, val age: Int)
fun main() {
val data1 = DataClass("John", 34)
val data2 = DataClass("John", 34)
val data2 = DataClass("Tom", 34)
println("객체 비교 : ${data1.equals(data2}") // true
println("객체 비교 : ${data1.equals(data3}") // false
}
equals() 함수로 손쉽게 클래스 객체를 비교할 수 있습니다.
data1과 data2의 클래스 객체는 동일하니 true가 나오고 data1과 data3은 나이는 같으나 이름이 다르기 때문에 false가
나오는 것을 확인할 수 있습니다.
하지만 주의할 점이 있습니다. equals()함수는 주 생성자의 매개변수만 비교한다는 겁니다.
주 생성자를 말했었죠?
지금 위 코드를 보면 data class DataClass에 괄호 안에 있는 (val name: String, val age: Int)가 주 생성자이죠.
아래 코드를 보시죠.
data class DataClass(val name: String, val age: Int) {
lateinit var address: String
constructor(name: String, age: Int, address: String): this(name, age) {
this.address = address
}
}
fun main() {
val data1 = DataClass("Tom", 32, "INCHEON")
val data2 = DataClass("Tom", 32, "SEOUL")
println("객체 비교 : ${data1.equals(data2)}") // true
}
실행 결과는 true로 나옵니다.
이처럼 주 생성자의 매개변수들만 비교하고 부 생성자로 생성된 매개변수값은 비교를 안하기 때문에
이름과 나이는 같아도 주소가 다름에도 결과는 true로 나옵니다.
데이터 클래스에 toString() 함수도 이용할 수 가 있습니다.
data class DataClass(val name: String, val age: Int)
class NonDataClass(val name: String, val age: Int)
fun main() {
val data = DataClass("Tom", 30)
val nonData = NonDataClass("John", 35)
println("데이터 클래스 : ${data.toString()}") // DataClass(name="Tom", age=30)
println("논데이터 클래스 : ${nonData.toString()}") // 참조주소
}
일반 클래스는 toString() 함수를 이용하면 참조주소값이 출력되지만,
데이터 클래스는 toString() 함수를 이용하면 객체의 데이터를 확인할 수 있습니다.
오브젝트 클래스
코틀린에서 오브젝트 클래스는 익명 클래스를 만들 목적으로 사용합니다.
익명 클래스란 말 그대로 이름이 없는 클래스를 의미합니다.
그래서 클래스를 선언할 당시에 객체를 생성하지 않으면 객체를 생성할 방법이 사라집니다.
open class Super {
open var age = 20
open fun some() {
println("age : $age")
}
}
val obj = object: Super() {
override var age = 20
override fun some() {
println("age : $age")
}
}
fun main() {
obj.age = 30
obj.some() // age : 30
}
컴패니언 클래스
컴패니언 클래스는 클래스에 직접적으로 접근하고 싶을 때 사용합니다.
아래 코드를 보시죠.
class User {
val name = "Ban"
var age = 40
fun into() {
println("내 이름은 ${name}이고 나이는 ${age}살이야")
}
}
fun main() {
User.name // 오류
User.into() // 오류
}
직접적으로 접근이 안됩니다.
이걸 가능케 하는 것이 컴패니언 클래스 입니다.
class User {
companion object {
val name = "Ban"
var age = 40
fun into() {
println("내 이름은 ${name}이고 나이는 ${age}살이야")
}
}
}
fun main() {
User.age = 30
User.into() // 내 이름은 Ban이고 나이는 30살이야
}
컴패니언 클래스로 적용을 하면 클래스이름으로 직접적으로 접근이 가능하지만,
변수로 선언해서 접근하는 것이 되지 않습니다.
그럼 이만~~
'코틀린 > 순수 코틀린' 카테고리의 다른 글
| 코틀린 - 지연 초기화 (0) | 2023.03.31 |
|---|---|
| 코틀린 - 널(null) (0) | 2023.03.29 |
| 코틀린 - 상속 (0) | 2023.03.26 |
| 코틀린 - 접근제한자 (0) | 2023.03.25 |
| 코틀린 - 클래스(class) (0) | 2023.03.24 |