Polymorphism - 다형성

조병률·2021년 7월 23일
0

다형성 : 여러 형태를 가질 수 있는 특성

Method Overloading - 메소드 오버로딩

같은 이름을 가진 메소드에 전달되는 파라미터의 형식에 따라 동작방식을 결정.

class A {
    public void a(int a) { System.out.println("1"); }
    public void a(String a) { System.out.println("2") ;
    // 메소드 이름은 같지만 파라미터(개수 || 타입)가 달라야한다.
    }
}
public class Overloading {
    public static void main(String[] args) {
        A obj = new A();
        obj.a(1234);
        obj.a("hi");
    }
}
1
2

Class Inheritance - 클래스 상속관계

class A {
    public String a() { return "a1"; }
}
class B extends A{
    public String a() { return "a2"; }
    public String b() { return "b1"; }
}
class C extends A{
    public String a() { return "a3"; }

}
public class Polymorphism {
    public static void main(String[] args) {
        A obj = new B(); // B를 인스턴스화 하여 데이터 타입이 A인 obj를 생성
        A obj2 = new C();
        // System.out.println(obj.b()); - 부모 클래스에서 정의한 메소드에 대해서만 호출 가능
        System.out.println(obj.a());
        System.out.println(obj2.a());
    }
}
a2
a3

obj가 가리키는 것은 ?

B() 생성자에 의해 클래스의 모든 멤버변수에 대한 메모리는 생성 됨.
하지만 변수의 타입이 A(클래스)이므로 실제 접근 가능한 변수나 메서드는 A의 변수와 메서드.

이것을 업캐스팅이라고 하는데, 인터페이스를 이용하여 느슨한 결합 관계 형성


Abstract - 추상

abstract
자식 클래스에서 반드시 오버라이딩 해야만 사용할 수 있는 메소드.
추상 메소드는 선언부만 존재하며, 구현부는 작성하지 않음.
그런 의미로 끝에 바로 ; 을 사용함.

사용 목적
일반 메소드로 구현한다면 해당 메서드를 구현하지 않을 수도 있기 때문.
추상 메소드를 구현해야만 인스턴스를 생성할 수 있으므로, 반드시 구현하게 됨.

abstract class A { // A클래스를 반드시 상속하라 !
    public abstract void a(); // a메소드를 반드시 생속하라 !
    //public abstract int a() { } - 추상 메소드는 본체를 가질 수 없다.

    public void c() { // 추상 클래스 내에는 추상 메소드가 아닌 메소드 생성 가능.
        System.out.println("c");
    }

}
class B extends A { // 추상 클래스 A를 상속
    @Override
    public void a() { // 추상 클래스 안에 있는 추상 메소드를 반드시 오버라이드.
        System.out.println("오버라이드 된 메소드");
    }
}
public class Abstract {
    public static void main(String[] args) {
        // A obj = new A(); - 추상 클래스는 인스턴스화 할 수 없음.
        B obj = new B();
        obj.a();
        obj.c();
    }
}
오버라이드 된 메소드
c

0개의 댓글