IT/JAVA

다형성

So1_b 2022. 1. 22. 22:10

 

다형성

- 조상 타입의 참조변수로 자손 타입 인스턴스를 다루는 것

- 참조변수의 자료형에 따라 인스턴스에서 사용할 수 있는 멤버의 범위가 달라진다 (멤버: 필드, 메서드)

 

ex)  tiger클래스가 animals클래스를 상속 ( tiger > animals)

       1. tiger t = new tiger();       자손 타입의 참조변수로

       2. animals a =new tiger();

       1의 경우 참조변수가 자손 타입(tiger)이므로 tiger인스턴스에서 사용할 수 있는 멤버는 tiger에 해당하는 멤버. 일반적으로 사용하는 형태

       2는 참조변수가 조상 타입이고 인스턴스는 자손 타입. 사용가능한 인스턴스는 참조변수에 따라 범위가 달라지는데 

       참조변수의 멤버만큼만 인스턴스 멤버에서 활성화된다.

       * 주의할 점! 

          자손 타입의 참조변수로 조상타입의 객체를 가리킬 수 없다 예) tiger t = new animals()

          상속을 하는 이유는 조상의 멤버에 기능을 추가하는 것. 자손 참조변수에는 인스턴스에 없는 멤버가 있기 때문

 

참조변수의 형변환

- 사용할 수 있는 멤버 갯수 조절함. ( 멤버 갯수만 조절됨. 참조변수가 가리키는 인스턴스 주소값 변화 니니)

- 상속 관계에서만 서로 형변환 가능 ( 자손 > 조상, 조상 > 자손)

tiger t=null;

animals an=null;

tiger t2=new tiger(); 

t2.swimming(); 

an=t2; //an=(an)t2; 여기서 괄호가 생략된 것.

//an.swimming(); 이건 오류남 왜? 인스턴스는 tiger형이지만 참조변수는 animals형. 따라서 인스턴스에 없는 메서드 사용불가!

t=(tiger)an; //tiger형 참조변수t에 tiger형 인스턴스

t.swimming(); //오류 안남 

 

* 주의할 점 

  참조변수가 가리키는 실제 객체가 중요! 인스턴스의 멤버안에서만 형변환을 통해 사용범위를 줄이고 늘리는 것만 가능

  animals an=new tiger(); 처럼 인스턴스 멤버를 초과하면 안됨.

  코드에 작성할 때 참조변수와 인스턴스의 형만 맞으면 컴파일이 실제 객체의 타입을 아수 없기때문에 오류안나지만 실행시 위의 이유로    에러가 남. 

  따라서 instanceOf연산자로 확인 후 형변환하는 것을 추천

 

instanceOf 연산자

A instanceOf B

- A는 B로부터 생성된 인스턴스인지 확인함으로서 참조변수의 형변환 가능여부 확인 맞으면 true 반환

(자신 뿐만아니라 조상 클래스일때도 true가 나옴)

 

참고 영상