스칼라 패턴 매칭
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의 스위치에 해당하지만 선택기 표현식 뒤에 작성됩니다. 즉, 선택기 일치 {대안}입니다.
일치 표현식은 코드가 작성된 순서대로 각 패턴을 시도하여 계산을 완료합니다. 일치하는 사례가 발견되면 나머지 사례는 계속 일치하지 않습니다.
다음으로 다양한 데이터 유형의 패턴 일치를 살펴보겠습니다.
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
인스턴스의 첫 번째 사례는 다음과 같습니다. 정수 유형 값 1, 두 번째 사례는 문자열 값 2에 해당하고, 두 번째 사례는 문자열 값 2에 해당하며, 세 번째 사례는 들어오는 값이 정수인지 확인하는 데 사용되는 유형 패턴에 해당합니다. isInstanceOf를 사용하여 유형을 결정하면 패턴 일치를 사용하는 것이 더 좋습니다. 네 번째 경우는 기본 전체 일치 대안, 즉 스위치의 기본값과 유사하게 다른 일치 항목이 발견되지 않은 경우의 일치를 나타냅니다.
샘플 클래스 사용
case 키워드를 사용하는 클래스 정의는 케이스 클래스이며 패턴 일치에 사용하도록 최적화된 특수 클래스입니다.
다음은 샘플 클래스의 간단한 예입니다.
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 { case Person("Alice", 25) => println("Hi Alice!") case Person("Bob", 32) => println("Hi Bob!") case Person(name, age) => println("Age: " + age + " year, name: " + name + "?") } } } // 样例类 case class Person(name: String, age: Int) }
위 코드를 실행하면 출력 결과는 다음과 같습니다.
$ scalac Test.scala $ scala Test Hi Alice! Hi Bob! Age: 32 year, name: Charlie?
샘플 클래스를 선언할 때 다음 프로세스가 수행됩니다. 자동으로 발생합니다.
명시적으로 var로 선언되지 않는 한 생성자의 각 매개변수는 val이 되지만 이는 권장되지 않습니다.
메소드가 컴패니언 객체에 제공되므로 new 키워드를 사용하지 않고도 객체를 생성할 수 있습니다.
패턴 매칭이 가능하도록 unapply 메소드를 제공합니다.
이러한 메서드의 정의가 명시적으로 제공되지 않는 한 toString, equals, hashCode 및 copy 메서드를 생성합니다.