[Scala] 상속과 인터페이스 trait

[원본 링크]

스칼라도 당연히 상속을 지원한다.
선언 키워드는 자바와 동일하게 extends다.

아래의 구조를 가진다.
class 자식명(매개변수...) extends 부모명(인자...)

extends를 하면서 자식 매개변수 중에서 인자를 보내, 부모 생성자를 호출한다는걸 유념하자.

아래는 사람의 정보를 기억하는 타입 Person을 정의하고, 추가로 학교정보를 기억하는 서브타입 Student를 정의한 조금 긴 예시다. image

image ArrayBuffer는 자바의 ArrayList나 c++의 vector 등에 해당하는 동적배열 컬렉션이다.
모아다가 for로 한번에 출력하려고 써봤다.


image

인터페이스**-트레잇**
oop언어답게 스칼라도 인터페이스를 제공한다. 다만 이름이 좀 다르다. 스칼라는 인터페이스를 트레잇이라고 부른다.
트레잇도 일반상속과 마찬가지로, extends로 상속받을 수 있다.

아래 코드는 print속성을 나타나는 트레잇 Printable을 구현하고, 상속받는 간단한 예시다. image

image 잘 돈다.

그리고 스칼라의 트레잇은 디폴트 구현도 가능하다. 그럼 하위클래스가 해당 메서드를 구현하지 않았을 경우 자동으로 적용해준다. image

image

여러개의 트레잇을 상속받고 싶다면, extends문 뒤에 with으로 이어붙일 수 있다. image

image


추상 클래스
추상클래스는 자바와 거의 동일하다. abstract class로 선언하고, 거의 클래스와 동일하게 정의할 수 있지만, 함수 몸체를 생략해서 추상 메서드로 만들 수 있다.
인터페이스처럼 자체적인 객체의 생성은 불가하다. image

image


상속 및 오버라이딩 봉인. final
클래스나 메서드에 final을 붙이면 재정의가 막혀버린다.


image

image 메서드에 쓰면 오버라이딩이 막히고


image

image 클래스에 쓰면 상속까지 봉인된다.


좀더 느슨한 재정의 봉인. sealed
sealed는 기본적으로 위의 final과 같은 방식으로 동작한다. 메서드에 걸면 오버라이딩이 막히고, 클래스에 걸면 상속이 막힌다.

다만 sealed는 final과 다르게, 같은 소스파일 내에서는 재정의가 된다.
그리고 메서드엔 못걸고 클래스에만 걸수가 있다.

아래는 그 간단한 예시다. image

image



참조
https://hamait.tistory.com/m/602