Scala CH15. 케이스 클래스와 패턴 매치
아래의 글은 마틴 오더스키,렉스 스푼,빌 베너스 공저 / 오현석,이동욱,반영록 공역, 『Programming in Scala 3/e』,에이콘출판사(2017), CH01의 내용을 기반으로 작성하였습니다.
abstract class Expr case class Var(name: String) extends Expr case class Number(num: Double) extends Expr case class UnOp(operator: String, arg: Expr) extends Expr case class BinOp(operator: String, left: Expr, right: Expr) extends Expr
def simplifyTop(expr: Expr) : Expr = expr match { case UnOp("-", UnOp("=", e) => e case BinOp("+", e, Number(0)) => e case BinOp("*", e, Number(1)) => e case _ => expr }
match는 자바의 switch와 비슷 스칼라의 매치는 표현식으로 그 식은 결과 값을 내놓는다. 스칼라 대안 표현식은 다음 케이스로 빠지지 않는다 매치에 실패하면 에러 발생
상수 패턴 : contant pattern 변수만을 사용한 패턴 : variable pattern 와일드카드 패턴 : wildcard pattern 생성자 패턴 : constructor pattern
봉인된 클래스 : sealed case classed match 마지막에 디폰트를 넣지만 이는 합리적인 디폴트 동작이 있을 때만이고, 그런 동작이 없다면, 어떻게 하면 모든 가능성을 다 처리했다고 안심할까? match 식에서 놓친 패턴 조합이 있다면 컴파일러에게 찾도록 도움 요청
케이스의 클래스의 슈퍼 클래스를 봉인된 케이스로 만드는 것 그 클래스와 같은 파일이 아닌 다른 곳에서 새로운 서브 클래스를 만들수 없다. sealed abstracrt class Expr
Option 타입 있으면 Some(x) 형태로 값이 있고 없으면 None 반환
부분함수
|