본문 바로가기
개발/SCALA

Case class [펌]

by 로그인시러 2017. 7. 25.

스칼라는 케이스 클래스 문법을 지원한다. 케이스클래스는 다음과 같은 일반적인 클래스이다.

  • 기본적으로 불변이다.
  • 패턴 매칭에 따라 분리될 수 있다.
  • 레퍼런스 대신 구조적 동일성에 의해 비교된다.
  • 간결하게 초기화 되고 사용될 수 있다.

예제를 살펴보자. Notification 추상 클래스가 슈퍼클래스와 각 구현 클래스 Email, SMS, VoiceRecording이다.

abstract class Notification
case class Email(sourceEmail : String, title : String, body : String) extends Notification
case class SMS(sourceNumber : String, message : String) extends Notification
case class VoiceRecording(contactName : String, link : String) extends Notification

케이스 클래스를 초기화하는 것은 매우 단순하다. new 키워드를 쓸 필요가 없다는 점에 주의하자. 

val emailFromTodd = Email("todd@daum.net", "Greeting", "Hello world")

val title = emailFromTodd.title;
println(title)

케이스 클래스 생성자의 파라미터는 public으로 취급되며 직접 접근이 가능하다. 케이스 클래스에서는 필드를 직접변경할 수 없다. 대신에 copy메소드를 통해 새로운 객체를 생성할 수 있다.

val editedEmail = emailFromTodd.copy(title = "Greeting!", body = "Hello world")
println(editedEmail.title)

모든 케이스클래스에 대해 스칼라 컴파일러는 structural 동일성을 구현한 equals 메소드를 생성하고 toString 메소드를 생성한다.

val firstSms = SMS("12345", "Hello")
val secondSms = SMS("12345", "Hello")

if (firstSms == secondSms)
println("They are equal.")

케이스 클래스에서는 패턴 매칭을 활용해 데이터 처리를 할 수 있다. 다음 함수는 전달된 Notification 타입에 따라 다른 방식으로 메시지를 출력하는 예제이다. 

def showNotification(notification: Notification) : String = {
notification match {
case Email(email, title, _) =>
"You got an email from " + email + " with title " + title
case SMS(number, message) =>
"You got an SMS from " + number + "! Message: " + message
case VoiceRecording(name, link) =>
"You received a Voice Recording from " + name + "! Click the link to hear it: " + link
}
}

스칼라에서 프로그래밍을 할 때 데이터를 모델링하거나 그룹핑하기 위해서 case 클래스를 사용하면 더 효과적이고 유지보수하기 쉬운 코드를 생성할 수 있다.

  • 불변성은 언제 어디서 데이터가 변경되는지를 따라가지 않아도 되게 한다.
  • 값에 의한 비교는 객체를 프리미티브 값처럼 비교할 수 있게 해준다. - 클래스의 비교가 값에 대한 것인지 참조에 대한 것인지에 대한 불확실성을 제거한다.
  • 패턴 매칭을 분기로직을 단순화하여 버그가 적고 더 읽기 쉬운 코드를 작성할 수 있도록 해준다.


출처 : http://opennote46.tistory.com/232

'개발 > SCALA' 카테고리의 다른 글

함수형 프로그래밍 [펌]  (0) 2017.04.19
under score 정리 [펌]  (0) 2017.03.28

댓글