반응형
업캐스팅
서브클래스 객체를 슈퍼클래스 타입으로 변환하는 것.
Person person = new Student();
List<> list = new ArrayList<>();
자식클래스는 부모클래스를 내포하고 있기 때문에 부모클래스 객체에 넣을 수 있다. 이를 업캐스팅이라 한다.
업캐스팅을 하면 자식클래스의 멤버는 접근이 불가해지고, 부모클래스의 멤버만 사용할 수 있게 된다.
그러나 자식클래스가 부모클래스의 메소드가 오버라이딩 했다면, 오버라이딩된 자식클래스의 메소드가 호출이 된다.
class Person { // 슈퍼클래스
String name;
String id;
public Person(String name) {
this.name = name;
}
}
class Student extends Person { // 서브클래스
String grade;
String department;
public Student(String name) {
super(name);
}
public Student(String name, String grade, String department) {
super(name);
this.grade = grade;
this.department = department;
}
}
public class Memo {
public static void main(String[] args) {
Person person;
Student student = new Student("짱구");
person = student; // 업캐스팅 발생
System.out.println(p.name);
p.grade = "A"; // 에러 (서브클래스 Student의 멤버 grade에 접근 불가)
}
}
다운캐스팅
업캐스팅을 원래대로 되돌리는 것.
업캐스팅하여 부모클래스의 멤버만 사용하고 있던 객체를 다시 다운캐스팅해서 다시 자식클래스의 멤버도 쓸 수 있게 하는 것으로 기존에 업캐스팅 되었던 객체만 다운캐스팅이 가능하다.
명시적으로 타입을 지정해야 한다. (강제형변환)
Person person = new Student(); // 업캐스팅
Student student = (Student)person; // 다운캐스팅
public class Memo {
public static void main(String[] args) {
Person person = new Student("짱구"); // 업캐스팅 발생
Student student = (Student)person; // 다운캐스팅
System.out.println(s.name);
s.grade = "A"; // 서브클래스의 멤버에 접근이 가능해짐
}
}
instanceof 연산자
객체가 어떤 클래스 타입인지 true/false로 알려주는 연산자. 업캐스팅된 객체라도 true를 반환해준다.
class Person {
String name;
String id;
public Person(String name) {
this.name = name;
}
}
class Student extends Person {
String grade;
String department;
public Student(String name) {
super(name);
}
public Student(String name, String grade, String department) {
super(name);
this.grade = grade;
this.department = department;
}
}
class Worker extends Person {
String company;
int salary;
public Worker(String name) {
super(name);
}
public Worker(String name, String company, int salary) {
super(name);
this.company = company;
this.salary = salary;
}
}
public class Memo {
public static void main(String[] args) {
Student person = new Student("짱구");
if (person instanceof Person)
System.out.println("사람이 맞다");
if (person instanceof Student)
System.out.println("학생이 맞다");
if(person instanceof Worker) // Error
System.out.println("직장인이 맞다");
}
}
반응형
'개발_웹 > Java' 카테고리의 다른 글
Java | 예외 처리의 3가지 방식 (0) | 2021.05.15 |
---|---|
JSP | 숫자 앞자리 0으로 채우는 팁 (패딩) (0) | 2021.05.12 |
Java | clone()으로 깊은 복사하기 (0) | 2021.05.02 |
Java | Java의 객체 직렬화 (Serialization) (0) | 2021.02.17 |
Java | Java에서 Swap 함수 구현 (Java의 call-by-reference) (0) | 2021.02.17 |