2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[자바 기초] 다운캐스팅과 업캐스팅

2023. 12. 25. 22:21ㆍJAVA 기초

 

 

 

우리는 흔히 자바를 배우다 업캐스팅과 다운 캐스팅을 배운다.

 

하지만 이 개념은 지나치기엔 너무나도 중요한 개념이기에 알기 쉽게 , 또한 어떤식으로 사용되는지 알려주겠다.

 

자바는 다운 캐스팅과 업 캐스팅이 있다.

업 캐스팅은 잘 쓰이지 않고 , 다운 캐스팅이 정말 많이 쓰이는데

일단 다운캐스팅부터 보자.

 

자 일단 다운캐스팅을 이해할려면 인터페이스를 정확히 이해해야 한다.

 

인터페이스를 정확히 이해했다는 과정하에 얘기하겠다.

 

[다운 캐스팅]

 

 

public interface Calculator {

    public int calculation(int x,int y);
}

 

나는 이런 인터페이스 Calculator라는 인터페이스를 만들었고

추상 메서드 calculation을 만들었다.

 

여기에나는 구현체를 Bundle이라는 인터페이스에 또 Calculator를 인터페이스로 받겠다. (딱히 의미는 없다)

 

public interface Bundle extends Calculator{

}

 

나는 이러한 인터페이스를 또 마들었고 이 Bundle 인터페이스는 Calculator 인터페이스를 받는다.

 

 

package com.example.securitytest01.Test;

public class Minus implements Bundle {


    @Override
    public int calculation(int x, int y) {
        return x - y;
    }
}

 

그리고 나는 클래스 Minus만들고 여기에 x , y값이 들어왔을 때 뺸 값을 리턴값으로 준다.

 

package com.example.securitytest01.Test;

public class Sum implements Bundle{


    @Override
    public int calculation(int x, int y) {
        return x + y;
    }
}

 

그리고 Sum클래스를 만들고 이 Sum클래스는 마찬가지로 x ,y 를 더한값을 리턴값으로 준다.

 

package com.example.securitytest01.Test;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class CalTest {


    public static void main(String[] args) {
        Calculator calculator = new Minus();
        int result = CalTest(calculator);
        System.out.println("결과 :"+result);
    }

    public static int CalTest(Calculator calculator){
        Minus minus = (Minus) calculator;
        int calculation = minus.calculation(10, 5);
        return calculation;
    }


}

 

 

그리고 CalTest를 만들었는데 

 

CalTest 메서드에는 Calculator -> Sum , Minus를 구현받은 인터페이스가 있다.

static을 통해서 객체 생성없이 가져오게끔 했고

여기가 가장 중요한 부분이다.

public static int CalTest(Calculator calculator){
    Minus minus = (Minus) calculator;
    int calculation = minus.calculation(10, 5);
    return calculation;
}

 

 

여기서 Calculator가 인터페이스이다.

그리고 이 인터페이스를 Minus로 다운 캐스팅해서 Minus 객체 타입의 minus 변수를 만들었다.

여기서 잘 이해 해야한다.

 

결국 Calculator는 인터페이스이고 Sum과 Minus의 구현체를 받는다.

즉 인터페이스 다형성에 의해서 Sum과 Minus는 Calculator 타입이 된다.

 

하지만 인터페이스는 구현할 수 없으며 , 반드시 구현된 객체가 필요하다.

그것이 SumMinus클래스이다.

즉 Calculator는 부모 클래스이고 Sum과 Minus 클래스는 자식 객체이다.

부모 객체에서 -> 자식 객체구체화 시키는것이 다운 캐스팅이다.

 

여기서 중요한 것은 객체 타입이 Calculator이기 때문에 반드시 다운 캐스팅을 할 때 에는

Calcualtor타입의 객체만 가능하다.

 

그렇다면 여기서 의문이 들 것 이다

도대체 이렇게 불편하게 왜 쓰는걸까?

 

그 이유는 간단하다.

 

개발자가 인터페이스를 만들어서 잘 쓸일은 없다.

하지만 자바의 꽃인 스프링 프레임워크를 들어가게 된다면

 

99%가 인터페이스로 구성되어있고 이런 다형성을 요구한다.

그렇기 때문에 스프링 프레임워크를 쓸 때에는 반드시 다형성 부분과 다운캐스팅을 이해해야한다.

 

보통 스프링 프레임워크에서는 Object 객체로 반환 받게끔하여 개발자가 유연하게 다운 캐스팅해서

써야하기 때문이다.

 

 

[업 캐스팅]

 

업캐스팅은 다운캐스팅과 반대되는 개념이다.

다운 캐스팅을 이해했다면 업캐스팅도 쉽게 이해할 것 이다.

 

 

public static int CalTest(Calculator calculator){
    Minus minus = new Minus();
    Calculator calculators = (Calculator) minus;
    int calculation = calculators.calculation(10, 5);
    return calculation;
}

 

여기서 본다면 나는 Minus 객체를 생성해서 minus라는 변수를 만들었다.

이 minus 변수는 Minus 클래스이고 Calculator의 자식 객체이다.

 

이걸 구체화된 클래스를 다시 추상화 클래스로 만드는 작업을 하는게 업 캐스팅이다.

 

즉 자식 객체 -> 부모 객체로 클래스를 바꾸는것이 업캐스팅인데

업 캐스팅은 자주 쓰이진 않으니 뭔지만 알고만 있자.