코틀린_OOP_상속

소정·2023년 3월 21일
0

Kotlin

목록 보기
4/27

상속

부모

코틀린은 아무것도 안쓰면 기본 final (오버라이드 불가)
open 키워드가 있어야 상속 가능해짐

자식이 오버라이드할 메소드 또한 open 키워드 붙여줘야한다!

자식

extends 키워드 -> : 으로 변경
상속하는 클래스명 옆에 반드시 생성자 호출문 '( )' 명시되어야한다!!

오버라이드할 메소드에 override라고 명시해줘야함 써줘야함
부모의 메소드 기능 받는 super 키워드 써서 쓴다

package com.bsj0420.ex01kotlinhello

fun main() {

    //1.코틀린의 상속
    var obj:Second = Second()
    obj.a= 500
    obj.b= 200
    obj.show()
}

//First를 상속하는  클래스
//상속 문법이 extends => : 으로 바뀜
//상속하는 클래스명 옆에 반드시 생성자 호출문 명시되어야한다!!
class Second : First(){
    // First의 멤버 a, show() 보유한 상태

    var b:Int = 20
    
    //상속받은 show메소드 기능 개선 - override
    //코틀린은 반드시 override라고 명시해줘야함 써줘야함
    //또한 부모에 오버라이메소드에고 open 햐줘야함 (기본이 final이라서)
    override fun show(){
        super.show()
        println("b : $b")
    }
}


//상속해줄 클래스
//코틀린은 아무것도 안쓰면 기본 final임 - 오버라이드 불가
//open 키워드가 있어야 상속 가능해짐
open class First {
    var a:Int = 10

    //open 해줘야 자식에서 오버라이딩 할 수 있다
    open fun show(){
        println("a : $a")
    }
}



업캐스팅, 다운캐스팅

as : 다운캐스팅 현변환 연산자

다운 캐스팅 형변환 키워드 : as

자바에서는 형변환 하려는 클래스 앞에 (자식 클래스) 를 붙여줌

package com.bsj0420.ex01kotlinhello

fun main() {

    //2.업캐스팅, 다운캐스팅
    //부모자식 관계일 때
    var f:First = Second() //up casting
    //찾을 수는 있지만 Second()의 것은 쓸수 없음
    f.show() //실제 참조하는 객체의 show가 호출 : 다형성
    println()

    //b의 값을 쓰고 싶으면
    //var s:Second = f // error - down casting
    var s:Second = f as Second // 형변환 연산자 as
    s.b = 500
    s.a = 600
    s.show()

}

//First를 상속하는  클래스
//상속 문법이 extends => : 으로 바뀜
//상속하는 클래스명 옆에 반드시 생성자 호출문 명시되어야한다!!
class Second : First(){
    // First의 멤버 a, show() 보유한 상태

    var b:Int = 20
    
    //상속받은 show메소드 기능 개선 - override
    //코틀린은 반드시 override라고 명시해줘야함 써줘야함
    //또한 부모에 오버라이메소드에고 open 햐줘야함 (기본이 final이라서)
    override fun show(){
        super.show()
        println("b : $b")
    }
}


//상속해줄 클래스
//코틀린은 아무것도 안쓰면 기본 final임 - 오버라이드 불가
//open 키워드가 있어야 상속 가능해짐
open class First {
    var a:Int = 10

    //open 해줘야 자식에서 오버라이딩 할 수 있다
    open fun show(){
        println("a : $a")
    }
}

상속 마무리 연습

Person.claaa

package com.bsj0420.ex01kotlinhello

open class Person constructor(var name:String, var age:Int){
    //멤버변수 만들면서 매게변수까지 만든 것

    //상속과 오버라이드를 위해 open

    init {
        println("create Person instance")
    }

    open fun show(){
        println("name : $name    age : $age")
    }
}


Student.class

package com.bsj0420.ex01kotlinhello

//이미 상속해 주는 Person 클래스에 name, age 프로터티가 존재함
//따라서 주 생성자에서 또 name,age 트로퍼티 만들면 안된다 (-> var 붙이면 오버라이드 되어버림)
//그러니 그냥 매개변수로 name과 age 받기
open class Student constructor(name:String, age:Int, var major:String) : Person(name, age){
    //name:String, age:Int 는 이미 상속받은 것에 있으니 부모걸 받으면 됨 (매개변수로)
    // major 만 매개변수이면서 멤버변수로 만들어 주면됨


    init {
        println("ceate Student instance")
    }

    //override 키워드가 붙은 메소드는 기본 open메소드임!! 
    //따라서 추가로 open 쓰지 않는다
    override fun show() {
        //super.show
        println("name: $name    age: $age    major:$major")
    }
    
}

Professor.class

  • 보조 생성자를 이용하여 상속 받아보기
package com.bsj0420.ex01kotlinhello

//보조 생성자를 이용하여 상속 받기
//보조 생성자를 이용할 때 부모 클래스의 주 생성자를 호출() 을 쓰지 않는다

class Professor : Person {

    //교수 만의 고유 멤버면수 만들기
    var subject:String? = null //nullabel 변수로 만들어주기

    //보조 생성자 만들기
    //보조 생성자를 사용하면 부모 클래스의 생성자를 이곳에서 호출한다 : super()
    constructor(name:String, age:Int, subject:String):super(name, age) {
        this.subject = subject
        println("create Prefessor instance")
    }

    override fun show() {
        //super.show()
        println("name : $name   age: $age   subject: $subject")
    }
    
}

AlbaStudent.class

package com.bsj0420.ex01kotlinhello

// 주 생성자의 constructor 키워드 생략
class AlbaStudent(name:String, age:Int, major:String, var task:String):Student(name,age,major) {

    init {
        println("create AlbaStident instance")
    }

    override fun show() {
        //super.show()

        println("name: $name    age: $age    major:$major    task: $task")
    }

}

출력

package com.bsj0420.ex01kotlinhello

fun main() {
    //상속 마무리 연습
    //일반, 교수, 학생, 근로학생의 멤버를 상속 받아 객체 생성

    var p = Person("sam",26)
    p.show()

    println()

    var s = Student("robin",23,"java")
    s.show()
//    create Person instance
//    ceate Student instance
//    name: robin    age: 23    major:java
    //상속받은 Person의 생성자도 호출되고 있음을 보자
    println()

    var ps = Professor("kim", 48, "mobile optimization")
    ps.show()
    println()

    var abStu = AlbaStudent("lee",27,"ios","pc Management")
    abStu.show()

}

profile
보조기억장치

0개의 댓글