2. 트레이트란?
자바의 인터페이스기능을 확장한 개념.
스칼라에서 클래스는 1개만 상속 트레이트는 다중상속
메소드와 필드 구현을 할 수 있다.
레이어링을 통하여 상속관계의 트레이트를 호출 할 수 있다.
인스턴스를 생성할 때에 트레이트를 추가할 수 있다.
13. Trait 생성 순서
1. 슈퍼클래스 생성자
2. 트레이트 생성자
왼쪽에서 오른쪽 순서대로 실행
각 트레이트에서 부모가 먼서 생성
여러 트레이트가 공통의 부모를 공유하면, 중복해서 생서하지는 않음.
3. 클래스의 생성자
4. 서브 클래스 생성자
14. 추상필드 초기화
Trait생성 순서에 따라 뒤에서 선언하게 되면 CompileErr가 난다.
따라서 앞에서 미리 선언하거나, Lazy를 통하여 우회하면 된다.
15. 클래스 확장
드물게 Class를 확장하는 Trait이 있다.
해당 Trait을 확장하는 Class는 Trait의 Super Class가 Super Class가 된다.
Class를 확장하는 Trait을 상속받는 Trait/Class에 또다른 클래스를 상속 받을수
있다.
단, 이때는 서로 부모자식 관계로 이어져야 한다.
16. Trait 셀프 타입
This:[type] => 로 시작
[type]을 상속한 클래스만 해당 Trait을 상속받을수 있음.
[type]대신 구조적 타입을 지정할 수 있음.
17. Trait, JVM에서는 어떤일이…
Trait -> Java Interface로 변환된다.
구현이 있는 Trait은 해당 메서드를 Companion Class에서 Static으로 정의된다.
필드는 추상 getter/setter로 대체된다.