다형성 |
객체지향개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조 할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다. 즉, 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.
class Parent{
/* 내용 생략 */
}
class Child extends Parent{
/* 내용 생략 */
}
Child c = new Child();
Parent p = new Child(); //가능
//둘 다 같은 타입의 인스턴스지만 참조변수의 타입에 따라 사용할 수 있는 맴버의 개수가 달라진다.
다형성의 특성
1. 조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다.
2. 반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수 없다.
참조변수의 형변환
기본형 변수와 같이 참조변수도 형변환이 가능하다. 단, 서로 상속관계에 있는 클래스사이에서만 가능
자손타입 -> 조상타입(UP-casting) :형변환 생략가능
자손타입 <- 조상타입(Down-casting) :형변환 생략불가
Parent타입의 참조변수 p를 Parent타입의 조상인 Object타입의 참조변수로 형변환 하는 것은 참조변수가 다룰 수 있는 맴버의 개수가 실제 인스턴스가 갖고 있는 맴버의 개수보다 적을 것이 분명하므로 문제가 되지 않는다. 그래서 형변환을 생략할 수 있도록 한 것. 반대는 불가
현변환은 참조변수의 타입을 변화하는 것이지 인스턴스를 변환하는 것은 아니기 때문에 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다.
단지 참조변수의 형변환을 통해서, 참조하고 있는 인스턴스에서 사용할 수 있는 맴버의 범위(개수)를 조절하는 것뿐이다.
서로 상속관계에 있는 타입간의 형변환은 양방향으로 자유롭게 수행될 수 있으나, 참조변수가 가리키는 인스턴스의 자손타입으로 형변환은 허용되지 않는다.
그래서 참조변수가 가리키는 인스턴스의 타입이 무엇인지 확인하는 것이 중요하다.
instanceof 연산자
- 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof연산자를 사용
- 연산 결과로 bollean값인 true와 false 중의 하나 반환
- 값이 null인 참조변수에 대해 instanceof연산을 수행하면 false를 결과로 얻음
- 어떤 타입에 대한 instanceof연산의 결과가 true라는 것은 검사한 타입으로 형변환이 가능하다는 것을 뜻함
Parent p = new Parent();
if(p instanceof Parent)
System.out.println("This is Parent instance"); //This is Parent instance
if(p instanceof Object)
System.out.println("This is Object instance"); //This is Object instance
참조변수와 인스턴스의 연결
메서드의 경우 조상클래스의 메서드를 자손의 클래스에서 오버라이딩한 경우에도 참조변수의 타입에 관계없이 항상 실제 인스턴스 메서드(오버라이딩된 메서드)가 호출되지만, 멤버변수의 경우 참조변수의 타입에 따라 달라진다.
즉. 자바에서 참조변수와 인스턴스 사이의 관계가 메서드와 멤버변수에서 서로 다르게 동작한다는 것을 설명하는 것입니다.
메서드는 오버라이딩될 수 있습니다. 이 경우 자손 클래스에서 조상 클래스의 메서드를 오버라이딩한 경우, 참조변수의 타입에 상관없이 실제 인스턴스의 오버라이딩된 메서드가 호출됩니다.
그러나 멤버변수의 경우, 참조변수의 타입에 따라 달라집니다. 예를 들어, 조상 클래스와 자손 클래스에서 동일한 이름을 가진 멤버변수가 있다면, 참조변수가 조상 클래스 타입일 때는 조상 클래스의 멤버변수가 사용되고, 참조변수가 자손 클래스 타입일 때는 자손 클래스의 멤버변수가 사용됩니다. 따라서 참조변수의 타입에 따라서 인스턴스에 접근하는 멤버변수가 결정됩니다.
매개변수의 다형성
참조변수의 다형적인 특징은 메서드의 매개변수에도 적용된다.
여러 종류의 객체를 배열로 다루기
Prodoct[] p = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();
'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA 이론] 예외처리 (0) | 2022.01.27 |
---|---|
[JAVA 이론] 클래스(추상, 인터페이스, 내부, 익명) (0) | 2022.01.27 |
[JAVA 이론] 상속 (0) | 2022.01.26 |
[JAVA 이론] 오버로딩 & 오버라이딩 (2) | 2022.01.22 |
[JAVA 이론] 객체지향 프로그래밍_2 (0) | 2022.01.22 |