memostack
article thumbnail
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형

트레이트에 추상 멤버를 정의한다.

trait Abstract {
  type T
  def transform(x: T): T
  val initial: T
  var current: T
}
  • 타입멤버 (T), 메소드 (transform), val(initial), var(current)
class Concrete extends Abstract {
  type T = String
  override def transform(x: String): String = x + x
  override val initial: T = "hi"
  override var current: String = initial
}

 

타입 멤버 (T)

스칼라에서 추상 타입은(abstract type) 클래스나 트레이트의 멤버로 정의없이 선언만된 타입이다.

  • type 키워드를 사용한다.

스칼라에서는 추상 타입은 항상 어떤 클래스나 트레이트의 멤버이다.

trait Abstract {
  type T  // 항상 트레이트나 클래스의 멤버다.
  def transform(x: T): T
  val initial: T
  var current: T
}

 

타입 멤버를 쉽게 생각해서 타입에 대한 별칭(alias)이라고 생각하면 된다.

타입 멤버를 사용하는 이유?

실제 이름이 너무 길거나 의미가 불명확할 때, 더 간단하고 의도를 명확하게 전달할 수 있다.

타입 멤버의 세부 내용 > 2020/02/23 - [Language/Scala] - Scala 추상 타입 (type T)

추상 val

val initial: String // 값은 지정하지 않는다.

추상 val은 이름과 타입은 있지만 값은 지정하지 않는다.

추상 val vs 추상 메소드

추상 val: 사용할 때마다 같은 값을 얻을 수 있다.

추상 메소드(def): 사용할 때마다 같은 값을 가질 수 있다는 보장이 없다.

class Concrete extends Abstract {
  type T = String
  override def transform(x: String): String = x + x // x 에 따라 값이 달라진다.
  override val initial: T = "hi" // 항상 "hi" 라는 값으로 동일하다.
  override var current: String = initial
}

 

def 는 변할 수 있기 때문에 valdef로 오버라이드 할 수 없다.

val 은 변하지 않기 때문에 def 로도 오버라이드 할 수 있다.

abstract class Fruit {
  val v: String // value의 v
  def m: String // method의 m
}

abstract class Apple extends Fruit {
  override val v: String
  override val m: String // def 를 val 로 override 가 가능하다.
}

abstract class BadApple extends Fruit {
  override def v: String // 오류. val 은 def 로 오버라이드 할 수 없다.
  override def m: String
}

val은 def로 오버라이드 할 수 없다.

추상 val 초기화하는 방법 > 2020/02/23 - [Language/Scala] - Scala 추상 val 초기화

추상 var

추상 val 과 마찬가지로 이름과 타입만 사용한다.

trait AbstractTime {
  var hour: Int
  var minute: Int
}

차이점은 GetterSetter를 만들어준다. 위 AbstractTime 은 아래 코드와 동일하다.

trait AbstractTime {
  var hour: Int // Getter
  var hour_=(x: Int) // Setter
  var minute: Int // Getter
  var minute_=(x: Int) // Setter
}
반응형

'Language > Scala' 카테고리의 다른 글

Scala의 열거형(Enumeration type)  (0) 2020.02.23
Scala 추상 타입 (type T)  (0) 2020.02.23
Scala 추상 val 초기화  (0) 2020.02.23
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
profile

memostack

@bluemiv_mm

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!