KOTLIN 객체지향 프로그래밍(2)

도니·2022년 9월 21일
0

KOTLIN 객체지향 프로그래밍

클래스를 재사용하는 상속

✅ 상속과 생성자

- 코틀린에서 어떤 클래스를 상속받으려면 선어부에 콜론(:)과 함께 상속받을 클래스 이름을 입력

- 코틀린의 클래스는 기본적으로 다른 클래스가 상속할 수 없음

- 다른 클래스에서 상속할 수 있게 선언하려면 open 키워드 사용

- 상위 클래스를 상속받은 하위 클래스의 생성자에서는 상위 클래스의 생성자를 호출

// 상속
// 부모클래스 -> open 키워드 사용
// 자식클래스 -> 변수에 타입을 지정하듯이 클래스명 : 부모클래스를 명시해준다.
open class Super(name: String){
    init {
        println("부모 클래스 생성")
    }
}
class Sub(name: String):Super(name){
    init{
        println("자식 클래스 생성")
    }
}

// 자식 클래스에 보조 생성자만 있는 경우
class Sub2:Super{
    constructor(name: String):super(name){
        println("자식 클래스 생성2")
    }
}

✅ 오버라이딩 - 재정의

- 상속이 주는 최고의 이점은 상위 클래스에 정의된 멤버(변수, 함수)를 하위 클래스에서 자신의 멤버처럼 사용할 수 있는 것

- 상위 클래스에 선언된 변수나 함수를 같은 이름으로 하위 클래스에서 다시 선언하는 것을 오버라이딩이라고 함

// 오버라이딩 (재정의)
open class Super2{
    // 변수에 open 키워드를 이용하여 작성해야 자식클래스에서 오버라이드 받을 수 있다.
    open var superData = 10
    open fun testFun(){
        println("부모클래스의 함수 호출 : ${superData}")
    }
}

class Sub3:Super2(){
    // override var superData = 20 -> 부모 클래스의 맴버가 open 상태가 아니라서 에러
    // override 키워드를 이용하여 부모 클래스의 맴버(변수, 함수)를 재정의
    override var superData = 20
    override fun testFun(){
        println("자식 클래스의 함수 호출 : ${superData}")
    }
}

fun main(){
    val sub2 = Sub2("sik2")
    val sub3 = Sub3()
    println(sub3.superData)
    sub3.testFun()
}

✅ 접근 제한자

- 접근 제한자란 클래스의 멤버를 외부의 어느 범위까지 이용하게 할 것인지를 결정하는 키워드

// 접근제한자
// public, internal, protected, private
// 최상단에서 선언할 경우
/*public var pub = 1 // 모든 파일에서 접근이 가능(public 키워드 생략가능)
internal var inter = 2 // 같은 모듈 내에서 접근이 가능
private var pri = 3 // 해당 파일 내부에서만 접근이 가능
//protected var pro = 4  최상단에서 작성 안됨*/

open class Public{
    // 클래스 내부에서 선언한 경우
    open public var pub2 = 1  // 모든 클래스에서 사용 가능
    open internal var inter2 = 2  // 같은 모듈 내에서 접근 가능
    private var pri2 = 3  // 클래스 내부에서만 이용가능
    open protected var pro = 4  // 상속 관계의 하위(자식)클래스 에서만 사용가능
}

class Child:Public(){
    override var pub2 = 5
    override var inter2 = 6
    override var pro = 7
}

fun main(){
    var child = Child()
    println(child.inter2)
    println(child.pub2)
    //child.pro
}
profile
내가 보려고 만든 벨로그

0개의 댓글