본문 바로가기

Programming/Scala

Scala - Pattern matching example 2 (Scala 언어로 패턴 매칭하기)

Scala 에서는 Pattern matching 을 할경우, 특수 문자들을 사용하여 수행할 수 있다.


허용되는 특수문자는 @, _, * 들이 있다.


1. "_" : "_" 는 어떠한 것과도 매칭될 수 있는 와일드카드 키워드이다. 

예제: 아래에서는 matchChoice 함수에 어떠한 숫자도 입력할 수 있지만, 0 과 1을 제외한 다른 수를 입력하면 Other choices 라는 메시지를 출력한다.


def matchChoice(num: Int) = {

    num match {

        case 0 => println("Choice is zero")

        case 1 => println("Choice is one")

        case _ => println("Other choices")

    }

}



2. "@" : "@" 는 특정 패턴이나 패턴의 부분에 붙이는 별칭이다.

아래의 예제는 스칼라 인터프리터에서 패턴매칭을 하는 것을 보여준다.

scala> case class Address(code: Int, zip: Int, city: String, nation: String)

defined class Address


scala> val country1 = Address(1,1,"Seoul", "Korea")

country1: Address = Address(1,1,Seoul,Korea)


scala> val country2 = Address(2,2,"Beijing", "China")

country2: Address = Address(2,2,Beijing,China)


scala> val country3 = Address(3,3,"Tokyo", "Japan")

country3: Address = Address(3,3,Tokyo,Japan)


scala> val country4 = Address(4,4,"Seoul", "Korea")

country4: Address = Address(4,4,Seoul,Korea)


scala> val countries = List(country1, country2, country3, country4)

countries: List[Address] = List(Address(1,1,Seoul,Korea), Address(2,2,Beijing,China), Address(3,3,Tokyo,Japan), Address(4,4,Seoul,Korea))


아래 파란색 부분은 각 나라에 따라서 주소를 출력하는 코드이다.

case address @ Address(_, _, "Seoul", "Korea") => println(address.toString)

구문에서 Address case class 의 객체를 address 라는 별칭으로 대신 사용할 수 있다.

scala> for (country <- countries) {

     | country match {

     | case address @ Address(_,_,"Seoul", "Korea") => println(address.toString)

     | case _ => println("Other country")

     | }

     | }

Address(1,1,Seoul,Korea)

Other country

Other country

Address(4,4,Seoul,Korea)


3. "_*" : sequence 들을 매칭할 때 사용하는데, 0개 이상의 요소를 가진 sequence 를 요소의 끝까지 매칭시킨다.


아래 구문은 expr 이라는 변수를 패턴매칭 하는 코드이다.

첫 번째 패턴 매칭은 expr 이 List 타입이고, 첫 번째 요소가 1이며, 총 3개의 요소를 가질경우 해당하는 것이고.

두 번째 패턴 매칭은 expr 이 List 타입이고, 0개 혹은 그 이상의 요소를 가질 경우를 의미한다.

세 번째 패턴 매칭은 expr 이 Map 타입이고, (key, value) pair 가 어떤 값이든 상관 없는 경우를 의미한다.

그러므로, 두 번째 패턴 매칭이 첫 번째 패턴매칭보다 먼저오면 첫 번째 패턴 매칭은 수행되지 않는다.

expr match {

  case List(1,_,_) => " a list with three element and the first element is 1"

  case List(_*)  => " a list with zero or more elements "

  case Map[_,_] => " matches a map with any key type and any value type "

  case _ =>