BACKEND/JAVA & SPRING

업캐스팅, 다운캐스팅에 대해

이-프 2024. 10. 30. 15:10

목표

코딩테스트 공부하는 중, 이진탐색 문제를 풀면서 언제 (long) 을 써야하고 언제 Long.parseLong을 써야하는지를 암기적으로 알고 있는 상태를 발견 후, 이를 정확히 알고 넘어가고자 포스팅한다.

 

원시타입, 참조타입

⭐ 원시타입 (primitive type)

정수, 실수, 문자, 논리 리터럴 등의 실제 데이터 값을 저장하는 타입

ex) Boolean Type (boolean), Numeric Type(short, int, long, float, double, char)

 

 

⭐ 참조타입 (reference type)

객체(Object)의 번지를 참조(주소를 저장)하는 타입으로 메모리 번지 값을 통해 객체를 참조하는 타입

example) 문자열, 배열, 열거, 클래스, 인터페이스

ex) Class Type, Interface Type, Array Type, Enum Type 등

 

⭕ 정적 메모리 스택 영역 (Stack)

  • 기본(원시) 타입 변수가 할당되고, 변수의 실제 값들이 저장됨
  • 참조 타입의 변수들은 스택 영역에서 힙 영역에 생성된 객체들의 주소 값을 저장하고 있음.
  • 객체 안의 메소드의 작업이 종료되면 할당되었던 메모리 공간은 반환되어 비워진다.

 

동적 메모리 힙 영역 (Heap)

  • 객체와 배열 등의 참조타입들이 저장된다.
  • 이 참조타입들의 주소를 스택 영역에 저장한다.
  • 기본타입 변수와 다르게 크기가 정해져있지는 않다.
  • 프로그램 실행시, 메모리에 동적으로 할당된다.
  • 참조하는 변수가 없다면 자바의 gc가 제거한다.

 

⇒ Java에서 실제 객체는 힙영역에 저장되며, 참조 타입 변수는 스택 영역실제 객체들의 주소를 저장하여 객체를 사용할 때마다 참조 변수에 저장된 객체의 주소를 불러와 사용하는 방식이다.

 

 

캐스팅이란

  • 자바의 상속 관계에 있는 부모와 자식 클래스 간 서로 형변환 진행
  • 부모 클래스는 자식 클래스를 모두 갖고 있으나, 자식 클래스는 일부만 갖고 있을 것
  • 그러므로, 형변환(캐스팅)을 통해 사용할 수 있는 멤버의 개수를 조절하는 것으로 이해하면 된다.
    • 업캐스팅 = 개수 up
    • 다운캐스팅 = 개수 down
class Parent {
	String name;
    int age;
}

class Child extends Parent {
	/*
    String name;
    int age;
    */
	int number;
}

Parent p = new Parent(); 
Child c = new Child();

Parent p2 = (Parent)c; // 업캐스팅 - 자식에서 부모로
Child c2 = (Child)p2; // 다운캐스팅 - 부모에서 자식으로
  • 부모 클래스 : Parent
  • 자식 클래스 : Child

 

⚠️ 다운 캐스팅 ≠ 업캐스팅의 반대

다운 캐스팅은 부모 클래스로 업캐스팅된 자식 클래스를 다시 복구하여, 본인의 필드와 기능을 회복하는 단계

⇒ 원래 있던 기능을 회복하기 위해 다운캐스팅을 진행

class Unit { //부모 클래스
    public void attack() {
        System.out.println("유닛 공격");
    }
}

class Zealot extends Unit { //자식 클래스
    public void attack() {
        System.out.println("찌르기");
    }

    public void teleportation() {
        System.out.println("프로토스 워프");
    }
}

public class Main {
    public static void main(String[] args) {

        Unit unit_up;
        Zealot zealot = new Zealot();

        unit_up = zealot; // 업캐스팅
        
        // * 다운캐스팅(downcasting) - 자식 전용 멤버를 이용하기위해, 이미 업캐스팅한 객체를 되돌릴때 사용
        Zealot unit_down = (Zealot) unit_up; // 캐스팅 연산자는 생략 불가능. 반드시 기재
        unit_down.attack(); // "찌르기"
        unit_down.teleportation(); // "프로토스 워프"
    }
}

 

 

자동 형변환 (묵시적/암시적 형변환)

  • 프로그램 실행 도중에 컴파일러가 자동적으로 타입 변환하는 것
  • 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장되는 경우
int num = 100;
long answer = num; //(long > num)