본문 바로가기

# 02/코틀린

[Kotlin] Sealed Classes

반응형

다형성이란?


- 부모 클래스를 상속받은 자식 클래스


- 자식 클래스는 부모 클래스로부터 접근할 수 있다.


- 이때 자식 클래스는 모두 다른 행동을 할 수 있다.



다형성 - java


class A {

public void printA() {

System.out.println("class A");

}

}


class B extends A {

@Override

public void printA() {

super.printA();                                                          // A 클래스의 printA 출력

System.out.println("class B - printA");

}

}


class C extends A {

@Override

public void printA() {

super.printA();                                                          // A 클래스의 printA 출력

System.out.println("class C - printA");

}

}

@Test

public void test() {

A a = new B(); a.printA();

a = new C(); a.printA();

}

class A

class B - printA

class A

class C - printA



// @Override 안한 거

class A {

public void printA() {

System.out.println("class A");

}

}


class B extends A {

public void printB() {

System.out.println("class B");

}

}


class C extends A {

public void printC() {

System.out.println("class C");

}

}

public void test() {

print(new B());

print(new C());

}


private void print(A a) {

if (a instanceof B) {

((B) a).printB();

} else if (a instanceof c) {

((C) a).printC();

}

}





다형성 - kotlin


open class A {

fun printA() {

println("class A")

}

}


class B : A() {

fun printB() {

println("class B")

}

}


class C : A() {

fun printC() {

println("class C")

}

}


@Test

fun test() {

print(B())

print(C())

}


private fun print(a : A) {

if (a is B) {

a.printB();

} else if (a is C) {

a.printC();

}

}





Sealed class


- 생성자는 private


sealed class Sample(val a : Int)

data class Num : Sample()

data class Num2 : Sample()


-> sealed class는 기본 private 생성자


- sealed class와 sealed class를 상속받는 클래스는 하나의 파일 안에 정의 되어야 한다.


-> file1.kt

sealed class Sample


-> file2.kt

data class Num : Sample()

data class Num2 : Sample()


-> 두개의 파일에 사용할 수 없음



- sealed class {}안에 class를 정의 할 수 있음


sealed class Sample {

data class Num : Sample()

data class Num2 : Sample()

}



- abstract 메소드를 생성할 수 있음

sealed class A {

abstract fun printA()

}




sealed class Expr

data class Const (val number : Double) : Expr()

data class Sum (val e1 : Expr, val e2 : Expr) : Expr()

object NotANumber : Expr()




-> 예제 코드

fun eval(expr : Expr) : Double = when (expr) {

is Const -> expr.number

is Sum -> eval(expr.e1) + eval(expr.e2)

NotANumber -> Double.NaN

// the 'else' clause is not required because we've covered all the cases

}


fun test() {

println(eval(Sum(Const(0.0), Const(1.0))))

}




-> 예제 코드 2

class ExampleKotlinUnitTest {

@Before

fun setUp() {

}


@Test

@Throws(Exception::class)

fun test() {

println(eval(Sum(Const(0.0), Const(1.0))))

}


fun eval(expr : Expr) : Double = when(expr) {                  // sealed class를 상속받은 3개 모두 경우가 구현되어 있어서 else 필요 없음!!

is Const -> expr.number

is Sum -> eval(expr.e1) + eval(expr.e2)

NotANumber -> Double.NaN

// the 'else' clause is not required because we've covered all the cases

}

}


sealed class Expr

data class Const (val number : Double) : Expr()

data class Sum (val e1 : Expr, val e2 : Expr) : Expr()

object NotANumber : Expr()




-> 예제 코드 3

sealed class A 

class B : A {

fun printB() {

println("class B")

}

}


class C : A {

fun printC() {

println("class C")

}

}


fun test() {

print(B())

print(C())

}


private fun print(a : A) {

when (a) {

is B -> a.printB()

is C -> a.printC()

}

}


반응형

'# 02 > 코틀린' 카테고리의 다른 글

[Kotlin] Higher-Order Functions  (0) 2019.07.12
[Kotlin] Class etc  (0) 2019.07.12
[Kotlin] Companion Object  (0) 2019.07.12
[Kotlin] Class initializer  (0) 2019.07.12
[Kotlin] Class Inheritance  (0) 2019.07.11