공부블로그
다형성 본문
다형성
- 조상 타입의 참조변수로 자손 타입 인스턴스를 다루는 것
- 참조변수의 자료형에 따라 인스턴스에서 사용할 수 있는 멤버의 범위가 달라진다 (멤버: 필드, 메서드)
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가 나옴)
참고 영상
https://www.youtube.com/watch?v=fw7Nm_li0pE&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=80
https://www.youtube.com/watch?v=XP8zpt-yFZs&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=81
https://www.youtube.com/watch?v=3lSPC37IaNQ&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=82
https://www.youtube.com/watch?v=YvCgrZQU4EM&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=83