0%
다형성 (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(); } }
|
- 자식 클래스로 부모 클래스를 참조하려 하면
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;
if (foo instanceof Bar) { 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); bar.methodA();
System.out.println(foo.x); foo.methodA(); } }
|
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() { 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(); }
|