[개발] - 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
반응형