캐스팅(Casting)
데이터 타입의 변환
캐스팅은 하나의 데이터 타입을 다른 데이터 타입으로 변환하는 것이다. 프로그래밍에서 데이터를 유연하게 다루고, 연산을 위해서 반드시 필요한 작업이다.
1
2
3
4
5
6
7
8
9
10
|
public class Main {
public static void main(String[] args) {
String num1 = "500";
int num2 = 500;
System.out.println(num1 + num2); // 500500
System.out.println((num1 + num2).getClass()); // class java.lang.String
}
}
|
cs |
500을 두 번 더해 1000을 만든다고 가정해 보자.
위의 에시처럼 String 타입과 int 타입의 서로 다른 타입의 데이터를 더할 경우 뜻하지 않은 결과가 나올 수 있다. 올바른 연산을 위해 필요한 것이 바로 캐스팅이다.
캐스팅은 두 가지로 나뉜다.
업캐스팅(Upcasting)
자식 클래스에서 부모 클래스로의 캐스팅을 업캐스팅이라고 한다.
부모 클래스에서 자식 클래스로 형 변환이 일어날 때는 개발자가 직접 캐스팅해 줄 필요가 없이 자동으로 이루어진다.
public class CastingTest {
public static void main(String[] args) {
// 업캐스팅 예시(Child에서 Parent를 참조)
Parent parent = new Child();
parent.parentMethod();
// parent.childMethod(); // Child의 메서드는 호출 불가능
}
static class Parent {
String name;
void parentMethod() {
System.out.println("Parent Method executed.");
}
}
static class Child extends Parent {
String school;
void childMethod() {
System.out.println("Child Method executed.");
}
}
}

암시적, 묵시적 캐스팅(Implicit Casting)
직접 캐스팅해 줄 필요가 없다는 점에서 암시적 캐스팅이라는 개념도 존재하는데, 작은 크기의 데이터 타입에서 큰 크기의 데이터 타입으로의 변환에서 사용된다.
아래의 예시의 경우에는 작은 크기의 데이터 타입인 int를 큰 크기의 데이터 타입인 long으로 변환한다. 데이터 손실의 위험이 없거나 최소화된 경우이기 때문에 명시적으로 캐스팅할 필요 없이 자동으로 캐스팅이 되는 것이다.
public class Main {
public static void main(String[] args) {
int castingNum = 5;
long casted = castingNum; // 암시적 캐스팅
}
}
int에서 long 타입으로 변환하는 경우 int의 표현 가능 범위는 -21억에서 21억까지인 반면, long은 -922경에서 922경까지이다.
long 타입이 int 타입보다 더 큰 범위의 값을 표현가능하기 때문에 데이터 손실의 위험이 없다. 따라서 자바에서 암시적으로 처리되는 것이다.
다운캐스팅(Downcasting)
부모 클래스에서 자식 클래스로의 캐스팅을 다운캐스팅이라고 한다.
캐스팅 시에 명시적으로 캐스팅을 해 주어야 하는데, 여기서 주의할 점은 기존에 업캐스팅이 된 객체만 다운캐스팅이 가능하다. 신규 생성 객체를 다운캐스팅 시도할 경우, 아래와 같이 ClassCastException 예외가 발생한다.
public class CastingTest {
public static void main(String[] args) {
// 업캐스팅 예시(Child에서 Parent를 참조)
Parent parent = new Child();
parent.parentMethod();
// parent.childMethod(); // Child의 메서드는 호출 불가능
// 다운캐스팅(Parent에서 Child로)
Child child = (Child) parent;
child.childMethod();
child.parentMethod();
// 신규 생성 객체 다운캐스팅 시도
Child child2 = (Child) new Parent();
child2.parentMethod();
child2.childMethod();
}
static class Parent {
String name;
void parentMethod() {
System.out.println("Parent Method executed.");
}
}
static class Child extends Parent {
String school;
void childMethod() {
System.out.println("Child Method executed.");
}
}
}
명시적 캐스팅(Explicit Casting)
다운캐스팅과 비슷한 예시로 명시적 캐스팅이 존재한다. 큰 크기의 데이터 타입에서 작은 크기의 데이터 타입으로의 형변환 때 사용된다.
아래는 double형 데이터를 int형으로 명시적 캐스팅한 것이다.
데이터 손실이 발생할 수 있기 때문에 데이터 타입을 변환하는 코드를 작성해야 한다.
public class Main {
public static void main(String[] args) {
double beforeCasting = 10031.51;
int afterCasting = (int)beforeCasting;
System.out.println(beforeCasting); // 10031.51
System.out.println(afterCasting); // 10031
}
}
double에서 int 타입의 데이터로 변환할 경우 소수점 이하 값들은 모두 사라지고 정수 값만 남게 된다.
소수점 값들의 데이터들은 모두 손실되기 때문에 double -> int 변환의 경우 명시적 캐스팅이 필요한 것이다.
위의 예시에서 알 수 있듯이, 명시적 캐스팅은 표현 가능 범위가 큰 데이터 타입 -> 표현 가능 범위가 작은 데이터 타입 변환 시 사용된다.
업캐스팅을 하는 이유?
그렇다면 그냥 업캐스팅 할 필요 없이 처음부터 적절한 데이터 타입을 선언해서 캐스팅 없이 쭉 사용하면 되는 것 아닐까?
업캐스팅을 하는 궁극적인 이유는 상속 클래스가 몇개가 되든 하나의 인스턴스로 묶어서 관리할 수 있다는 장점 때문이다. 즉 공통적인 부분을 한 번에 쉽게 관리하기 위해서다.
아래의 예시에서는 Shape 부모 객체를 Rectangle, Triangle, Circle 자식 객체가 상속받고 있다.
각 Rectangle, Triangle, Circle 객체를 Shape로 업캐스팅 하여 관리한다면 아래의 코드에서 볼 수 있듯이 유지보수성, 가독성 측면에서 훨씬 효율적인 것을 확인할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Rectangle[] rectangleArr = new Rectangle[];
rectangleArr[0] = new Rectangle();
Triangle[] triangleArr = new Triangle[];
triangleArr[0] = new Triangle();
Circle[] circleArr = new Circle[];
circleArr[0] = new Circle();
Shape[] shapeArr = new Shape[];
shapeArr[0] = new Rectangle();
shapeArr[1] = new Triangle();
shapeArr[2] = new Circle();
|
cs |
다만 주의할 점은 업캐스팅한 부모 클래스에서는 자식 클래스의 고유한 메서드를 사용할 수 없기 때문에 다운캐스팅을 해야 한다.
// 업캐스팅 예시(Child에서 Parent를 참조)
Parent parent = new Child();
parent.parentMethod();
// parent.childMethod(); // Child의 메서드는 호출 불가능
References
☕ JAVA 업캐스팅 & 다운캐스팅 - 완벽 이해하기
자바의 참조형 캐스팅 하나의 데이터 타입을 다른 타입으로 바꾸는 것을 타입 변환 혹은 형변환(캐스팅) 이라고 한다. 자바의 데이터형을 알아보면 크게 두가지로 나뉘게 된다. 기본형(primitive ty
inpa.tistory.com
https://gyoogle.dev/blog/computer-language/Java/Casting.html
[Java] Casting(업캐스팅 & 다운캐스팅) | 👨🏻💻 Tech Interview
[Java] Casting(업캐스팅 & 다운캐스팅) 캐스팅이란? 변수가 원하는 정보를 다 갖고 있는 것 (1)은 0.1이 double형이지만, int로 될 정보 또한 가지고 있음 (2)는 true는 int형이 될 정보를 가지고 있지 않음
gyoogle.dev
https://www.guru99.com/ko/c-type-casting.html
C의 유형 캐스팅: 유형 변환, 암시적, 명시적(예제 포함)
C에서 타입 캐스팅이란 무엇입니까? Typecasting은 하나의 데이터 유형을 다른 데이터 유형으로 변환하는 것입니다. 데이터 변환 또는 유형 변환이라고도 합니다. 중요한 것 중 하나입니다 concepts 'C
www.guru99.com
'Java' 카테고리의 다른 글
[Java] Interned String (0) | 2024.04.06 |
---|---|
[Java] Record(레코드) (0) | 2024.04.06 |
[Java] Error & Exception(에러와 예외 클래스) (0) | 2024.04.04 |
[Java] 문자열 클래스 (0) | 2024.02.03 |
[Java] 직렬화(Serialization) (0) | 2024.01.31 |