티스토리 뷰

Study !/JAVA

JAVA 정리 4-2. 다형성

저유 2018. 9. 13. 17:17

다형성은 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말한다. 코드 측면에서 보면 다형성은 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해준다. 자바에서는 부모 타입에 모든 자식객체가 대입될 수 있다.


Parent라는 클래스를 상속받은 Boy와 Girl라는 클래스가 있다고하면 다음과같이 부모클래스타입에 자식객체를 대입할 수있다.

Parent parant1 = new Boy();     //자식타입은 부모타입으로 자동 타입 변환이 가능하다.
Parent parent2 = new Girl();

이런 방식을 왜 사용할까?

다형성을 구현 하는 방법이기 때문이다. 다형성은 위에 설명한것과 같이 동일한 타입을 사용하지만 다양한 결과가 나오는 성질을 말한다.

(하나의 Parent타입으로 상속받은 여러 클래스들을 사용하여 다양한 기능과 결과를 얻을 수 있기때문이다.)


자식클래스가 자신의 타입으로 객체를 생성하지 않고 부모의 타입으로 객체를 생성한다면 다형성으로인한 효과를 볼 수 있지만 부모클래스에 선언된 필드와 메소드만 접근이 가능하다. 하지만 메소드가 자식클래스에서 오버라이딩 되었다면 자식 클래스의 메소드가 대신 호출이 된다.

class Parent {  //부모클래스
  void method1() { System.out.println("부모의 method1"); }
  void method2() { System.out.println("부모의 method2"); }
}

class Child extends Parent{  //부모클래스를 상속받은 자식클래스
  void method2() { System.out.println("자식의 method2"); }   //Overriding
  void method3() { System.out.println("자식의 method3"); }
}

class childExample{
  public static void main(String[] args){
    
    Child child= new Child();
    Parent parent = child          // == Parent parent = new Child();

    parent.method1(); // 부모의 method1
    parent.method2(); // 자식의 method2
    parent.method3(); // (errer:호출불가능)
}

강제 타입 변환 (Casting)

만약 자식타입에 선언된 필드와 메소드를 꼭 사용해야 한다면 강제 타입 변환을 해서 다시 자식 타입으로 변환한 다음 자식 타입의 필드와 메소드를 사요하면 된다.


class Parent {  //부모클래스
  String fhild1;
  void method1() {   }
  void method2() {   }
}

class Child extends Parent{  //부모클래스를 상속받은 자식클래스
  String fhild2;
  void method3() {   }
}

class childExample{
  public static void main(String[] args){
    
    Parent parent = new Child();
    
    parent .field1 = "xxx";
    parent .method1();
    parent .method2();
    parent .field2 = "xxx";  // (불가능)
    parent .method3();       // (불가능)

    Child child = (Child) parent;
    parent .field2 = "xxx";  // (가능)
    parent .method3();       // (가능)

}

단. 자식타입이 무모타입으로 변환된 상태에서만 사용이 가능하다. 이경우 instanceof 연산자를 사용하여 확인후 사용하면된다.

'Study ! > JAVA' 카테고리의 다른 글

JAVA 정리 5. 인터페이스  (0) 2018.09.14
JAVA 정리 4-3. 추상클래스  (0) 2018.09.13
JAVA 정리 4-1. 상속과 Override  (0) 2018.09.13
JAVA 정리 3. 접근 제한자 (public, protected, private)  (0) 2018.09.09
JAVA 정리 2. 클래스  (0) 2018.09.09
댓글