본문 바로가기
IoT 디바이스 활용/Kotlin

Kotlin - 객체지향 프로그래밍 - 클래스와 상속, overloading, override, Interface, abstract, static, object, data class

by cooluk 2020. 10. 20.

Kotlin 객체지향 프로그래밍

클래스와 상속

image-20201016103541721

image-20201016103614551


ex01_class.kt

package oop

// class passwd(변수명: 데이터형, ..){} 으로 생성자를 만들어쓰기도 한다.
class TestClass{
    var name : String = "";

    // 기본 생성자
    constructor(){
        println("기본생성자");
    }
    // 오버로딩된 생성자
    constructor(name : String ){
        this.name = name;
        println("$name 을 입력받은 생성자");
    }
}

// kotlin에서는 기본적으로 상속이 거부되어 있다.
// 선조클래스를 open으로 지정해야 한다.
open class ParentClass {
    var name : String = this.toString(); // __str__(self)와 같다.
    fun getMyName() : String = name;
}

// 상속받을 떄는 선조클래스를 "class passwd : 선조클래스명(생성자인자){}"
// 형식으로 해야 한다.
class ChildClass : ParentClass(){
}

fun main(args : Array<String>){
    var obj1 = TestClass();
    var obj2 = TestClass("파라메터 받음.");

    var obj3 = ParentClass();
    println( obj3.getMyName() );

    var obj4 = ChildClass();
    println( obj4.getMyName() );
}

image-20201016103918184




overloading, override

image-20201016111804184


ex02_polymorphism.kt

package oop

open class baseClass{
    // 상속받은 클래스에서 오버라이드하려면 선조클래스에서 open으로 정의.
    open var name = "base";
    open fun func1() = println(this.toString());

    // 외부사용금지 .찍고 메소드 사용못함.
    private fun onlyMyFunc() = println("클래스내부에서만 사용");
    constructor(){
        onlyMyFunc();
    }
}

class childClass : baseClass(){
    override var name = "";
    override fun func1() = println(this.toString() + " 재정의함.");
    fun func2() = println("func2");

    // overloding
    fun func2(s : String ) = println("func2:$s ");
    fun func2(s : String, num : Int ) = println("func2: $s, $num ");
}

fun main(args : Array<String>){
    var obj1 = baseClass();
    obj1.func1();

    var obj2 = childClass();
    obj2.func1();
    obj2.func2();
    obj2.func2("문자열 파라메터");
    obj2.func2("문자열 파라메터", 100);

    println()
    var obj3 : baseClass = obj2  // 가능한가? 가능
    obj3.func1()  // 부모, 자식 중 어느 것이 호출되는가?
    // obj3.func2()  // 가능한가? 불가능
}

image-20201016112257371




Interface, abstract, static

image-20201016114440272


package oop
interface SimpleInterface{
    fun TestFunc();
}

class SimpleImp : SimpleInterface{
    override fun TestFunc() = println ("구현했음");
}

abstract class TestAbstract{
    fun TestFunc() = println("TestFunc");
    abstract fun abstractFunc();
}

class TestAbstractImp : TestAbstract(){
    override fun abstractFunc() = println("상속구현했음");

    // companion object {} 안에서 구현해야 static 가능
    companion object {
        var staticVar = "staticVar";
        fun staticFunc() = println("이거스태틱 함수임");
    }
}

fun main(args : Array<String>){
    // SimpleInterface
    SimpleImp().TestFunc();
    var obj : SimpleInterface;

    // 추상화
    // 아래 코드는 다음과 같이도 가능함
    // TestAbstractImp().apply { TestFunc(); abstractFunc(); }
    var obj2 = TestAbstractImp();
    obj2.TestFunc();
    obj2.abstractFunc();

    // static
    println( TestAbstractImp.staticVar);
    TestAbstractImp.staticFunc() ;
}

image-20201016114654140




object

image-20201016114722968


ex04_Object.kt

package oop

object SingleTon {
    var printMSG = { msg : String -> println(msg) }
}

class NormalClass{
    var msg: String = "일반객체로 생성하면 이 변수를 액세스 가능함"
    // companion object {} 안에서 구현해야 static 가능
    companion object {
        var staticVar = "staticVar"
        fun staticFunc()= println("이거스태틱 함수임")
    }
}

abstract class fakeClickHandler{
    var msg : String = "abstract 클래스입니다"
    abstract fun onClick()
}

// object 사용예
fun main(args: Array<String>) {
    // 1. 클래스 전체를 싱글톤으로 사용할 때, 마치 java의 static class
    //var 싱글톤변수 = SingleTon()
    SingleTon.printMSG("싱글톤입니다.!")

    val obj = NormalClass()
    println(obj.msg)
    // 아래는 객체이므로 접근하지 못하는 에러코드임
    // 객체.staticVar

    // 2. 자바의 static method를 사용하듯...
    println( NormalClass.staticVar )
    NormalClass.staticFunc()

    // 3.이름없는 클래스 객체를 만들고 사용할 때...
    // 주로 상속받고 필요한 함수만 오버라이드
    var obj2 = object : fakeClickHandler(){
        fun dummyFunc() = "눌렀다"
        override fun onClick() {
            println(dummyFunc())
        }
    }

    obj2.onClick()
}

image-20201016115013254




data class

image-20201016115049392


ex05_dataclass.kt

package oop

class DummyClass{
    var DummyData : String? = null
}

data class BasicInfo(var name : String, var age : Int)

data class DetailInfo(var name : String, var age : Int = 30,
                    var dummy :DummyClass? = null )

fun main(args: Array<String>) {
    var data1 = BasicInfo("김모씨", 30)
    var data2 = DetailInfo(name = "박모씨", dummy = DummyClass().apply{ DummyData = "더미입니다" })

    var (name1, age1) = data1
    println ("$name1 : $age1")

    var (name2, age2, dummy) = data2
    println ("$name2 : ${dummy?.DummyData}")

    // 이 부분이 제일 유용함
    var data3 = data2.copy(name = "회장님")
    println ("${data3.toString()}")
}

image-20201016130949290



댓글