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

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

<java />
trait Abstract { type T def transform(x: T): T val initial: T var current: T }
  • 타입멤버 (T), 메소드 (transform), val(initial), var(current)
<java />
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 }

 

1. 타입 멤버 (T)

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

  • type 키워드를 사용한다.

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

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

 

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

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

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

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

2. 추상 val

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

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

2.1. 추상 val vs 추상 메소드

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

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

<java />
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 로도 오버라이드 할 수 있다.

<java />
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 초기화

3. 추상 var

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

<kotlin />
trait AbstractTime { var hour: Int var minute: Int }

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

<kotlin />
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

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