우리는 흔히 자바를 배우다 업캐스팅과 다운 캐스팅을 배운다.
하지만 이 개념은 지나치기엔 너무나도 중요한 개념이기에 알기 쉽게 , 또한 어떤식으로 사용되는지 알려주겠다.
자바는 다운 캐스팅과 업 캐스팅이 있다.
업 캐스팅은 잘 쓰이지 않고 , 다운 캐스팅이 정말 많이 쓰이는데
일단 다운캐스팅부터 보자.
자 일단 다운캐스팅을 이해할려면 인터페이스를 정확히 이해해야 한다.
인터페이스를 정확히 이해했다는 과정하에 얘기하겠다.
[다운 캐스팅]
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 타입이 된다.
하지만 인터페이스는 구현할 수 없으며 , 반드시 구현된 객체가 필요하다.
그것이 Sum과 Minus클래스이다.
즉 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의 자식 객체이다.
이걸 구체화된 클래스를 다시 추상화 클래스로 만드는 작업을 하는게 업 캐스팅이다.
즉 자식 객체 -> 부모 객체로 클래스를 바꾸는것이 업캐스팅인데
업 캐스팅은 자주 쓰이진 않으니 뭔지만 알고만 있자.
'JAVA 기초' 카테고리의 다른 글
[자바기초] List<? extends>란 무엇인가? (1) | 2024.01.31 |
---|---|
[자바 기초 ] - Call by value 와 Call By Reference란 무엇인가? (1) | 2023.10.06 |
[자바 기초] 알고리즘 필수인 StringTokenizer의 개념 (0) | 2023.08.09 |
[자바 기초] Return 과 break의 개념과 차이 점 - With Java (0) | 2023.08.03 |
[자바 기초] if 와 esle if의 차이 점 (0) | 2023.07.31 |