수업내용

20230731 Kotlin

titlejjk 2023. 8. 1. 09:40

Kotlin에서 모든 Class는 기본적으로 final Class를 가진다.

 

만약 하나의 Class를 상속받거나 하려면 open이라는 예약어를 사용하면 된다.

이렇게 오류가 나지만

 

Phone Class에 open을 붙여주면

오류가 사라진다.

 

package com.example.hellokotlin

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

class HandPhone : Phone(){ //Phone 클래스를 상속 받기
    fun mobileCall(){
        println("이동중에 전화를 걸어요!")
    }
}

 

아래 코드는 Phone 클래스를 상속 받은 클래스로 생성한 객체이기에 2개의 메서드를 모두 사용할 수 있는 코드이다.

 

 

Kotlin에서 인터페이스만들기

 

Class자리에 interface라는 예약어를 넣어주면된다.

//Kotlin에서 인터페이스 만들기

interface Remocon{

    fun up()
    fun down()

}

 

Java에서는 인터페이스를 구현하기 위해 Implement를 사용했지만 Kotlin에서는 " : " 을사용해 인터페이스를 구현한다.

 

package com.example.hellokotlin

//Kotlin에서 인터페이스 만들기

interface Remocon{

    fun up()
    fun down()

}

//인터페이스를 구현한 클래스 만들기

class MyRemocon : Remocon{
    override fun up() {
        TODO("Not yet implemented")
    }

    override fun down() {
        TODO("Not yet implemented")
    }

}

 

클래스를 정의함과 동시에 객체를 생성하는 것이 object키워드 이다.

 val r2:Remocon = object : Remocon{
        override fun up() {
            TODO("Not yet implemented")
        }

        override fun down() {
            TODO("Not yet implemented")
        }
    }

 

추상 클래스 AbstractClass

 

//추상 클래스 => abstract 예약어를 이용해서 만든다.
abstract class Weapon {
    
   fun move(){
       println("이동합니다.")
   }
    //추상 메서드 역시 abstract 예약어를 이용해서 만든다.
    abstract fun attack()
  
}
class MyWeapon : Weapon(){
    override fun attack() {
        println("무언가를 공격해요!")
    }

}

 

Java랑 별로 다를 것이 없다.

 

Kotlin의 다형성

 

 //다형성
    val w3 = MyWeapon() //w3에는 MyWeapon객체의 참조값이 들어 있다.
    
    val a:MyWeapon=w3 //w3는 당연히 MyWeapon type이다.
    val b:Weapon=w3 //w3는 Weapon type이기도하다.
    val c:Any=w3 //Any type은 Java에서 Object type에 해당되는 type이다.

 

여기서 중요한건 Any type인데 어떤타입의 변수라도 담을 수 있다.

 

 var d:Any = 10
    d = true
    d = "kim"
    d = w3

 java에서 
    class Util{
        public static int number = 10
        public String version = "1.0"
        public static void get(){}
        public void send(){}
        
    }
    가 있을 때 send라는 메서드를 호출하기 위해서는
    new Util().send();로 호출해야한다.
    version 객체는
    new Util().version;
    static인 int number객체는
    Util.number
    그리고 get을 호출하려면(static)
    Util.get();이런 식으로 호출한다.
    
    Kotlin은 그럼 어떤 식으로 호출이 가능할까?
    먼저 Kotlin에는 static이라는 예약어는 없다.

이럴때는 Kotlin에 있는 companion object(동반객체)를 사용하면된다.

class Util{
    //Util클래스와 함께하는 동반객체
    companion object{
        //동반객체의 필드와 메서드(함수)를 정의하면 된다.
        val version:String="1.0"
        fun send(){
            println("전송합니다")
        }
    }