보뇨 다이어리

코틀린 디자인 패턴 - 구조 패턴 이해하기 (상태) 본문

컴퓨터 관련/Kotlin 정보

코틀린 디자인 패턴 - 구조 패턴 이해하기 (상태)

보뇨 2024. 12. 13. 13:42
반응형

개인적으로 자바에서 상태패턴 작성할때 고민이 되던 부분이였는데 코틀린 언어적으로 처리가 가능한게 신기해서 기록해봄.

무엇보다 switch case 문은 저도 별루지만 그 기능을 만든건 다 이유가 있다고 생각하니...

 

우선 sealed 키워드없이 abstract 를 쓰거나 아무것도 안적게 되면 Dead 클래스에 따른 requireMoodMessage 처리가 아직 반영되지않았기때문에 에러가 발생한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Chapter03Test {
 
    @Test
    fun sealedTest() {
        println(requireMoodMessage(Still()))
        println(requireMoodMessage(Aggressive()))
        println(requireMoodMessage(Dead()))
    }
 
    sealed class Mood
 
    class Still : Mood()
    class Aggressive : Mood()
    class Dead : Mood()
 
    fun requireMoodMessage(mood: Mood): String {
        return when (mood) {
            is Still -> "still doing something"
            is Aggressive -> "idk why he is so aggressive"
        }
    }
}
cs

 

 

그래서 아래와 같이 수정하게되면 더이상 에러 메시지가 나오진않는다.

다만, class 선언한쪽에서 warning 이 발생하는데 해당 이유는 equals, hashCode 를 오버라이딩해달라는 소리

이때 생각해보면 어차피 상태라는것이 중복될필요가 없기도해서 (특정 케이스의 경우 제외) 싱글톤으로 작성하면 된다.

그래서 방법은 아래를 계속 이어서 확인하면된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Chapter03Test {
 
    @Test
    fun sealedTest() {
        println(requireMoodMessage(Still()))
        println(requireMoodMessage(Aggressive()))
        println(requireMoodMessage(Dead()))
    }
 
    sealed class Mood
 
    class Still : Mood()
    class Aggressive : Mood()
    class Dead : Mood()
 
    fun requireMoodMessage(mood: Mood): String {
        return when (mood) {
            is Still -> "still doing something"
            is Aggressive -> "idk why he is so aggressive"
            is Dead -> "walking dead"
        }
    }
}
cs

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
// 방법 1
data object Aggressive : Mood()
 
// 방법 2
class Dead : Mood() {
        override fun equals(other: Any?): Boolean {
            return this === other
        }
 
        override fun hashCode(): Int {
            return System.identityHashCode(this)
        }
    }
cs

 

반응형