코드 그라데이션

Day24. 참조자료형 형변환, 오버라이딩 본문

Java/Mega

Day24. 참조자료형 형변환, 오버라이딩

완벽한 장면 2023. 4. 17. 19:57

참조자료형 형변환

- 상속이 있어야 할 수 있습니다.

부모는 자식을 모른다는 걸 명심해야 한다.

 

객체자식, 자료형부모 이렇게 이렇게 만든다.

 

예시

Class C {
	int a;
}

Class D extends C{
	int b;
}

C c = new D(); // 업 캐스팅
D d = (D)c; // 다운 캐스팅

 

보는 방법은, 변수 자료형 타입(기준)으로 보면 된다.

 

D로 만들고 C로 갔다.

=> 내가 볼 수 있는 건 C밖에 없다.

    그 말은 C일 때 int b가 안 보인다는 것.

 

   다시 D로 다운캐스팅 해주면?

 

int b가 보인다. , 부모 입장에서는 부모에 있는 것만 보이는 것이고, 자식은 부모 것도 다 가지고 있으니까, 전부 보인다.

 

왜 쓰는가?

이러한 관계가 있다고 가정했을 때,

 Class A { 
 } 
 
 Class B extends A {
 } 
 
 Class C extends A { 
 } 
 
 Class D extends A{ 
 } 
 
 Class E extends A{ 
 }

 

오버로딩 통해서 이렇게 만드는 게 가능해진다.

 Void abc(B b) 
 
 Void abc(C c) 
 
 Void abc(D d) 
 
 Void abc(E e)

 

 

그런데, 이걸 "참조자료형 형변환" 을 쓰게 된다면,

메서드 네 개 만들 것을.

단순히

void abc(A  a) 

이거 하나로 끝낼 수 있다.

 

그런데, 객체가 뭔지를 모르니까, 객체를 확인하기 위해서 

일일이 이렇게 확인해주어야 한다.

 

Void abc(A a)
{
 if(a instanceof B)
       B b=(B)a;
 if(a instanceof C)
       C c = ( C )a;
 if(a instanceof D)
      D d = (D)a;
      
 if(a instanceof E)
      E e = (E)a;  
}

이것도 번거로운 일이다.

 

그래서 나온 것이?

바로

메서드 오버라이딩!

 

 

오버라이딩이란

: 부모가 정의한 함수를 자식이 재정의를 하는 것을 말합니다

 

이러한 경우에

Class A{
    void abc(){
        System.out.print(“ABC”);
    }
}
Class B extends A{
    void abc(){
        System.out.println(“DEF”);
    }
}

 

main 메서드에서 두 개를 불렀다면?

B b = new B();
b.abc(); // 1

A a = new B();
a.abc(); // 2

 

각각 뭐가 나올까?

DEF // 1
DEF // 2

 

오버라이딩을 사용하면

class A{
   void abc(){
      System.out.print(“A”);
   }
}

class B extends A{
    void abc(){
      System.out.print(“B”);
   }
}

class C extends A{
     void abc(){
      System.out.print(“C”);
   }
}

class D extends A{
     void abc(){
      System.out.print(“D”);
   }
}

class E extends A{
     void abc() (){
      System.out.print(“E”);
   }

}

이 복잡한 코드가

void exit( A a){
      a.abc();
}

이거 하나면 끝나버린다는 것....!!!

 

B b = new B();

exit(b); -> B 출력

 

C c = new C();

exit(c); -> C  출력

 

이러한 형태로 간단하게 사용

 

정리하는 사진

728x90
Comments