본문 바로가기
2학년 2학기/모바일 소프트웨어 - 코틀린

Kotlin_Basic03 - when(2)

by kkkkk1023 2024. 9. 20.

when을 사용할 때 우리는 꼭 필수적으로 사용한 코드가 있다. 바로 else이다.
하지만 변수의 범위를 명확하게 만들면 else는 필요없다. (물론 사용해도 됨)
 
그 예시로는 enum과 sealed classe가 있다.

enum과 sealed class를 각각 사용한 예시

1. enum class 사용 예시

enum class는 상수들을 정의할 때 사용되며, 상태나 값을 구분할 때 매우 유용하다.

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

fun describeDirection(direction: Direction): String {
    return when (direction) {
        Direction.NORTH -> "You are heading North"
        Direction.SOUTH -> "You are heading South"
        Direction.EAST -> "You are heading East"
        Direction.WEST -> "You are heading West"
    }
}

fun main() {
    val direction = Direction.NORTH
    println(describeDirection(direction))
}

설명:

  • enum class Direction은 4개의 상수 값(NORTH, SOUTH, EAST, WEST)을 가진다.
  • when 문을 사용해 각 상수 값에 대해 다른 메시지를 출력하도록 했다.

 

2. sealed class 사용 예시

 
sealed class는 상속 계층을 제한하여 미리 정의된 하위 클래스만을 가질 수 있다. 이로 인해 컴파일러가 모든 하위 클래스를 알고 있어야 하므로, when 문에서 안전하게 타입을 처리할 수 있다.

sealed class Shape {
    abstract fun calculateArea(): Double
}

class Circle(private val radius: Double) : Shape() {
    override fun calculateArea(): Double {
        return Math.PI * radius * radius
    }
}

class Rectangle(private val length: Double, private val width: Double) : Shape() {
    override fun calculateArea(): Double {
        return length * width
    }
}

class Triangle(private val base: Double, private val height: Double) : Shape() {
    override fun calculateArea(): Double {
        return 0.5 * base * height
    }
}

fun printArea(shape: Shape) {
    when (shape) {
        is Circle -> println("Area of Circle: ${shape.calculateArea()}")
        is Rectangle -> println("Area of Rectangle: ${shape.calculateArea()}")
        is Triangle -> println("Area of Triangle: ${shape.calculateArea()}")
    }
}

fun main() {
    val circle = Circle(5.0)
    val rectangle = Rectangle(4.0, 6.0)
    val triangle = Triangle(3.0, 4.0)

    printArea(circle)
    printArea(rectangle)
    printArea(triangle)
}

설명:

  • sealed class Shape는 Circle, Rectangle, Triangle이라는 하위 클래스를 가질 수 있으며, 각각 면적을 계산하는 메소드를 구현했다.
  • when 문을 통해 Shape 타입에 따라 분기 처리를 한다. sealed class 덕분에 when 문에서 모든 가능한 하위 클래스를 안전하게 처리할 수 있다.

enum class와 sealed class의 차이점과 설명

1. enum class:

  • 정의: enum class는 상수 집합을 정의하는데 사용된다.
  • 사용 목적: 고정된 값이나 상태를 나타낼 때 사용한다. 예를 들어 방향(NORTH, SOUTH)이나 색상(RED, GREEN, BLUE) 같은 경우에 적합하다.
  • 장점: when 문을 사용할 때 모든 값을 처리하지 않으면 컴파일 오류가 발생하므로, 상태를 안전하게 처리할 수 있다.
  • 제약: 모든 값이 상수로 고정되어 있으며, 각 상수는 추가적인 상태나 동작을 가질 수 없기 때문에 상태가 고정적이다.

2. sealed class:

  • 정의: sealed class는 하위 클래스의 상속 계층을 제한하고, 같은 파일 내에서만 하위 클래스를 정의할 수 있다.
  • 사용 목적: 여러 타입이나 상태를 처리해야 하지만, 그 상태나 타입이 미리 정의되어 있고 추가적인 동작을 할 수 있는 경우에 적합하다. 예를 들어 Shape처럼 동적으로 여러 형태의 하위 클래스가 필요한 경우에 사용한다.
  • 장점: sealed class는 상속을 허용하면서도 when 문에서 모든 하위 클래스를 안전하게 처리할 수 있도록 보장한다. 추가적으로 하위 클래스에 메소드를 구현할 수 있다.
  • 제약: 모든 하위 클래스는 반드시 같은 파일 내에 정의되어야 하며, 파일을 넘어선 확장이 불가능하다.

요약

  • enum class는 상수 값들을 정의할 때 적합하고, sealed class는 여러 하위 클래스를 안전하게 처리해야 할 때 유용하다.
  • enum class는 고정된 값 집합을 다룰 때, sealed class는 미리 정의된 여러 타입의 동작을 구분할 때 사용한다.
  • 둘 다 when 문과 함께 사용할 때 컴파일러가 모든 경우를 처리하도록 보장한다는 공통점이 있다.

'2학년 2학기 > 모바일 소프트웨어 - 코틀린' 카테고리의 다른 글

Class(1) - getter, setter  (0) 2024.10.01
Class(1) - 클래스 선언과 생성자  (0) 2024.09.30
Kotlin_Basic03 - when(1)  (0) 2024.09.20
Kotlin_Basic03 - null 처리  (0) 2024.09.20
Kotlin_Basic03 - if 식  (0) 2024.09.20