-
코틀린 인터페이스
- 코틀린 인터페이스 안에는 추상 메소드뿐 아니라 구현이 있는 메소드도 정의할 수 있음(자바의 디폴트 메소드랑 비슷)
- 하지만 인터페이스에는 아무런 상태(필드)도 들어갈 수 없다
- Clickable 인터페이스를 정의해서, Button 클래스에서 click 메서드를 오버라이드 했음
- 이 인터페이스를 구현하는 모든 비추상 클래스는 click에 대한 구현을 제공해야 함
- 자바에서는 extends와 implements 키워드를 사용하지만, 코틀린에서는 클래스 이름 뒤에 콜론(:)을 붙이고 인터페이스와 클래스 이름을 적는 것으로 클래스 확장과 인터페이스 구현을 모두 처리함
- 인터페이스는 개수 제한 없이 마음대로 구현할 수 있지만, 클래스는 오직 하나만 확장할 수 있음
- 자바에서는 @override를 꼭 붙이지 않아도 되지만, 코틀린에서는 override 변경자를 반드시 붙여야 함
- Button 클래스는 Clickable 인터페이스와 Focusable 인터페이스를 함께 구현함
- 디폴트 구현이 있는 것은 따로 구현해도 되고 안해도 됨
- 동시에 있는 showOff 메서드는 안에 상위 클래스별로 구현을 함
open, final, abstract 변경자
- 자바의 클래스와 메소드는 기본적으로 상속에 대해 열려있지만 코틀린의 클래스와 메소드는 기본적으로 final임
- 어떤 클래스의 상속을 허용하려면 클래스 앞에 open 변경자를 붙여야 함, 그와 더불어 오버라이드를 허용하고 싶은 메소드나 프로퍼티의 앞에도 open 변경자를 붙여야함
- 아무것도 붙이지 않는다면 기본적으로 final, 하위 클래스가 이 메소드를 오버라이드 할 수 없음
- open을 붙였다면 이 메소드는 하위 클래스에서 오버라이드 할 수 있음
- override한 메소드는 기본적으로 열려있음. 하위 클래스에서 오버라이드 가능
- final override가 붙는다면 오버라이드 할 수 없음
- abstract로 선언한 추상 클래스는 인스턴스화 할 수 없음
- 추상 클래스에는 구현이 없는 추상 멤버가 있기 때문에 하위 클래스에서 그 추상 멤버를 오버라이드해야만 함
- 추상 멤버는 항상 열려있기 때문에 open을 붙이지 않아도 됨
- 추상 클래스에 속해있더라도 비추상 함수는 기본적으로 파이널이기 때문에 오버라이드를 원한다면 open을 붙여야함
가시성 변경자
- 가시성 변경자는 코드 기반에 있는 선언에 대한 클래스 외부 접근을 제어함
- 어떤 클래스의 구현에 대한 접근을 제한함으로써 그 클래스에 의존하는 외부 코드를 깨지 않고도 클래스 내부 구현을 변경할 수 있음
- 기본적으로 코틀린에도 public, protected, private 변경자가 있음
- 하지만 코틀린의 기본 가시성은 public, 자바의 기본 가시성은 package-private