[Java] 업캐스팅 / 다운캐스팅
2021. 11. 24. 16:27ㆍLanguage`/Java
업캐스팅 (Upcasting)
- 서브 클래스의 객체에 대한 레퍼런스 -> 슈퍼 클래스 타입으로 변환
- 슈퍼 클래스의 레퍼런스로 서브 클래스의 객체를 가리키게 한다
- But 슈퍼 클래스의 레퍼런스는 슈퍼 클래스의 멤버만 접근 가능
- 명시적 타입 변환을 하지 않아도 된다
※ Example
class Person{
String name, id;
public Person(String name){
this.name = name;
}
}
class Student extends Person{
String grade, department;
public Student(String name) {
super(name);
}
}
public class test {
public static void main(String[] args) {
Person p;
Student s = new Student("홍길동");
p = s; // 업캐스팅
System.out.println(p.name);
// p.grade = 'A' -> 컴파일 오류 (슈퍼 클래스의 레퍼런스로 서브 클래스의 멤버 접근 불가능
// p.department = "Com" -> 컴파일 오류 (슈퍼 클래스의 레퍼런스로 서브 클래스의 멤버 접근 불가능
}
}
---------------------
홍길동
다운캐스팅 (Downcasting)
- 업캐스팅된 것을 다시 원상태로 돌리는 것
- 명시적으로 타입을 지정해야 한다
※ Example
class Person{
String name, id;
public Person(String name){
this.name = name;
}
}
class Student extends Person{
String grade, department;
public Student(String name) {
super(name);
}
}
public class test {
public static void main(String[] args) {
Person p = new Student("홍길동");
Student s;
s = (Student)p; // 다운캐스팅
System.out.println(s.name);
s.grade = "A";
System.out.println(s.grade);
}
}
--------------------
홍길동
A
Instanceof 연산자
- 레퍼런스 instanceof 클래스명
-> '레퍼런스'가 가리키는 객체가 해당 '클래스' 타입이면 true 리턴, 아니면 false 리턴
class Person{}
class Student extends Person{}
class Researcher extends Person{}
class Professor extends Researcher{}
/*
Person -> Student, Researcher
Researcher -> Professor
*/
public class test {
static void print(Person p){
if(p instanceof Person)
System.out.print("Person ");
if(p instanceof Student)
System.out.print("Student ");
if(p instanceof Researcher)
System.out.print("Researcher ");
if(p instanceof Professor)
System.out.print("Professor ");
System.out.println();
}
public static void main(String[] args) {
System.out.print("new Student() -> ");
print(new Student());
System.out.print("new Researcher() -> ");
print(new Researcher());
System.out.print("new Professor() -> ");
print(new Professor());
}
}
-------------------------------------------
new Student() -> Person Student
new Researcher() -> Person Researcher
new Professor() -> Person Researcher Professor