[JAVA] 다형성(polymorphism)

Taesu Seo·2021년 4월 11일
0

JAVA

목록 보기
3/3
post-thumbnail

다형성

  • 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현
  • 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 함
   Parent p = new Child(); // 가능
  • 반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없음
   Child c = new Parent(); // 불가능
  • 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 함
  • 주의할 사항은참조여부사용여부다름
    • 조상클래스 타입의 참조변수가 자손클래스의 인스턴스를 참조하니까 p 변수로 Child클래스의 메소드는 모두 쓸수있나? ( X 불가능 )
    • 단, 조상타입을 자손타입으로 형변환하면 사용가능
    public class polymorphism {
        public static void main(String[] args) {
            Parent p = new Child();
            Child c = new Child();
            p.method();
            p.cMethod();	   // 컴파일 에러!!
            ((Child) p).cMethod(); // 이런식으로 형변환을 통해 사용가능
            c.method();
            c.pMethod();
        }
    }

    class Parent {
        void method() {
            System.out.println("Parent Method");
        }
        void pMethod() {
            System.out.println("pMethod");
        }
    }

    class Child extends Parent{
        void method() {
            System.out.println("Child Method");
        }
        void cMethod(){
            System.out.println("cMethod");
        }
    }

instanceof 연산자

  • 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof연산자를 사용
  • instanceof의 왼쪽에는 참조변수를, 오른쪽에는 타입(클래스명)이 피연산자로 위치
  • 연산의 결과로 boolean값인 truefalse 중의 하나를 반환
  • 어떤 타입에 대한 instanceof연산의 결과가 true 라는 것은 검사한 타입으로 형변환이 가능하다는 것을 의미
    void doWork(Parent p) {
  	  if (p instanceof Child) {
   	     Child c = (Child) p;
   	     c.childMethod();
 	  }
    }

값이 null인 참조변수에 대해 instanceof연산을 수행하면 false


참조변수와 인스턴스의 연결

조상 클래스에 선언된 멤버변수와 같은 이름의 인스턴스변수를 자손 클래스에 중복으로 정의 했을 때, 조상 타입의 참조변수로 자손 인스턴스를 참조하는 경우자손타입의 참조변수로 자손타입의 참조변수로 자손 인스턴스를 참조하는 경우는 서로 다른 결과

메서드의 경우 오버라이딩된 메서드가 호출되지만, 멤버변수의 경우는 다른 결과

public class javaStudy {
    public static void main(String[] args) {
        Parent p = new Child();
        Child c = new Child();

        System.out.println("p.x = " + p.x);
        p.method();
        System.out.println("c.x = " + c.x);
        c.method();
    }
}

class Parent {
    int x = 100;

    void method() {
        System.out.println("Parent Method");
    }
}

class Child extends Parent{
    int x = 200;

    void method() {
        System.out.println("Child Method");
    }
}
---------------- Result----------------
p.x = 100
Child Method
c.x = 200
Child Method
---------------------------------------
profile
Connecting the dots

0개의 댓글