[JAVA] 15.업캐스팅, 다운캐스팅, instanceof

안녕하세요 IT뽀로로입니다. 

 

오늘은 자바의 캐스팅에 대하여 알아보도록 할 텐데요.

 

캐스팅은 업 캐스팅과 다운 캐스팅 두 가지가 있습니다.

 

#업 캐스팅(Upcasting)

 

서브 클래스는 슈퍼 클래스의 모든 특성을 상속받는다. 따라서 서브 클래스는 슈퍼 클래스가 될 수 있다.

 

즉, 서브 클래스가 슈퍼 클래스가 되는 것을 업 캐스팅이라고 한다.

 

EX)

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 class UpcastingEx{
	public static void main(String[] args){
		Person p;
		Student s = new Student("이재문");
		p = s; //업 캐스팅 발생

		System.out.println(p.name); //정상 컴파일
		Ststem.out.println(p.grade); //컴파일 오류
	}
}

 

위의 코드를 보면 Student로 인스턴스를 생성하고 Person 레퍼런스 타입으로 담았다.

 

다시 말해서 Person 클래스의 멤버만 접근이 가능하고 Student의 멤버는 접근이 불가능하다.

 

그런데 여기서 질문!! Student 인스턴스의 멤버들은 사라졌을까요?

 

아닙니다. 잠시 가려져 있을 뿐 사라지지 않습니다.

 

#다운 캐스팅(DownCasting)

 

서브 클래스가 슈퍼 클래스로 변했을 때 서브 클래스의 인스턴스는 잠시 가려져 있을 뿐 사라지지 않는다.

 

서브 클래스의 원래 특성으로 돌려놓는 게 다운 캐스팅이다. 

 

다운 캐스팅은 업 캐스팅과 달리 명시적으로 타입을 지정해야 한다.

 

예로, 위의 코드에서 UpcastingEX 클래스 부분만 수정한다.

 

public class DowncastingEx{
	public static void main(String[] args){
		Person p = new Student("이재문"); //업 캐스팅 발생
		Student s;

		s = (Student)p; //다운 캐스팅

		System.out.println(s.name); //정상 작동
		s.grade = "A"; //컴파일 오류
	}
}

 

 

우리가 소스를 작성하다 보면 업 캐스팅을 한 경우 어떤 레퍼런스가 가리키는 객체의 진짜 타입을 구분하기 어렵다.

 

하지만 자바에서는 이런 경우도 생각해 instanceof 연산자를 제공한다.

 

 

#instanceof 연산자 

 

instanceof 연산자의 형태는 다음과 같다.

 

instanceof 연산자의 결과 값은 boolean 타입으로 true, false를 반환 값으로 가진다.

 

사용 예를 살펴보자.

 

이런 클래스 계층 구조를 가졌다고 생각해보자. 

 

다음 코드를 보면 이해가 될 것이다.

 

Person jee = new Student();
Person kim = new Professor();
Person lee = new Researcher();

if(jee instanceof Person)		//jee는 Person타입을 상속 받았음으로 true
if(jee instanceof Student)		//jee는 Student타입이므로 true
if(kim instanceof Student)		//kim은 Student타입이 아니므로 false
if(kim instanceof Professor)	//kim은 Professor타입이므로 true
if(kim instanceof Researcher)	//kim은 Researcher타입을 상속 받았음으로 true
if(lee instanceof Professor)	//lee는 Professor타입이 아니므로 false
if("java" instanceof String)	//"Java"는 String 타입의 인스턴스이므로 true;
if(3 instanceof int)			//문법 오류. instanceof는 객체에 대한 레퍼런스에만 사용

 

Reference. 명품 Java Programming

'IT Study > JAVA' 카테고리의 다른 글

[JAVA] 17.인터페이스  (0) 2019.09.15
[JAVA] 16.추상클래스  (0) 2019.09.15
[JAVA] 14.final 키워드  (0) 2019.09.04
[JAVA] 13.static 멤버와 final 키워드  (0) 2019.09.04
[JAVA] 12.접근 지정자  (0) 2019.09.04