9. 코틀린의 클래스
1) 데이터 클래스
- data 키워드를 이용해서 함수 없이 데이터만 포함된 VO 클래스를 선언할 수 있다.
- 제약 조건
하나 이상의 매개변수를 가진 주 생성자를 선언해야 한다.
모든 주 생성자의 매개변수는 var, val로 선언해야 한다.
abstract, open, sealed, inner 등의 예약어를 사용할 수 없다.
- 데이터와 관련된 함수를 제공한다.
data class Member(val name: String, val age: Int, val address: String)
fun main() {
val member1 = Member("Kim", 20, "Seoul")
val member2 = Member("Lee", 25, "Busan")
val member3 = Member("Park", 30, "Jeju")
val member4 = member1.copy()
println(member1.equals(member2))
println(member1.equals(member4))
println(member2.toString())
println("${member3.component1()}, ${member3.component2()}, ${member3.component3()}")
}
// 결과
false
true
Member(name=Lee, age=25, address=Busan)
Park, 30, Jeju
2) Enum 클래스
- 열거형 타입을 제공하기 위한 클래스
enum class PLanguage{
C, JAVA, PYTHON
}
fun main() {
val c = PLanguage.C
val java = PLanguage.JAVA
val python = PLanguage.PYTHON
println("${c.ordinal}:${c.name}, ${java.ordinal}:${java.name}, ${python.ordinal}:${python.name}")
println()
val plangs = PLanguage.values()
plangs.forEach { i -> println("${i.declaringClass}: ${i.name}, ${i.ordinal}") }
}
// 결과
0:C, 1:JAVA, 2:PYTHON
class ex_b.PLanguage: C, 0
class ex_b.PLanguage: JAVA, 1
class ex_b.PLanguage: PYTHON, 2
3) Enum 클래스 활용
- enum 클래스의 열거 상수는 해당 enum 클래스를 상속받는 익명 객체이기 때문에 다양한 활용이 가능하다.
enum class MyEnum(val no: Int, val str: String){
JUSTIN(0, "Bieber"), CHARLIE(1, "Puth"), ED(2, "Sheeran")
}
fun main() {
val me = MyEnum.values()
me.forEach { i -> println("${i.no}: ${i.name} ${i.str}") }
}
// 결과
0: JUSTIN Bieber
1: CHARLIE Puth
2: ED Sheeran
enum class MyEnum2{
A{
override val nickname: String = "Nick"
override fun say() = println("My name is $nickname")
},
B{
override val nickname: String = "John"
override fun say() = println("My name is $nickname")
},
C{
override val nickname: String = "Jason"
override fun say() = println("My name is $nickname")
}; // 세미콜론 주의
abstract val nickname: String
abstract fun say()
}
fun main() {
val me = MyEnum2.values()
me.forEach { i -> i.say() }
}
// 결과
My name is Nick
My name is John
My name is Jason
4) Sealed 클래스
- 클래스 타입을 묶기 위한 용도로 사용
- sealed 예약어에 abstract가 내장되어있어서 sealed 클래스 자체로 객체 생성 불가
sealed class Unit{
class Marin(): Unit()
class Zealot(): Unit()
class Zergling(): Unit()
}
fun main() {
// val unit = Unit() // 에러!
val marin = Unit.Marin()
val zealot = Unit.Zealot()
val zergling = Unit.Zergling()
}
5) Nested 클래스
- 코틀린에서는 내부 클래스를 Nested 클래스라고 통칭한다.
- inner 예약어를 추가하지 않으면 외부 클래스의 멤버를 사용할 수 없다.
class Outer{
val data: String = "Outer Data"
class Nested{
// fun say() = println(data) // 에러!
}
inner class InnerClass{
fun say() = println(data)
}
}
6) Object 클래스
- object 예약어를 사용해서 익명 클래스(이름이 없는 클래스)를 선언할 수 있다.
- 단 한번 사용될 클래스를 작성할 때 사용한다.
- 상속 및 구현은 가능하지만 재사용되지 않기 때문에 생성자는 생성할 수 없다.
- private이나 상속, 구현 없이 생성된 객체는 외부에서 접근할 수 없다.
- object로 선언된 클래스는 참조변수로는 접근이 불가능하고 직접 참조해야 한다.
- companion 예약어를 사용하면 object 클래스명을 사용하지 않고 이용할 수 있다.
interface User{
val name: String
}
class ObjEx{
val user1 = object {
val name: String = "Jason"
}
private val user2 = object {
val name: String = "John"
}
val user3 = object:User{
override val name: String = "Nick"
}
object user4 {
val name: String = "Anne"
}
companion object user5 {
val ellie: String = "Ellie"
}
// fun say1() = println("My name is ${user1.name}") // 에러!
fun say2() = println("My name is ${user2.name}")
fun say3() = println("My name is ${user3.name}")
fun say4() = println("My name is ${user4.name}")
}
fun main() {
val obj = ObjEx()
obj.say2()
obj.say3()
obj.say4()
// println(obj.user4.name) // 에러!
println(ObjEx.user4.name)
println(ObjEx.ellie)
}
// 결과
My name is John
My name is Nick
My name is Anne
Anne
Ellie
'프로그래밍 > Kotlin' 카테고리의 다른 글
[Kotlin 요약 정리] 11. 고차 함수와 인라인 함수 (0) | 2019.04.12 |
---|---|
[Kotlin 요약 정리] 10. 함수형 프로그래밍과 람다 (0) | 2019.04.12 |
[Kotlin 요약 정리] 8. 추상 클래스와 인터페이스 (0) | 2019.04.10 |
[Kotlin 요약 정리] 7. 상속 (0) | 2019.04.09 |
[Kotlin 요약 정리] 6. 프로퍼티 (0) | 2019.04.09 |