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

Scala 추출기(Extractor)

추출기는 전달된 객체에서 해당 객체를 구성하는 매개변수를 추출합니다.

Scala 표준 라이브러리는 몇 가지 предопределенные 추출기를 포함하고 있습니다. 그들을 간단히 알아보겠습니다.

Scala 추출기는 unapply 메서드를 가진 객체입니다. unapply 메서드는 apply 메서드의 반대 작업입니다: unapply는 객체를 받아들이고, 그 객체에서 값을 추출하며, 추출된 값은 일반적으로 해당 객체의 값을 구성하는 데 사용됩니다.

다음 예제는 이메일 주소 추출기 객체를 보여줍니다:

object Test {
   def main(args: Array[String]) {
      
      println("Apply 메서드: " + apply("Zara", "gmail.com"));
      println("Unapply 메서드: " + unapply("[email protected]"));
      println("Unapply 메서드: " + unapply("Zara Ali"));
   }
   // 주입 메서드(선택)
   def apply(user: String, domain: String) = {
      user +"@"+ domain
   }
   // 추출 메서드(필수)
   def unapply(str: String): Option[(String, String)] = {
      val parts = str.split("@")
      if (parts.length == 2{
         Some(parts(0), parts(1)) 
      } else {
         None
      }
   }
}

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

$ scalac Test.scala 
$ scala Test
Apply 메서드: [email protected]
Unapply 메서드: Some((Zara,gmail.com))
Unapply 메서드: None

위 객체는 두 메서드를 정의했습니다: applyunapply 메서드. apply 메서드를 사용하면 new 연산자를 사용하지 않고 객체를 생성할 수 있습니다. 따라서 "[email protected]" 문자열을 구성하는 Test("Zara", "gmail.com") 문장을 사용할 수 있습니다。

unapply 메서드는 apply 메서드의 반대 작업입니다: unapply는 객체를 받아들이고, 그 객체에서 값을 추출하며, 추출된 값은 일반적으로 해당 객체의 값을 구성하는 데 사용됩니다. 예제에서는 다음과 같이 사용합니다: Unapply 메서드는 객체에서 사용자 이름과 이메일 주소 접미사를 추출합니다。

예제에서 unapply 메서드는 전달된 문자열이 이메일 주소가 아니면 None를 반환합니다. 다음은 코드 예시입니다:

unapply("[email protected]")은 Some("Zara", "gmail.com")과 같습니다
unapply("Zara Ali")은 None과 같습니다

추출기는 패턴 매칭을 사용합니다

클래스를 인스턴스화할 때, 0개 또는 여러 개의 매개변수를 추가할 수 있으며, 컴파일러는 인스턴스화할 때 apply 메서드를 호출합니다. 클래스와 객체에서 모두 apply 메서드를 정의할 수 있습니다.

이전에 언급했듯이, unapply은 우리가 지정한 값을 추출하는 데 사용되며, apply의 작업과 반대입니다. 추출기 객체에서 match 문을 사용할 때, unapply이 자동으로 실행됩니다. 예를 들어:

object Test {
   def main(args: Array[String]) {
      
      val x = Test(5)
      println(x)
      x match
      {
         case Test(num) => println(x + "은" + num + "의 두 배!"
         //unapply이 호출됨
         case _ => println("계산할 수 없음")
      }
   }
   def apply(x: Int) = x*2
   def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}

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

$ scalac Test.scala 
$ scala Test
10
10 는 5 의 두 배!