개발_웹/Java

Java | 업캐스팅, 다운캐스팅, instanceof

zuyo 2021. 5. 11. 08:40
반응형

업캐스팅

 

서브클래스 객체를 슈퍼클래스 타입으로 변환하는 것.

 

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("직장인이 맞다");
	}
}

 

반응형