함수형 프로그래밍 2-6~2-7
함수형 프로그래밍 2-6~2-7
함수형 프로그래밍 2-6~2-7
2-6 패턴 매칭
패턴 매칭이란 값,조건,타입 등의 패턴에 따라서 매칭 되는 동작을 수행하게 하는 기능을 말한다.
아래는 패턴 매칭의 예제 이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import org.junit.Test
class PatternMatchingTest {
@Test
fun testPatternMatching() {
println(checkValue("kotlin")) //kotlin 출력
println(checkValue(5)) //1..5 출력
println(checkValue(6)) //6 or 8 출력
println(checkValue(User("영훈", "주소"))) //User 출력
println(checkValue(12)) //else 출력
}
data class User(val name: String, val address: String)
private fun checkValue(any: Any) = when (any) {
"kotlin" -> "kotlin"
in 1..5 -> "1..5"
6, 8 -> "6 or 8"
is User -> "User"
else -> "else"
}
}
패턴 매칭의 한계에 대해 살펴 보자.
1
2
3
4
5
6
7
8
9
10
11
12
@Test
fun testSecondPatternMatching() {
println(checkValue(listOf(1,2,3)))
println(checkValue(listOf("1","2","3")))
println(checkValue(2))
}
private fun checkValue(any: Any) = when (any) {
List<Int> -> "Int List"
List<String> -> "String List"
else -> "else"
}
위의 코드는 컴파일 에러가 발생 된다. 리스트와 같은 매개변수를 포함하는 타입이나 함수의 타입에 대한 패턴 매칭을 지원하지 않기 때문이다.
패턴 매칭을 사용한 sum 함수를 만들려면 어떤식으로 구현 해야 할까?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import org.junit.Test
class PatternMatchingTest {
@Test
fun testSum() {
println(sum(listOf(1, 2, 3, 4, 5)).toString())
}
fun sum(numbers: List<Int>): Int = when {
numbers.isEmpty() -> 0
else -> numbers.first() + sum(numbers.drop(1))
}
}
sum 재귀 함수를 사용하였다. List
2-7 객체 분해
객체 분해란 어떤 객체를 구성하는 프로퍼티를 분해하여 편리하게 변수에 할당하는 것을 말한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
class DestructuringDeclarationTest {
@Test
fun test(){
val user = User("영훈", "주소")
val (name , address) = user //객체 분해 사용
println("user name : "+user.name)
println("객체분해 name : "+name)
println("user address : "+user.address)
println("객체분해 address : "+address)
}
data class User(val name: String, val address: String)
}
일반적으로 user 를 통해서 name , address 를 접근 하게 되는데 객체 분해는 한번 분해해서 할당하면 name , address 바로 접근 가능하다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.