20장 abstract members - codeport/scala GitHub Wiki
20장 Abstract Type
Abstract val
- 
parameterless method & val - 
def, val의 override 관계 정리 
- 
parameterless method는 side effect가 없다고 가정한다. 
- 
참고: Intellij Scala Plugin 업데이트 내용 中 String.length, String.hashCode, String.trim has no side effects, so it’s always completing without unnecessary, annoying parentheses. 
 
- 
- 
trait의 초기화 - class A extends aTrait
- trait가 먼저 초기화됨
- class parameter는 생성자로 건네지기 전에 평가
- abstract val은 superclass 초기화 후 평가됨
 
- 해결 방법
- pre-initialized field
- lazy vals
 
 
Abstract Types
- Animal - Food 예제
- 19장 covariant설명 에서 본
ArrayStoreException과 유사한 상황 발생
- 생각해볼 필요 있음
 
- 서브클래스에 맞는 타입을 각각 정의해서 써야하는 상황
- Polymorphism으로 해결하려는 설계 시도 자체가 잘못
- 서브클래스에 맞는 하나의 타입을 줘야하는
 
- Parameterized Type과 유사
- 생성 시 전달하는 것과 클래스 정의 시점의 차이
 
 
- 19장 covariant설명 에서 본
ArrayStoreException과 유사한 상황 발생
Path-depenent Type
- path: path to an object
- 주된 이유는 inner object가 outer object를 가리켜야 하기 때문
Structural subtyping
- 
예시: close 메서드를 갖는 type에 대해 수행 - def using[T <: {def close():Unit }] (obj:T) { obj.close }
 
Enumerations
- 
다른 언어와는 달리 Scala 에서는 라이브러리로 제공됨 object MyEnum extends Enumeration { val One = Value val Two = Value }- Value는 inner class의 instance를 반환
- MyEnum.One.id == 0
 
- 
인자로 전달할 경우 class LevelInfo ( val enumArg:MyEnum.Value) { //... }
- 
Value는 Path-dependent Type임 
- 
실습 제안 - 동서남북에 기타 내용(각도)을 같이 포함하는 enumeration을 만들어 보자: 이건 누가 할까?