참조 형변환 : casting

·2024년 3월 19일
0

JAVA

목록 보기
5/9

자바 2차 관문 형변환
넘 어렵더 〒▽〒
머리가 뒤죽박죽뒤죽박죽
그래도가보자고 쭈고

🤍 1. 참조 형변환

참조형끼리의 형변환 (상속 관계에서만 가능)
참조형 변수를 사용하여 다른 타입의 객체를 참조하기 위해 변환하는 것
업캐스팅다운캐스팅으로 분류된다

💙 (1) 업캐스팅 (Up Casting)

부모클래스의 참조형 변수가 자식클래스의 객체를 참조하는 것

  • 특징
  1. 자동 형변환 발생
  2. 참조영역의 축소 발생
  3. 다형성(Polymorphism) 활용 가능

💙 (2) 다운캐스팅 (Down Casting)

자식클래스의 참조형 변수가 부모 클래스의 객체를 참조하는 것

  • 특징
  1. 강제 형변환 필수
  2. 참조영역의 확대 발생

🤍 2. 참조 형변환 예시

초등학생, 중학생, 고등학생 클래스를 만들어 보자

class 초등학생 {
	public void 덧셈() {
    	System.out.println("덧셈을 하자");
    }
} // 초등학생 클래스

class 중학생 extends 초등학생 {
	public void 이차방정식() {
    	System.out.println("이차방정식을 하자");
    }
} // 중학생 클래스

class 고등학생 extends 중학생 {
	public void 미적분() {
    	System.out.println("미적분을 하자");
    }
} // 고등학생 클래스

업캐스팅 예시: 초등학생 참조형 변수가 고등학생의 객체 참조

초등학생 초딩 = new 고등학생(); // 자동 형변환 발생

초딩.이차방정식(); // 오류 
초딩.미적분(); // 오류

두 메서드가 오류가 나는 이유는 '참조영역의 축소' 때문이다.
초등학생은 이차방정식과 미적분을 풀지 못하는 것처럼 객체가 고등학생이더라도 데이터 타입이 초등학생이므로 초등학생이 할 수 있는 <덧셈>으로 참조영역이 축소가 된다.

이러한 오류를 없애기 위해서는 다운캐스팅이 필요하다. 초딩이라는 참조변수를 고등학생으로 다운캐스팅 해 주는 것이다.

위에 코드 오류 해결 -> 다운캐스팅 예시

초등학생 초딩 = new 고등학생();
고등학생 고딩 = (고등학생)초딩;
		
고딩.이차방정식();
고딩.미적분();

다운캐스팅 주의할 점

고등학생 고딩 = (고등학생)new 초등학생();

위와 같은 코드를 실행해 보면 오류가 난다.
이유는 초등학생 객체가 생성할 때쯤에 고등학생 class가 메모리에 올라와 있지 않기 때문이다.

이러한 오류를 해결하려면 먼저 업캐스팅을 실행 후, 다운캐스팅을 실행한다.

위에 코드 오류 해결 -> 업캐스팅 후 다운캐스팅

초딩학생 초딩 = new 고등학생(); // 업캐스팅
고등학생 고딩 = (고등학생)초딩; // 다운캐스팅

고딩.덧셈();
고딩.이차방정식();
고딩.미적분(); // -> 참조영역의 확장 발생

🤍 3. 참조 형변환 정리

간단한 문제로 참조 형변환 될 수 있는지 없는지 해석하면서 이를 정리해 보쟈

class A{}
class B extends A{}
class C extends A{}

class D extends B{}
class E extends B{}

class F extends C{}

class G extends F{}
class H extends F{}

이러한 클래스들이 있을 때

C c = new F(); // 1번
E e = (E)c;    // 2번
G g = c;       // 3번
A a = c;       // 4번

이 코드의 T/F를 알아보고 이유를 찾아보자

답은
1번 T
2번 F
3번 F
4번 T

먼저 객체 F가 참조할 수 있는 변수는 상속받은 A, B, C와 상속한 G,H다.
1번은 F가 참조할 수 있는 변수에 C가 있으니 가능하다
2번은 F가 참조할 수 있는 변수에 E는 존재하지 않으니 형변환이 불가능하다
3번은 G 데이터 타입은 참조 변수로 존재하나 강제 형변환을 해 주지 않았으므로 틀렸다고 할 수 있다.
4번은 F가 참조할 수 있는 변수에 A가 존재하니 가능하다.


ㅎ 암튼 끝남
잘 모르겠으면 처음에 선언된 객체가 뭔지를 보고 상속관계를 알아본 뒤 업캐스팅인지 다운캐스팅인지 알아보면 될듯
암튼 형변환 끝 ( •̀ ω •́ )✧

profile
~*

0개의 댓글