data class
data class(
val a : String,
val b : int
)
대략 이런 형태로 쓰인다.
데이터를 저장하는 클래스(DTO, VO)를 쉽게 만들 수 있다.
- Property 자동 생성해준다.
- var, val이 쓰여진 변수들의 getter, setter들을 자동으로 만들어준다.
- componentN()
- component 함수를 작성해준다.
- 객체의 값을 여러 변수로 분리해서 사용하는 분리 선언을 할 때 component함수가 쓰인다.
- copy()
- 객체를 복사할 때 일부 값을 변경하고 싶을 때 사용한다.
- toString, hashCode, equals 자동 오버라이딩
- data class를 작성하면 최상의 클래스인 Any에서 작성된 메소드들을 자동으로 오버라이딩 된다.
사용 제약조건
- 생성자는 최소 1개 이상의 파라미터를 받아야 한다.
- 모든 prime 생성자는 val, var 이여야 한다.
- 데이터 클래스로 추상, 실드 클래스 작성할 수 없다.
- 데이터 클래스는 상속이 불가하다.
Enum class
- 이름에 상수를 붙여주는 기능을 한다.
- 고유한 값의 집합을 나타내는 타입을 모델링하는데 사용된다. (States, Modes, Directions...)
enum class Fruit{
apple, banana
}
enum class Fruit(var var1 : Int, var var2 : Int){
apple(10 ,20),
banana(10 ,20)
}
- enum클래스도 클래스의 일종이므로 상속, 익명으로 작성하는 것이 가능하다.
- enum클래스의 값을 검색할려면 valueOf(), 모든 데이터를 가져오기 위해선 values()함수를 사용해서 호출한다.
sealed class
- enum 클래스의 확장 형태이다.
- enum class는 enum type에 속하는 값들이 제한되지만 각 enum constant는 유일한 단독 인스턴스로 존재한다.
반면, sealed class의 subsclass는 여러 개의 인스턴스를 가질 수 있고 state를 가질 수 있다.
- 클래스들을 묶은 클래스이다.
- 상속의 사용을 제한한다.
sealed class Expr{
class Const(val number : Double) : Expr()
class Sum(val e1 : Expr, val e2 : Expr) : Expr()
object NotANumber : Expr()
}
-
sealed 클래스는 같은 sealed가 작성된 파일 상속이 가능하나 다른 파일에서 sealed 클래스 내부를 상속할 수 없다.
-
주로 when 표현식과 함께 쓸 때, 모든 경우에 대한 동작을 구현할 수 있다면 나머지 경우에 대한 처리를 위한 else를 쓰지 않아도 되는 이점이 있다!
즉, 위의 Expr은 Const, Sum, NotANumber가 아닌 이상 다른 타입의 값을 가지는 예외는 존재 하지 않는다.
-
sealed class는 abstract class이며 abstract 멤버를 가질 수 있다.
-
생성자는 기본적으로 private이며 non-private 생성자를 가질 수 없다.