다형성이란?
- 부모 클래스를 상속받은 자식 클래스
- 자식 클래스는 부모 클래스로부터 접근할 수 있다.
- 이때 자식 클래스는 모두 다른 행동을 할 수 있다.
다형성 - 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 |