본문 바로가기

Languages/Scala

[스칼라] 매치 표현식

반응형

스칼라에서도 전통적인 if-else 문을 지원하나, 더 간결하고 표현력이 좋으며 확장성이 높은 매치 표현식 match expressions 사용을 선호합니다. 자바의 switch-case 문과 비슷하게 동작하나, 0개 또는 단 하나의 패턴만 매칭할 수 있습니다.

//매치 표현식
표현식 match {
  case 패턴매치 => 표현식
  case _ => 표현식	//catch-all 패턴
}

와일드 카드를 사용하여 매치 표현식에서 catch-all 패턴을 사용할 수 있으며, 단 하나의 패턴만 매칭할 수 있어 자바처럼 여러 개의 패턴을 한 번에 매칭하는 형태로는 사용할 수 없습니다. 따라서 중간에 빠져 나오는 break문이 존재하지 않습니다.

 

매치 표현식에서는 값 바인딩을 사용하여 매치 표현식의 입력 패턴을 바인딩하여 case 블록의 본문에서 사용할 수 있습니다.

val x = 150

val status = x match {
  case num => println(num)	//값 바인딩 예제
}

위와 같이 값을 바인딩 할 수도 있으며, 와일드카드를 사용할 수도 있습니다. 하지만 와일드카드를 사용한 경우에는 화살표 오른쪽에서 매치 표현식의 입력 패턴을 사용할 수 없다는 점을 유의하여야 합니다.

 

값 바인딩 패턴에 if 문을 추가하여 매치 표현식에 조건부 로직을 추가할 수 있는데, 이를 패턴 가드 pattern guard 라고 합니다.

val x = 150

val status = x match {
  case num if num > 100 => "Big"
  case num if num > 0 => "Positive"
  case _ => "Negative"
}

위 코드의 실행 결과는 status: String = Big 이 됩니다.

 

마찬가지로 입력 표현식의 타입을 매칭할 수 있는데, 스칼라는 다형적(polymorphic) 타입을 지원하므로 패턴 변수는 입력값을 다른 타입의 값으로 전환하여 사용할 수 있도록 합니다.

val y:Any = 15.0

val status = y match {
  case num:Int => "Int"
  case num:Double => "Double"
  case _ => "Other"
}

위 코드의 실행 결과는 status: String = Double 이 됩니다.

 

매치 표현식에서 입력값이 어떤 패턴에도 매칭되지 않는다면 오류를 발생시킵니다.

이러한 특성은 후에 서술할 부분 함수 partial function 등에서 사용됩니다.

 

매치 표현식에서는 단순히 값 뿐만 아니라 정규표현식이나 컬렉션 등 다양한 입력값에 대한 패턴 매칭이 가능합니다.

스칼라에 익숙해지기 위해서는 if-else 구문보다 match 표현식을 사용하며 문법에 익숙해 지는 것을 권장합니다.

반응형