상속과 생성자
상속 : 클래스를 선언할 때 다른 클래스를 참조해서 선언하는 것을 말함
상속관계에서 상속 대상이 되는 클래스를 상위 클래스
상속받는 클래스를 하위 클래스
open class Super{
}
class Sub: Super(){
}
코틀린의 클래스는 기본적으로 다른 클래스가 상속할 수 없습니다.
만약 다른 클래스에서 상속할수 있게 선언하려면 open키워드를 사용하면 됩니다. 하위 클래스를 선언할 때는 이름 뒤에 콜론(:)을 입력하고 상속받을 상위 클래스 이름을 입력하면 됩니다.
open class Super(name: String){
}
class Sub1(name: String): Super(name){
// 주 생성자의 경우
}
class Sub2: Super{
// 보조 생성자의 경우
constructor(name: String): super(name){
}
}
상위 클래스를 상속 받은 하위 클래스의 생성자에서는 상위 클래스의 생성자에는 상위 클래스의 생성자를 호출해야 합니다. 매개변수가 있는 상위 클래스의 생성자를 호출할 때는 위 소스처럼 매개변수의 구성에 맞게 인자를 전달해야 합니다.
오버 라이딩 - 재정의
상속이 주는 최고의 이점은 상위 클래스에 정의된 멤버(변수, 함수) 하위 클래스에에서 자신의 멤버처럼 사용할수 있다는 것입니다. 그런데 때로는 상위클래스에 정의된 멤버를 하위클래스에서 재정의 해야될때 하위클래스에서 같은 이름으로 하위클래스에 다시 선언할 수 있습니다. 이것을 오버 라이딩이라고 합니다.
변수도 오버 라이딩을 할 수 있지만 대부분 함수를 오버 라이딩합니다.
같은 함수명으로 하위 클래스에서 새로운 로직을 추가하고 싶을 때 오버 라이딩을 사용합니다.
open class Super{
open var someData = 10
open fun someFun(){
print("Up:$someData")
}
}
class Sub: Super(){
override var someData = 20
override fun someFun(){
print("Down:$someData")
}
}
fun main(){
val obj = Sub()
obj.someFun() // Down:20
}
코틀린의 오버라이딩 규칙은 상위 클래스에서는 오버 라이딩할 멤버를 위 소스처럼 open키워드를 선언문 앞에 추가하고 하위 클래스에서 재정의 할 때 반드시 선언문 앞에 override키워드를 써줘야 합니다. 이렇게 하지 않으면 오버 라이딩을 할 수 없습니다.
접근 제한자
접근 제한자란 클래스의 멤버를 외부의 어느 범위까지 이용하게 할 것인지를 경정하는 키워드입니다.
접근 제한자 | 최상위에서 이용 | 클래스 멤버에서 이용 |
public | 모든 파일에서 가능 | 모든 클래스에서 가능 |
internal | 같은 모듈 내에서 가능 | 같은 모듈 내에서 가능 |
protected | 사용 불가 | 상속관계의 하위 클래스에서만 가능 |
private | 파일 내부에서만 이용 | 클래스 내부에서만 이용 |
open class Super{
var publicData = 10
protected var protectedData = 20
private var privateData = 30
}
class Sub: Super(){
fun someFun(){
publicData++ //성공
protectedData++ //성공
privateData++ //실패
}
}
fun main(){
val obj = Sub()
obj.publicData++ //성공
obj.protectedData++ //실패
obj.privateData++ //실패
}
public은 접근 제한이 없음을 나타냅니다. 코틀린에서는 변수, 함수, 생성자 등을 선언할 때 접근 제한자를 생략하면 public이 디폴트입니다.