공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
이번 포스팅에서는 Data Class 와 Sealed Class 에 대해 공부합니다.
Data Classes
우리는 데이터를 유지시켜놓기 위한 클래스를 자주 만듭니다.
자바를 예로 들면 DAO 가 있겠죠?
class UserDao {
private String name;
private String id;
public UserDao (String name, String id) {
this.name = name;
this.id = id;
}
}
처럼요.
이러한 클래스에서 일부 표준 메서드들과 유틸리티 메서드들은 data에 의해서
약간 변경될 수 있습니다. 그리고 이런 클래스를 코틀린에서는 Data Class 라고 부르며,
클래스 앞에 data 키워드를 붙여줍니다.
data class UserDao(val name : String, val id : String)
컴파일러는 기본 생성자에 선언된 프러퍼티들을 확인하고 아래 멤버들을 자동적으로
변형시킵니다.
- equals() / hashCode() 쌍
- toString() -> "UserDao(name=Thomas, id=altongmon)" 이런 형식으로 변형됩니다.
- copy() ->
생성된 코드의 일관성과 의미있는 동작을 보장하려면, Data Class 는 아래 요구사항을
충족해야 합니다.
- 기본 생성자는 최소 하나 이상의 파라미터를 가져야 한다.
- 모든 파라미터는 val 이든 var 든 생략하지 않고 선언해야 한다.
- Data Class 는 abstract 이거나, open, sealed, inner 일 수 없다.
- (1.1버전 이전) Data Class 는 인터페이스만 상속 받을 수 있다.
추가적으로 멤버 생성은 멤버 상속과 관련하여 아래의 규칙을 따릅니다.
만약 파라미터가 없는 Data Class 가 필요하다면,
기본 생성자 파마리터에 Default Value를 지정해주면 됩니다.
String = ""
Int = 0
Double = 0.0
Object = null
...
Copying
Data Class 에는 copy 라는 함수가 있습니다.
이 함수를 이용하면, 속성의 일부를 변경하여 복사를 할 수 있습니다.
fun main(args: Array<String>) {
val userDao = UserDao("박성균",27)
val newUserDao = userDao.copy( age = 28)
println(userDao.toString())
println(newUserDao.toString())
}
data class UserDao(var name : String, var age : Int)
---------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------
Sealed Class
Sealed Class 는 제한된 집합의 형식 중에 하나를 가질 수 있지만, 다른 형식을 가질 수 없는
경우 제한된 계층 구조를 표현하기 위해 사용합니다.
Sealed Class 는 어떤 면에서는 enum 클래스의 Extension 입니다.
enum 타입에 대한 집합의 값들 또한 제한되지만, 각각의 enum 상수들은 싱글 인스턴스로
존재하지만, Sealed Class 의 하위 클래스들은 state 를 포함하는 여러 인스턴스를
가질 수 있습니다.
Sealed Class 를 선언할 때는 클래스 앞에 sealed 키워드를 주면 됩니다.
Sealed Class 는 하위 클래스를 가질 수 있으나, 하위 클래스들은 Sealed Class 와
같은 .kt 파일 안에서 선언되어야 합니다.
Sealed Class 는 추상 클래스이고, 직접 인스턴스를 가질 수 없고, 추상 멤버를
가질 수 있습니다. 그리고 생성자의 기본 접근 제한이 private이고,
non-private 생성자를 가질 수 없습니다.
Sealed Class의 서브 클래스들은 어디에서나 사용 가능합니다.
여기까지 보면 Sealed Class 를 어디에서 사용해야 하나? 라는 생각이 드는데,
공식문서에 따르면 when() 조건문에서 유용하게 사용된다고 하네요 ㅎㅎ
이상입니다.
감사합니다.
'코틀린(Kotlin)' 카테고리의 다른 글
코틀린(kotlin) : 객체 표현식과 객체 선언 Object Expression and Declaration (2) | 2018.02.05 |
---|---|
코틀린(kotlin) : Nested Class, inner class, Enum Class 중첩, 내부, Enum 클래스 (0) | 2018.02.05 |
코틀린(kotlin) : 확장 Extension (0) | 2018.01.31 |
코틀린(kotlin) : 접근 제한자 - private, protected, internal, public (0) | 2018.01.31 |
코틀린(kotlin) : 인터페이스 Interface (0) | 2018.01.30 |