해당 게시물은 자바의 정석(남궁 성 지음) 참고하여 작성되었습니다.
1. 다형성
1.1 다형성이란?
객체지향 특징 '캡상추다' 중 하나인 다형성. 이름에서 유추할 수 있듯이 '다양한 형태를 가진 것', '다양한 ', '형태' 무언가 많은 여러가지 라는 단어가 생각난다. 맞다, 다형성이란 '여러가지 형태를 가질 수 있는 능력'을 뜻한다. 객채지향에서 아주 중요한 특징이다. 하지만 그만큼 이해하기가 어렵기 때문에 여러번 봐야 이해가 가능했다.
1.2 형변환
객체지향에서는 형변환이라는 것을 할 수 있다. 전에 primitive(byte, int, boolean...) 타입에서 형변환을 했던 경험이 있다. 좀 다른 개념이기는 하지만 우리가 만든 혹은 만들어진 클래스들도 상속관계에 있다면 형변환을 할 수 있다. 여기서 중요한 것은 상속관계와 형변환을 할 수 있다는 것이다. 객체가 이 형태로, 저 형태로 변화를 할 수 있다는 것은 그 객체가 이 형태, 저 형태를 가지고 있다는 것이구나, 그래서 다형성이구나! 라고 생각할 수도 있다.(나는 그렇개 생각했다...) 얼추 비슷하다고 말은 할 수 있지만서도 아니다. 일단 형변환을 해야 다형성이 되는 구나만 알고 있으면 된다.
그렇다면 형변환을 해보자.
Upcatsting & Downcasting
Primitive 타입을 형변환 했을 때
float b = 1.1;
int a = (int)b
이런 식으로 했었다. 변수 b는 float 타입이지만 변수 a에 대입할 때 int형으로 형변환하여 값을 대입했다. 이 과정에서 소수점 아래 값들은 소실된다.
참초형 타입도 똑같다.
클래스 A,B 가 상속관계에있고 A가 부모클래스 B가 자식클래스 일때
A a = null;
B b = new B();
a = (A)b;
이렇게 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하는 것이 형변환을 한 것이고
이것을 Upcasting 이라 한다. Downcasting은 반대로 자손클래스 타임으로 조상클래스가 형변환 하는 것이다.
1.3 형변환을 하게 되면???
이제 그러면 형변환을 어떻게 하는지 알았고 이것을 하게 되면 어떻게 될까??
형변환을 하게 되면 사용할 수 있는 맴버의 갯수가 달라진다. 부모클래스 타입으로 자손객체가 형변환 하게 되면 그 자손 객체는 부모클래스의 멤버만 사용할 수 있게된다. 사용할 수 있는 멤버의 갯수가 줄어들게 되는 것이다. 그러면 더 안좋아지는 것이 아닌가? 할 수 있지만 이 부분에 대해서는 인터페이스를 배울 때 알게 되니까 이 차이만 이해하고 있으면 된다.
1.4 그래서 다형성이란??
이제 그러면 다형성에 대해서 다시 생각해보자.
책에서 말하는 다형성이란
'여러 가지 형태를 가질 수 있는 능력'을 의미하며, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현했다.
라고 나온다.
위에서 말했던 상속관계에서 형변환으로 부모타입의 참조변수로 자식 객체를 참조할 수 있었다. 그로 인해서 다형성을 구현하였다고 책에서는 얘기하고 있다. 잘 생각해보면 부모타입의 참조변수는 부모객체와, 자식객체를 참조 할 수 있다. 이 말은 부모, 자식 두 개의 형태를 가질 수 있다는 말이 된다. 그러면 부모와 상속관계에 있는 다른 자식이 하나 더 있다면, 그 부모 타입의 참조 변수는 3개의 객체를 참조할 수 있게 되는 것이다. 또는 자식의 또 다른 자식과 상속관계에 있다고 해도 최상위 부모는 3개의 객체를 가질 수 있게 된다. 그리고 이 관계가 계속해서 확장되어간다면 그 수많큼 참조할 수 있는 객체가 많아지게되고 다형성이라는 특성이 구현하게 된다.
자 이제 그러면 정리하면
부모타입의 참조변수 하나만 있으면 상속관계에 있는 객체들은 모두 변수에 담아서 사용할 수 있다는 말이 된다. 그 참조변수에 사용하고 싶은 객체만 주입해서 사용하면 되고, 나중에 다른 객체를 넣어야 한다면 별다른 코드 수정 없이 그 부분만 수정해서 사용할 수 있게 된다.
마치 새로 정의한 클래스의 객체를 새로운 부품이라고 생각하고 갈아 끼울 수 있는 것이다.
사실 다형성은 인터페이스에서 효과가 크다.
1.4 instanceof 연산자
참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다. 주로 조건문에 사용되며 instanceof 왼쪽에는 참조변수 오른쪽에는 타입(클래스명)이 피연산자로 위치한다. 그리고 결과로는 true, false를 반환한다.
if( p instanceof Parent) {
// true 일때 실행 구문
}
'자바 > 자바 기초' 카테고리의 다른 글
| java.lang 패키지 (0) | 2021.04.04 |
|---|---|
| 제어자(modifier) (0) | 2021.02.17 |
| 오버로딩과 오버라이딩 (0) | 2021.02.13 |
| 상속(inheritance) (0) | 2021.02.13 |
| 변수와 메소드 (0) | 2021.01.28 |