Skip to content

11. 다형성(오버로딩, 오버라이딩)

VintageAppMaker edited this page Jan 8, 2019 · 10 revisions

다형성을 구현하는 법

Kotlin에서 오버로딩과 오버라이딩은 다음과 같다

  • 선조 클래스에서 메소드와 필드를 open으로 정의한다.
  • 상속받은 클래스에서 override로 정의한다.
  • 오버로딩은 자바와 같다. 같은 이름의 다른 파라메터를 받는 메소드를 정의하면 된다.
  1. 소스코드

     fun main (args : Array <String>){
         var obj1 = baseClass()
         obj1.f1()
         var obj2 = childClass()
         obj2.f1()
         obj2.f2()
         obj2.f2("문자열 파라메터")
         obj2.f2("문자열 파라메터", 100)
     }
     
     // 간단한 클래스
     open class baseClass{
         // 상속받은 클래스에서 override 하려면 부모클래스에서 open으로 정의.
         open var name = "base"
         open fun f1() = println(this.toString())
         // 외부사용금지 .찍고 메소드 사용못함.
         private fun onlyMyFunc() = println("클래스내부에서만 사용")
         constructor(){
             onlyMyFunc()
         }
     }
     class childClass : baseClass(){
         override var name = ""
         override fun f1() = println(this.toString() + " 재정의함.")
         fun f2() = println("f2")
         // overloding
         fun f2(s : String ) = println("f2:$s ")
         fun f2(s : String, num : Int ) = println("f2: $s, $num ")
     }
    
  2. 디버깅 & 설명

  3. 왜 사용하는가?

kotlin은 자바와 달리 연산자 오버로딩을 지원한다. (operator로 정의. 이미 정의된 함수 오버로딩. plus, inc, dec, ...)

fun main(args : Array<String>){
    var s = Student("박모씨")
    (0..99).forEach {s++}
    s.printMe()

    var s2 = Student("김모씨")
    s2.nScore = 50

    println ( "두 학생의 점수는 ${s + s2}" )

}

class Student(s : String ){
    var name   : String = s
    var nScore : Int = 0

    operator fun plus( student : Student) : Int {
        return student.nScore + this.nScore
    }

    // ++ 변화된 객체를 넘겨야함.
    operator fun inc() : Student{
        this.nScore++
        return this
    }

    fun printMe () = println ("${name}는 점수가 $nScore")
 
}

  1. Android Studio에 적용하기

    
    
    
  2. 말실수

동영상에서 말실수

  • redeclation error인데 계속 redifine error라고 말하고 있음
Clone this wiki locally