2017. 7. 2. 22:42
java 자바 레퍼런스 형변환 instanceof 알아보기 C. Java2017. 7. 2. 22:42
레퍼런스 형변화
: 레퍼런스 변수들 사이의 형변환은 상속관계에서만 가능, 업캐스팅과 다운캐스팅이 있다.
업캐스팅
: 슈퍼클래스의 레퍼런스가 서브클래스의 인스턴스를 가리키는것, 참조 가능한 영역이 축소된다.
: 슈퍼클래스의 레퍼런스가 서브클래스의 인스턴스를 가리키는것, 참조 가능한 영역이 축소된다.
컴파일러에 의해 자동 형변환이 된다.
ex) class Parent { public void pPrn(){System.out.println("슈퍼클래스 메서드"); }
class Child extends Parent { public void cPrn(){System.out.println("서브클래스 메서드"); }
class Test {
public void main(String[] args){
Child c = new Child();
c.pPrn();
c.cPrn();
Parent p;
p=c; // 업캐스팅(암시적으로 일어남)
p.pPrn(); //업캐스팅 이후에는 부모로부터 상속받은 메서드만 호출할수 있다.
//p.cPrn(); -> 컴파일시 에러가 발생한다.
} }
다운캐스팅
: 서브클래스의 레퍼런스가 슈퍼클래스의 인스턴스를 가리키는것, 참조 가능한 영역이 확대된다.
: 서브클래스의 레퍼런스가 슈퍼클래스의 인스턴스를 가리키는것, 참조 가능한 영역이 확대된다.
컴파일러에 의해 자동 형변환이 되지 않는다.
이미 업캐스팅이 된 레퍼런스 값만 다운캐스팅할수 있다.(안전함)
=> 이런조건하에 다운캐스팅하는 방법은 강제형 변환(명시적) 으로 해주면 된다.
ex) class Parent { public void pPrn(){System.out.println("슈퍼클래스 메서드"); }
class Child extends Parent { public void cPrn(){System.out.println("서브클래스 메서드"); }
class Test {
public void main(String[] args){
Parent p = new Child(); // 업캐스팅(암시적으로 일어남)< /FONT >
p.pPrn(); // 업캐스팅 이후에는 부모로부터 상속받은 메서드만 호출할수 있다.
//p.cPrn(); -> 컴파일시 에러가 발생한다.
Child c;
c = (Child) p; // 강제 형변환으로 다운캐스팅
c.pPrn();
c.cPrn(); // 이렇게 다시 다운캐스팅하면 자신의 메소드도 호출할수 있다.
} }
instanceof
: 객체가 특정클래스로부터 상속된 객체인지 판별해주는 연산자 ( true/false 로 결과값이 나타남 )
: 객체가 특정클래스로부터 상속된 객체인지 판별해주는 연산자 ( true/false 로 결과값이 나타남 )
->좌변의 객체가 우변의 자손인지를 판별해주는 연산자
A ap = new A();
boolean a = ap instanceof A; ----------> ap가 A의 서브클래스인지 확인
System.out.println(a); ----------> 결과값: true
ps. 업캐스팅이후에도 바인딩 개념이 적용된다.
class AA
{
void Sub(){ System.out.println("Sub Call :AA"); }
};
{
void Sub(){ System.out.println("Sub Call :AA"); }
};
class BB extends AA
{
void Sub(){ System.out.println("Sub Call :BB"); }
void Sub1(){ System.out.println("Sub Call :BB22"); }
};
class test
{
public static void main(String[] args)
{
BB bob = new BB();
bob.Sub();
{
public static void main(String[] args)
{
BB bob = new BB();
bob.Sub();
AA aob = bob; // 업캐스팅후에도< /FONT >
aob.Sub(); // 메소드는 맨 마지막 재정의된 메소드가 호출
}
}
aob.Sub(); // 메소드는 맨 마지막 재정의된 메소드가 호출
}
}
'C. Java' 카테고리의 다른 글
java 자바 클래스 (0) | 2017.07.02 |
---|---|
java 자바 메소드 가변인자 알아보기 (0) | 2017.07.02 |
java 자바 문자열 관련 클래스 (0) | 2017.07.02 |
자바 패키지 import (0) | 2017.07.02 |
익명 중첩 클래스 (0) | 2017.07.02 |