0%

200810 TIL

다형성 (Polymorphism)

다형성의 특징

  • 부모 클래스 타입으로 자식 클래스 객체를 참조하는 특징
1
2
3
4
5
6
7
8
9
10
11
public class Foo {
public void methodA() {
return;
}
}

public class Bar extends Foo {
public void methodB() {
return;
}
}
  • 부모 클래스로 자식 클래스를 참조한 경우, 자식 클래스의 메소드는 사용할 수 없다.
1
2
3
4
5
6
7
8
9
public class Main {
public static void main(String args[]) {
Bar bar = new Bar();
Foo foo = (foo)bar;

foo.methodA(); // works
// foo.methodB(); // error
}
}
  • 자식 클래스로 부모 클래스를 참조하려 하면 java.lan.ClassException 오류 발생
1
2
3
4
5
6
7
8
9
10
11
public class Main {
public static void main(String args[]) {
Foo foo = new Foo();
Bar bar;

// bar = (Bar)foo;
if (foo instanceof Bar) { // false
bar = (Bar)foo;
}
}
}
  • Method overriding은 메모리상의 객체의 타입을 따른다. (Virtual method call)
  • 멤버 변수의 재정의는 선언된 객체의 타입을 따른다. (문법적으로 본다)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Foo {
public String x = "Super";

public void methodA() {
System.out.println("Super");
}
}

public class Bar extends Foo {
public String x = "Sub";

@override
public void methodA() {
System.out.println("Sub");
return;
}
}

public class Main {
public static void main(String args[]) {
Bar bar = new Bar();
Foo foo = (Foo)bar;

System.out.println(bar.x); // Sub
bar.methodA(); // "Sub"

System.out.println(foo.x); // Super
foo.methodA(); // Virtual method call
}
}
  • Covariant return type
1
2
3
4
5
6
7
8
9
10
11
class Foo {
public Foo getInstance() {
return this;
}
}

class Bar extends Foo {
public Bar getInstance() { // Foo 대신 Bar로 리턴 가능
return this;
}
}

추상 클래스 (Abstract Class)

  • 일부 메소드가 구현되지 않고 선언만 되어 있는 클래스
    • 자식 클래스에서 반드시 구현해야 하는 메소드를 abstract로 선언
    • 필요한 클래스가 모두 구현될 수 있도록 강제

추상 클래스의 선언

  • abstract 키워드를 이용해 class를 선언
  • abstract 키워드를 이용해 abtract 키워드를 이용해 method를 선언
1
2
3
4
5
6
7
abstract class AbstractFoo {
public void method() {
return;
}

public abstract void abstractMethod();
}