JAVA 의 다형성
다형성이란?
다형성은 자바의 가장 중요한 3대 요소 중에 하나이다. 1
다형성은 객체에 따라 다르게 동작하게 해주거나 어떤 메소드가 다른 객체에서 다른 방법으로 동작할 수 있게 해주는 것이다.
그 예로 저번에 공부했었던 메소드 오버로드 또는 오버라이딩 2 도 다형성에 포함된다. 3
예시를 들어 설명하면 할아버지->아빠->나 순으로 상속이 됐다면 어떤 선언을 하냐에 따라 기능을 사용 할 수 있고 없고가
갈리게 된다. 클래스가 3개 있다고 생각해보자. 할아버지 = grandfather, 아빠 = father, 나=me 위 순서로 extends 했다.
부모타입 참조변수 = grand, 부모타입 객체를 다루면 밑 처럼 된다.
grandfather grand = new grandfather(); 이렇게 선언하면 할아버지는 할아버지의 기능만 사용 가능하다
업캐스팅!
업캐스팅은 자식클래스의 객체가 부모클래스의 객체로 형변환 되는 것이다. (큰 기능중에 조상님의 기능만 사용한다?)
grandfather gf = new father(); 실제로 쓸 수 있는 영역은 아빠기능까지 사용 가능하지만 아빠의 기능 안에 할아버지 기능을 가르키고 있기 때문에 그냥은 사용이 불가능하다.
father fa = new me(); 이것도 마찬가지로 사용할 수 있는 기능은 나로 좀 더 많아졌지만 아빠는 아빠 기능을 가르키고 있기 때문에 그냥 사용이 불가능하다.
다운캐스팅!
위의 경우를 해결하기 위해 있는게 다운 캐스팅이다.
예외로 할아버지가 나의 기능을 사용할 수 있게 해주는 것이다.
만약 내 클래스(me)클래스에 fight 라는 메소드가 있으면 할아버지클래스에서는 사용하지 못한다.
하지만 ((me)grand).fight(); 라고 작성한다면 강제형변환이 일어나서 (할아버지 클래스에서 적혀있지않은) = 내 클래스에 존재하는 메소드(fight) 를 사용할 수 있게 되는 것이다.
((자식클래스)부모클래스).자식클래스의 메소드() 로 작성하면 된다.
그럼 다형성을 왜 쓰는가?
다형성이라는 건 상속관계를 사용하면 발생하는데 상속관계일 때 여러가지의 객체를 하나의 타입으로 관리가 가능하다.
예를들면 부모클래스의 생성자에서 초기화 한 것을 자식객체에서 오버라이딩하거나 자식객체에서 부모객체의 생성자도 초기화가 가능하다.
위의 이유로 객체를 또 새로 만들 필요가 없다. = 재사용성이 높아진다.
또한 클래스간의 의존성을 낮춰 결합도가 낮아진다는 장점이 있다.