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 |