아래의 글은 마틴 오더스키,렉스 스푼,빌 베너스 공저 / 오현석,이동욱,반영록 공역, 『Programming in Scala 3/e』,에이콘출판사(2017), CH01의 내용을 기반으로 작성하였습니다.
1. 전자우편 주소 추출
def isEMail(s: String) : Boolean
def domain(s: String) : String
def user(s: String) : String
2. 익스트랙터
object EMail { // 인젝션 injection 메소드 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(0)) else None } }
object EMail expends ((String, String) => String) {...}
unapply 메소드를 EMail을 익스트랙터로 바꿔준다.
val x: Any = ...
x match { case EMail(user, domain) => ... } |
인젝션 : EMail 안의 apply 메소드는 인젝션, 이 메소드는 인자를 몇가지 받아서 어떤 집합의 원소를 만들어냄
익스트랙션 : unapply 메소드는 어떤 집합에 속한 원소에서 여러 부분의 값을 뽑아내기 때문
케이스 클래스와 패턴 매치 사이의 관계를 시뮬레이션 한다.
익스트랙션만 있을 수는 있다.
하지만 상대성 원칙 (dual)에 맞춰 만들면, 좋은 설계
3. 변수가 없거나 1개만 있는 패턴
object Twice { def apply(s: String): String = s + s def unapply(s: String): Option[String] = { val length = s.length / 2 val half = s.substring(0, length) if (half == s.substring(length)) Some(half) else None } }
object UpperCase { def unapply(s: String): Boolean = s.toUpperScase == s }
def userTwiceUpper(s: String) = s match { case EMail(Twice( x @ UpperCase()), domain) => "dup match:" + x + " in domain " + domain case _ => "no match" } |
4. 가변 인자 익스트랙터
dom match { case Domain("org, "acm") => print("acm.org") case Domain("com", "sum", "java") => print("java.sum.com") case Domain("net", _*) => print("a .net domain") }
object Domain { def apply(parts: String*): String = parts.reverse.mkString("." def unapplySeq(whole: String): Option[Seq[String]] = Some(whole.split("\\.").reverse) }
def isTomInDotCom(s: String): Boolean = s match { case EMail("tom", Domain("com", _*)) => true case _ => false } |
기존 1개 변수 매치 성고시, 항상 고정된 숫자의 하위 원소만 반환,
스칼라에서는 가변 길이를 처리할 때, 다른 익스트랙션 메소드를 정의해 사용 , unapplySeq
5. 익스트랙서와 시퀀스 패턴
package scala
object List { def apply[T](elems: T*) = elems.toList def unapplySeq[T](x: List[T]): Option[Seq[T]] = Some(x) ... } |
6. 익스트랙터와 케이스 클래스
표현독립성 : representation independence : 익스트랙터를 사용하면 패턴과 그 패턴이 선택하는 객체의 내부 데이터 표현 사이에 아무런 관계가 없도록 만들 수 있음.
표현독립성은 케이스 클래스에 비교해 익스트랙터가 지닌 중요한 장점
케이스 클래스 : 설정하고 정의하기가 훨씬 쉽고, 코드도 적게 필요, 익스트랙터 보다 패턴 매치가 효과적으로 가능, 스칼라 컴파일러가 케이스 클래스의 매펀 매치를 익스트랙터의 패턴 매치보다 더 잘 최적화 함.
어떤 케이스 클래스가 sealed된 케이스 클래스를 상속하는 경우, 패턴 매치가 모든 가능한 패턴을 다 다루는지 스칼라 컴파일러가 검사해서 그렇지 않은 경우는 경고를 해 준다.
7. 정규표현식
스칼라는 자바에서 정규표현식을 가져왔다, 자바는 대부분을 펄에서 따왔다
스칼라의 정규 표현식 클래스는 import scala.util.matching.Regex
스칼라 raw 문자열 : val decimal = new Regex( " " " ( - ) ? (\d)(\.\d*)? " " ") or decimal = " " " ( - ) ? (\d)(\.\d*)? " " ".r
스칼라의 모든 정규표현식은 익스트랙터를 정의함.
'독서관련 > Programming in Scala' 카테고리의 다른 글
Scala CH29. 객체를 사용한 모듈화 프로그래밍 (0) | 2020.03.29 |
---|---|
Scala CH27. 애노테이션 (0) | 2020.03.29 |
Scala CH25. 스칼라 컬렉션의 아키텍처 (0) | 2020.03.29 |
Scala CH24. 컬렉션 자세히 들여다보기 (0) | 2020.03.29 |
Scala CH22. 리스트 구현 (0) | 2020.03.29 |