인터페이스
자바에서의 인터페이스 사용방식과 유사하고, default method 또한 가능하다.
- syntax
interface
로 선언- 구현 클래스 뒤에
:(인터페이스이름)
을 사용하여 구현(implement) override fun (인터페이스에 구현되어 있지 않은 메서드)
로 메서드 오버라이드- default method의 경우 특별한 키워드 없음.
super<인터페이스>.메소드_이름
: 상위 인터페이스의 메서드를 호출
- 여러 개의 상위 인터페이스를 구현할 때 같은 메서드가 존재하는 경우?
- —> 자바와 마찬가지로 컴파일 에러가 나서 오버라이딩 메서드를 제공해야함.
open
, final
, abstract
변경자
final이 default로, 상속 및 오버라이딩이 금지되어있다. open
을 통해 상속이나 오버라이드를 허용할 수 있다.
💡 `final`과 스마트 캐스트는 type 검사 후 변경할 수 없는 변수에만 적용이 가능하다. val 변수이고, 커스텀 접근자가 없는 경우에 가능하다. 또한 다른 클래스가 상속받으면서 커스텀 접근자를 정의하면 스마트 캐스트가 깨지기 때문에 `final` 로 상속이 불가능해야한다.
abstract
: 자바와 동일. 반드시 자식 클래스에서 오버라이딩 해야함.
가시성 변경자
public 이 default이고, 자바와 다르게 패키지 전용(default)가 없다.
internal
: 모듈 내부에서만 볼 수 있는 제어자- 모듈의 단위란? 컴파일 되는 단위. ex. gradle이 실행되는 하나의 프로젝트
protected
: 자바와 다르게 protected인 클래스와 상속한 자식 클래스에서만 보임.- 자바의 protected는 같은 패키지 내에서 접근할 수 있음.
private
: 같은 클래스 안에서만 볼 수 있음.
중첩 클래스
Java와 다르게 중첩 클래스는 바깥쪽 클래스 인스턴스에 대한 접근 권한이 없다.
- 중첩 클래스 : 바깥 클래스에 대한 참조를 저장하지 않음
- 내부 클래스(inner class) :
this@<바깥 클래스 명>
- 외부 클래스의 속성을 사용
class Outer {
var text = "Outer Class"
class Nested {
fun introduce() {
println("Nested Class")
// Outer 클래스에 대한 참조를 저장하지 않음.
// println(this@Outer.text)
}
}
inner class Inner {
var text = "Innter Class"
fun introduceInner() {
println(text)
}
fun introduceOuter() {
println(this@Outer.text)
}
}
}
fun main() {
Outer.Nested().introduce()
// Outer 객체가 없으면 inner 객체도 만들 수 없음.
val outer = Outer()
val inner = outer.Inner()
inner.introduceInner()
inner.introduceOuter()
outer.text = "Changed Outer Class"
inner.introduceOuter()
}
'Java&Kotlin' 카테고리의 다른 글
[Kotlin] Collection 의 크기가 작은 경우 Sequence 가 성능이 더 떨어질 수 있는 이유 (0) | 2022.10.10 |
---|---|
[Kotlin] 제네릭스 (0) | 2022.05.21 |
[JAVA] HashMap,HashSet에서 Object를 key로 가지는 경우 get() (0) | 2022.03.11 |
[JAVA] 제너릭 타입으로 배열을 만들 수 없는 이유 (타입 추론) (0) | 2022.03.09 |