다형성(polymorphism) :
하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다.
자바에서는 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현하고 있으며 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나이다.
업캐스팅(Upcasting) :
서브 클래스의 객체가 수퍼 클래스 타입으로 형변환되는 것.
→ 상속을 받은 서브클래스가 몇 개이든 하나의 인스턴스로 묶어서 관리하기 위해서 업캐스팅 함
package inherit;
class Person {
String name;
int age;
public Person(String name) {
this.name = name;
}
}
class Student extends Person {
String dept;
public Student(String name) {
super(name);
}
}
public class CastingTest {
public static void main(String[] args) {
// 레퍼런스 student를 이용하면 name, dept에 접근 가능
// upCasting 을 아래와 같이 두줄 나눠서 써줘도 되고
// Student student = new Student("해니");
// Person person = student;
Person person = new Student("해니"); // 한 줄로 upCasting 해줘도 됨
person.name = "Hennie";
person.age = 20;
// 레퍼런스 person을 이용하면 Student 객체의 멤버 중
// 오직 Person 클래스의 멤버만 접근이 가능핟.
// 아래 문장은 컴파일 타임 오류
// person.dept = "Computer Eng";
}
}
다운캐스팅(Downcasting) :
자신의 고유한 특성을 잃은 하위 클래스의 객체를 다시 복구 시켜주는 것.
업캐스팅된 것을 다시 원상태로 돌리는 것을 말한다.
package inherit;
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
class Student extends Person {
String dept;
public Student(String name) {
super(name);
}
}
public class downCasting {
public static void main(String[] args) {
// 업캐스팅 선행 : 부모클래스이름 변수명 = new 서브클래스이름 (매개변수);
Person person = new Student("해니");
// 다운캐스팅 : 서브클래스이름 변수명 = (서브클래스이름) 업캐스딩 된 변수명;
Student student = (Student) person;
// 부모클래스로 부터 받은 이름 사용 가능
student.name = "해니";
// 다운캐스팅 되었기에 이젠 dept 사용 가능하다
student.dept = "코딩";
}
}
instanceof 연산자 :
다형성으로 인해 런타임에 참조 변수가 실제로 참조하고 있는 인스턴스의 타입을 확인할 필요성이 생기기 마련이다.
자바에서는 instanceof 연산자를 통해, 참조 변수가 참조하고 있는 인스턴스의 실제 타입을 확인할 수 있도록 한다.
문법
참조변수 instanceof 클래스이름
참조 변수가 실제로 참조하고 있는 인스턴스의 타입이 클래스 타입이면 true를 반환하고, 아니면 false를 반환한다.
참조 변수가 null을 가리키고 있으면 false를 반환한다.
class Parent { }
class Child extends Parent { }
class Brother extends Parent { }
public class Polymorphism01 {
public static void main(String[] args) {
Parent p = new Parent();
System.out.println(p instanceof Object); // true
System.out.println(p instanceof Parent); // true
System.out.println(p instanceof Child); // false
System.out.println();
Parent c = new Child();
System.out.println(c instanceof Object); // true
System.out.println(c instanceof Parent); // true
System.out.println(c instanceof Child); // true
}
}
'JAVA' 카테고리의 다른 글
[JAVA] 객체지향 - 클래스를 인자 값으로 받는 클래스 출력문 (0) | 2023.03.02 |
---|---|
[JAVA] 객체지향 - VO 객체 클래스를 이용한 프로그래밍 (0) | 2023.03.02 |
[JAVA] 객체지향 - 메소드 오버라이딩 (method overriding) (0) | 2023.03.01 |
[JAVA] 객체지향 - super와 super() (0) | 2023.03.01 |
[JAVA] 객체지향 - 상속 (inheritance) (0) | 2023.03.01 |