달력

2

« 2025/2 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

레퍼런스 형변화 

: 레퍼런스 변수들 사이의 형변환은 상속관계에서만 가능, 업캐스팅과 다운캐스팅이 있다.
 
 
업캐스팅
:
슈퍼클래스의 레퍼런스가 서브클래스의 인스턴스를 가리키는것, 참조 가능한 영역이 축소된다.
  컴파일러에 의해 자동 형변환이 된다.
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 로 결과값이 나타남 )
 ->좌변의 객체가 우변의 자손인지를 판별해주는 연산자
 
                    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"); }
};

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();
    AA aob = bob; // 업캐스팅후에도< /FONT >
    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
:
Posted by sfeg