자바의 클래스와 다른 점
default final
내부에 선언한 클래스 → defualt static nested class
중첩 클래스에는 외부 클래스에 대한 참조가 없음
class A {
val aNum = 10
class B {
fun getAnum() = println(aNum) // impossible!
}
}
fun main() {
val b = A.B()
}
외부 클래스를 참조할 수 있는 종속적인 내부 클래스 → inner class
class A {
val aNum = 10
val num = 20
inner class B {
val num = 30
fun getAnum() = println(aNum) // possible!
fun getNum() = println([email protected]) // this@클래스이름
}
}
fun main() {
val b = A().B()
}
데이터 보관 목적의 클래스 → data class
toString()
, hashCode()
, equals()
, copy()
기본 구현자신을 상속받는 서브 클래스의 종류를 제한하는 클래스
sealed class Shape {
class Circle(val rad: Double): Shape()
class Rectangle(val width: Double, val height: Double): Shape()
}
class Triangle(val base: Double, val height: Double): Shape()
sealed class
를 상속하는 클래스들은 같은 파일 내에 선언되어야 함
sealed class
를 상속하는 클래스를 상속하는 클래스는 다른 파일에도 가능private
생성자만 가짐sealed class Expr {
class Num(val value: Int) : Expr()
class Sum(val left: Expr, val right: Expr) : Expr()
}
fun eval(e: Expr): Int =
when (e) {
is Expr.Num -> e.value
is Expr.Sum -> eval(e.right) + eval(e.left)
// else 불필요
}
둘 다 타입을 제한시키기 위해 많이 사용한다.
enum | sealed | |
---|---|---|
생성자 | 형태가 동일해야 함 | 각기 달라도 가능 |
state | single instance로써 하나의 객체만 제한적으로 사용 가능 | state를 포함하는 여러 객체 사용 가능 |
유용한 상황 | - 고정된 값의 집합을 나태내야 하고 각 값에 고유 ID가 있는 경우 - when 에서 사례로 사용할 수 있는 단순하고 닫힌 값의 집합을 나타낼 때 |
- 각 값이 서로 다른 형식의 개체인 보다 복잡한 값 집합을 나타내야 할 때 - 기존 코드를 변경하지 않고, 추후 새로운 값을 추가할 수 있는 열린 값 집합을 나타내야 할 때 |