본문 바로가기

프로그래밍/Kotlin

[Kotlin 요약 정리] 9. 코틀린의 클래스

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