[코틀린] 이넘 클래스, 데이터 클래스, 값 클래스

홍건의·2024년 11월 9일
0

코틀린

목록 보기
1/1

Enum Class

enum class WeekDay {
	MONDAY, TUESDAY, WEDNESDAY
} // 이렇게 정의하고

// 이렇게 사용한다.
fun main() {
    println(WeekDay.MONDAY)
}

정의할 때 "class" 키워드가 들어간 다는 점을 제외하면 java와 유사하다.

Data Class

data class Person(val firstName: String,
				  val familyName: String,
                  val age: Int)
// 이렇게 정의하고

// 이렇게 사용한다.
fun main() {
    val person1 = Person("John", "Doe", 25)
    val person2 = Person("John", "Doe", 25)
    println(person1 == person2) // true
}

equals(), hashCode(), toString() 같은 메소드들을 자동으로 생성해준다. 자바에서는 매번 구현해야 했다.
동등성(equality) 비교 연산을 자동으로 생성해준다.

class Person(val firstName: String, 
			 val familyName: String,
             val age: Int)

data class Mailbox(val address: String, val person: Person)
// 이렇게 정의하면 Person 클래스 때문에 동등성이 프로퍼티 값 비교만으로는 이루어지지 않는다.

fun main() {
    val box1 = Mailbox("Unknown", Person("John", "Doe", 25))
    val box2 = Mailbox("Unknown", Person("John", "Doe", 25))
    println(box1 == box2) // false 반환
}

일반적으로 데이터 클래스는 불편 클래스로 설계하는 편이 더 합리적이다. 불변 데이터를 사용하면 코드에 대한 추론이 쉬워지고, 실수를 덜 저지르게 되기 때문이다. 특히 다중 쓰레드 환경에서는 불편성이 더욱 도움된다.

Value Class

@JvmInline
value class Dollar(val amount: Int)
@JvmInline
value class Euro(val amount: Int)

값 클래스 주 생성자에는 불변 프로퍼티를 하나만 선언해야 한다. 런타임에 클래스 인스턴스는 별도의 래퍼 객체를 생성하지 않고 이 프로퍼티의 값으로 표현된다.
런타임에는 호출 지점을 함수 본문으로 인라인하는 인라인 함수처럼 인라인 클래스 객체를 사용하는 위치 대신 인라인 클래스에 들어있는 값이 들어간다.

@JvmInline
value class Dollar(val amount: Int) {
	fun add(d: Dollar) = Dollar(amount + d.amount)
    val isDept get() = amount < 0
}

fun main() {
	print(Dollar(15).add(Dollar(20)).amount) // 35
    print(Dollar(-100).isDebt) // true

val : 불변 변수 키워드
var : 가변 변수 키워드

profile
Backend Developer

0개의 댓글

관련 채용 정보