코틀린(Kotlin)

코틀린(kotlin) : Data Class 와 Sealed Class

알통몬_ 2018. 1. 31. 14:37
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


이번 포스팅에서는 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() 조건문에서 유용하게 사용된다고 하네요 ㅎㅎ


이상입니다.

감사합니다.


반응형