Kotlin, enum class, sealed class

이도현·2023년 8월 23일
0

Kotlin 공부

목록 보기
17/20

0. enum class, sealed class

enum이 무엇인지 enum class엔 무엇이 정의되는지 언제 쓰면 좋은지 알아보자. 그다음 kotlin의 sealed class를 알아보고 enum과 비교해보자.

1. enum class

  • enum: enumerated type의 줄임말로 열거형이라고 부려머, 컴퓨터 프로그래밍에서 열거형은 요소, 멤버라 불리는 명명된 값의 집합을 이루는 자료형,
  • 이름들은 일반적으로 해당 언어의 상수 역할을 하는 식별자
  • 열거형 상수는 필드를 가질 수 있다.
  • 생성자 정의는 private으로 선언해야한다.
  • 런타임이 아닌 컴파일 타임에 고정되어야한다.

    런타임: 컴퓨터 프로그램이 실행되고 있는 동안의 동작
    컴파일 타임: compile 과정을 통해 컴퓨터가 이해할 수 있는 기계어로 변환되는 과정

1) 특정값으로 초기화 할 수 있다.

enum class Direction{
	NORTH, SOUTH, WEST, EAST
}

enum class Color(var rgb: Int){
	RED(0xFF0000),
    GREEN(0x00FF00),
    Blue(0x0000FF)
}

fun main(){
	println(Direction.NORTH.toString())
    println(Color.Red.rgb.toString(16))
}

2) 자신의 anonymous class들과 method들을 선언할 수 있고 base method를 override 할 수 있다.

  • anonymous class(익명클래스) 내부 클래스(inner class) 일종으로 이름이 없는 클래스

    재사용할 필요가 없는 일회성 클래스를 굳이 클래스를 정의하고 생성하는 것이 비효율적이기 대문에, 코드를 줄이는 일종의 기법

enum class ProtocolState{
	WAITING{
    	override fun signal() = TALKING
    },
    TALKING{
    	override fun signal() = WAITING   
    },
    
    abstract fun signal(): Protocolstation
}

3) 상속 대신 interface를 사용

  • interface는 모든 항목을 위한 하나의 인터페이스 멤버를 가지거나 anonymous class안에 있는 각각의 항목을 위한 인터페이스들을 가진다.

    상속: is-a관계, 현대차는 자동차
    인터페이스: can-do 관계, has-a 관계, 나는 모바일 앱 개발도 할 수 있고, 웹 개발 도 할수 있다, 나는 노트북도 있고 컴퓨터도 있다.
    4) 정의된 enum constant를 리스트화 할 수 있고 이름으로 enum constant를 얻을 수 있는 synthetic method를 가진다.

// EnumClass is the name of enum class
EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array<EnumClass>

println(Direction.valueOf("NORTH"))
println(Direction.values().joinToString())

// output:
// NORTH
// NORTH, SOUTH, WEST, EAST
  • enum consant는 자신의 이름과 위치를 얻을 수 있는 property를 가진다.

2. sealed class

  • kotlin에서 제공하는 특별한 유형의 클래스, 한정된 하위 클래스 집합
    1) 한정된 하위 클래스
  • 자신의 중첩된 클래스나 같은 파일내의 클래스로만 확장, 실수로 인한 누락, 불필요한 확장을 방지
    2) 스마트 캐스팅
  • when식을 사용하요 sealed class의 하위 클래스를 검사할 때, 모든 경우를 다루면 else절 불필요
    3) 대수적 데이터 타입(algebraic data types)을 표현하기 적합

    대수적타입이란? 부분으로 전체를 나타내는 타입. 곱타입과 합타입으로 분리 가능
    https://velog.io/@ehgus8621/kotlin-%EB%8C%80%EC%88%98%EC%A0%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85%EC%9D%B4%EB%9E%80

3. enum vs sealed

1) enum

  • 각 항목은 메모리에 한 번만 로드, enum 타입의 객체를 생성할 때마다 새로운 메모리 할당이 발생하지 않음
  • 간단한 값 또는 상태를 표현할 때 사용되므로, 연산 오버헤드가 최소화

2) sealed

  • 객체를 생성할 때마다 메모리 할당이 발생, data class로 정의된 sealed class의 하위 클래스의 인스턴스는 각각 별도의 메모리 영역을 차지
  • 다양한 유형과 상태를 나타내기 위함
  • 성능 오버헤드는 주로 객체 생성과 가비지 컬렉션에 관련
  • when 식에서 exhaustive(완전한) 체크를 받게 되므로, 일반적인 조건 검사보다는 약간의 성능 향상

3) 비교
메모리 관점에서는 enum이 더 효율적이다. 간단한 상태 정의를 위함이라면 enum을 사용, 하지만 성능적으로는 sealed가 우세하므로 동작을 명령하는 등의 정확한 명령이 포함될 계획이라면 sealed class를 사용

reference

https://eatnows.tistory.com/91
https://iosroid.tistory.com/66

profile
좋은 지식 나누어요

0개의 댓글