국비교육(22-23)

70일차(2)/Android App(14) : Kotlin Extend, Interface / inner class 사용하기

서리/Seori 2023. 1. 16. 21:44

70일차(2)/Android App(14) : Kotlin Extend, Interface / inner class 사용하기

 

- Kotlin에서의 상속Extend, Interface 생성 방법 익히기

- Kotlin에서 익명 이너클래스 만들기

- java 코드와 비교하기!

 

- 새 코틀린 클래스 생성

Step03_Extends

package com.example.kotlin_test

/*
    클래스 선언시 기본값을 상속을 받지 못하게 되어 있다.
    마치 java 에서  final class Phone{ } 처럼...
    상속을 받을수 있게 하려면 open 이라는 예약어를 붙여 준다.
 */
open class Phone{
    fun call(){
        println("전화를 걸어요")
    }
}

open class HandPhone : Phone(){
    fun mobileCall(){
        println("이동 중에 전화를 걸어요")
    }
    //재정의 가능한 메소드로 만들려면 open 예약어를 붙여야 한다.
    open fun takePicture(){
        println("100만 화소의 사진을 찍어요")
    }
}

class SmartPhone : HandPhone(){
    fun doInternet(){
        println("인터냇을 해요!")
    }
    override fun takePicture() {
        //super.takePicture()
        println("1000만 화소의 사진을 찍어요")

    }
}

fun main(){
    val p1=Phone()
    val p2=HandPhone()
    p1.call()

    p2.call() //Phone 클래스로부터 상속받은 메소드도 호출 가능
    p2.mobileCall()
    p2.takePicture()

    val p3=SmartPhone()
    p3.call()
    p3.mobileCall()
    p3.doInternet()
    p3.takePicture()

}

 

 

- 코틀린에서는 클래스 선언시 기본값이 상속을 받지 못하게 되어 있다.
- java 에서 final class Phone{ } 이라고 작성된 것과 비슷하다.
- 상속을 받을 수 있게 하려면 open 이라는 예약어를 붙여 준다

 

- 코틀린에서는 상속 가능한 클래스를 open 으로 표기한다.

 

-  : 클래스명() : 코틀린에서 클래스 상속시 표기법

- open을 메소드에도 붙여주어야 override가 가능하다.

 

- HandPhone() 은 Phone() 클래스를, 

  SmartPhone()은 HandPhone() 클래스를 상속받아서 만든 것!

 

- 상속하고 클래스 안에 커서를 놓고 alt+insert 하면 override할 수 있는 선택 창이나온다.

 

- 부모의 메소드( super.메소드명() ) 는 호출할 필요가 없으면 하지 않아도 된다.

- p3(SmartPhone type)는 Phone(), HandPhone()을 상속받았으므로 모든 메소드를 사용할 수 있다.

 


 

Step04_Interface

package com.example.kotlin_test

interface Remocon{
    fun up()
    fun down()
}
/*
    in java => implements Remocon
    in kotlin => Remocon
 */
class MyRemocon : Remocon{
    override fun up() {
        println("무언가를 올려요!")
    }

    override fun down() {
        println("무언가를 내려요!")
    }
}

fun main(){
    val r1=MyRemocon()
    r1.up()
    r1.down()
    /*
        in java

        Remocon r = new Remocon(){
            @override
            public void up(){}
            @override
            public void down(){}
        };

        in kotlin

        var r = object : Remocon{
            override fun up(){}
            override fun down(){}
        }
     */

    /*
        object : 클래스 정의(인터페이스를 구현하거나, 클래스를 상속받음)

        정의된 클래스로 객체를 생성해서 object 에 담는 느낌

        var object = 객체 생성
        var r2 = object
     */
    var r2 = object : Remocon{
        override fun up() {
            println("무언가를 올려요")
        }
        override fun down() {
            println("무언가를 내려요")
        }
    }

    r2.up()
    r2.down()
}

 

- Remocon 인터페이스 만들어주고

 MyRemocon 클래스에  : Remocon 으로 구현하기

- 인터페이스는 () 없이 인터페이스명만 넣어주면 된다. 

- 구현될 것을 전제로 만들어졌기 때문에 open이라는 예약어가 필요없다.

 

- 코틀린은 java 코드와 100% 호환된다.

- spring을 코틀린으로 코딩할 수도 있다!

 

- 타입 추론이 가능하기 때문에 Remocon 의 타입을 따로 넣을 필요는 없다.

- r1 상수를 만들어주면 up(), down() 메소드를 사용할 수 있다.

 

- java: 익명의 이너클래스를 이용해서 인터페이스의 참조값을 얻어내기 

 

- kotlin: object 라는 예약어를 사용한다.

 

- 파란색으로 예약어라고 나온다! 밑줄 쳐지는 부분에 alt+enter 하면 메소드 오버라이드 가능

 

- 익명의 이너클래스를 특이한 구조로 만든다.. 구조 익혀두기!

 

- 클래스 정의와 동시에 객체를 생성하고,

  그것을 object에 담아서 r2에 대입하는 것이라고 보면 된다.

 

 

object : 인터페이스명{

override하는 메소드

}

 

- 익명클래스를 통해서 참조값을 얻어낼 수 있다.

 

- remocon 인터페이스를 구현한 익명클래스가 이곳에 있다고 보면 된다.

- 콜론 우측에 클래스가 정의되어 있는데, 여기서 객체를 바로 생성해서 object에 담는다고 생각하면 된다.

- 이 object가 대입연산자에 담겨서 들어간다.