English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Scala 패턴 매칭

Scala는 강력한 패턴 매칭 기능을 제공하며, 응용도 매우 넓습니다.

한 패턴 매칭은 여러 옵션을 포함하며, 각 옵션은 키워드 case。각 옵션은 패턴 및 하나 이상의 표현식을 포함합니다. 화살표 기호 => 패턴과 표현식을 구분합니다.

다음은 간단한 정수형 값 패턴 매칭 예제입니다:

object Test {
   def main(args: Array[String]) {
      println(matchTest(3))
   }
   def matchTest(x: Int): String = x match {
      case 1 => "one"
      case 2 => "two"
      case _ => "many"
   }
}

위 코드를 실행하면, 출력 결과는 다음과 같습니다:

$ scalac Test.scala 
$ scala Test
many

match는 Java의 switch와 유사하지만, 선택자 표현식의 뒤에 작성됩니다. 즉: 선택자 match {옵션}。

match 표현식은 모든 패턴을 코드의 순서대로 시도하여 계산을 완료하며, 하나의 매칭된 case를 발견하면 나머지 case는 더 이상 매칭되지 않습니다.

다음은 다른 데이터 타입의 패턴 매칭을 보겠습니다:

object Test {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))
      println(matchTest(6))
   }
   def matchTest(x: Any): Any = x match {
      case 1 => "one"
      case "two" => 2
      case y: Int => "scala.Int"
      case _ => "many"
   }
}

위 코드를 실행하면, 출력 결과는 다음과 같습니다:

$ scalac Test.scala 
$ scala Test
2
many
one
scala.Int

예제에서 첫 번째 case는 정수형 값을 나타냅니다 1두 번째 case는 문자 값 two에 해당하며, 세 번째 case는 타입 패턴으로, 전달된 값이 정수형인지 여부를 판단합니다. isInstanceOf를 사용하는 것에 비해 패턴 매칭이 더 좋습니다. 네 번째 case는 기본의 전체 매칭 옵션을 나타내며, 다른 매칭을 찾지 못할 때의 매칭으로 switch의 default과 유사합니다.

예제 클래스 사용

case 키워드를 사용한 클래스 정의는 예제 클래스(case classes)로, 예제 클래스는 특별한 클래스로, 패턴 매칭을 위해 최적화되었습니다.

다음은 예제 클래스의 간단한 예제:

object Test {
   def main(args: Array[String]) {
        val alice = new Person("Alice", 25)
        val bob = new Person("Bob", 32)
        val charlie = new Person("Charlie", 32)
   
    )- for (person <
        List(alice, bob, charlie)) {
            person match { 25) => println("Hi Alice!")
            ) => println("Hi Alice!") 32) => println("Hi Bob!")
            case Person(name, age) =>
               println("연령: " + age + " year, name: " + name + "?"
         }
      }
   }
   // 사례 클래스
   case class Person(name: String, age: Int)
}

위 코드를 실행하면, 출력 결과는 다음과 같습니다:

$ scalac Test.scala 
$ scala Test
Hi Alice!
Hi Bob!
연령: 32 year, name: Charlie?

사례 클래스를 선언할 때 아래 과정이 자동으로 발생합니다:

  • 생성자의 각 파라미터는 val로 선언되지만, 명시적으로 var로 선언되지 않았다면 이를 권장하지 않습니다;

  • 컴파일러 오브젝트에서 apply 메서드를 제공했기 때문에 new 키워드를 사용하지 않고도 객체를 생성할 수 있습니다;

  • 패턴 매칭이 작동하도록 unapply 메서드를 제공합니다;

  • toString, equals, hashCode, copy 메서드를 생성하되, 이 메서드의 정의가 명시되지 않았다면.