Office 문서용 무료 .NET Java API 다운로드
타입캐스팅은 한 유형의 값을 다른 유형으로 변환하는 기술입니다. 이번 글에서는 자바의 타입캐스팅과 자바 프로그래밍 언어에서 제공되는 타입, 메소드, 생성자에 대해 알아봅니다.
Java의 Typecasting이란 무엇입니까?
Java에서는 한 데이터 유형의 값을 다른 데이터 유형에 할당하면 두 유형이 호환되지 않을 수 있습니다.
데이터 유형이 호환되는 경우 Java는 자동으로 알려진 변환을 자동으로 수행합니다.
Typecasting은 Java에서 유형 변환이라고도 합니다. 공정하게 수행되었지만 때로는 오류가 발생할 수 있습니다.
메소드가 작업을 수행하는 데 필요한 형식과 다른 형식의 데이터를 반환하는 경우 Typecasting이 필요한 경우가 많습니다.
위의 특정 상황에서는 Typecasting이 자동으로 수행될 수 있습니다. 다른 경우에는 수동으로(명시적으로) 강제 실행해야 합니다.
예를 들어, int 값을 long 변수에 할당합니다.
구문
dataType variableName = (dataType) variableToConvert;
Java의 유형 캐스팅 구문
유형을 캐스팅하는 구문은 대상 유형을 괄호 안에 지정하고 그 뒤에 변수 이름이나 캐스팅할 값을 지정하는 것입니다(예: 다음 명령문).
구문
int number;
float value = 32.33;
number= (int) value;
Java의 유형 캐스팅 유형
- 암시적 타입캐스팅과 명시적 타입캐스팅
- 업 캐스팅과 다운 캐스팅
- 오토박싱과 언박싱
1) 암시적 타입캐스팅과 명시적 타입캐스팅
Java의 암시적 Typecasting
확장 또는 자동 유형 변환은 두 데이터 유형이 서로 호환되고 자동으로 변환될 때 발생합니다. 더 큰 범위의 유형을 작은 범위의 유형으로 캐스팅하는 것을 확장 유형 캐스팅이라고 합니다.
작은 활자에서 큰 활자 크기로의 형변환,
바이트 -> 짧은 -> 문자 -> int -> 긴 -> 부동 소수점 -> 더블
- 두 데이터 유형은 호환됩니다.
- 더 작은 데이터 유형의 값을 더 큰 데이터 유형에 할당할 때.
- 대상 유형이 소스 유형보다 큽니다.
예를 들어 Java에서는 숫자 데이터 유형이 호환되지만 숫자 유형에서 char 또는 부울로의 자동 변환은 지원되지 않습니다.
또한 char과 boolean은 서로 호환되지 않습니다.
암시적 유형 캐스팅은 Java에서 확장 유형 캐스팅 및 자동 유형 변환으로도 알려져 있습니다.
Widening Typecasting의 전체 프로그램은 다음과 같습니다.
public class TypecastingExample3 {
public static void main(String[] args) {
int number = 10;
float point = number;
System.out.println(number);
System.out.println(point);
}
}
위 프로그램은 다음 출력을 생성합니다.
정수 및 부동 소수점 유형을 포함한 숫자 유형은 서로 호환됩니다.
참고. 자동 형식 변환은 도움이 되지만 모든 요구를 충족시키지는 못할 것입니다.
예를 들어, 바이트 변수에 부동소수 값을 할당하려면 어떻게 해야 할까요?
바이트가 부동소수 값보다 작기 때문에 이 변환은 자동으로 수행되지 않습니다.
이런 종류의 변환은 대상 유형에 맞도록 값을 분명히 좁게 만들기 때문에 좁게 변환이라고 불리기도 합니다.
Java에서 float를 int로 변환
float를 int로 유형 변환하는 전체 프로그램은 다음과 같습니다.
public class TypecastingExample1 {
public static void main(String[] args) {
int number;
float fval = 32.33f;
number = (int) fval;
System.out.println(number);
}
}
위 프로그램은 다음 출력을 생성합니다.
Java에서 부동 소수점 변환을 위한 int
int와 float는 각각 4바이트의 메모리를 사용합니다. int는 정수를 담고, float는 부동 소수점 숫자를 담습니다.
int를 float에 할당하는 것은 JVM에 의해 자동으로 수행됩니다.
public class IntToFloatExample {
public static void main(String args[])
{
int i1 = 10;
float f1 = i1;
System.out.println("int value: " + i1);
System.out.println("Converted float value: " + f1);
}
}
위 프로그램은 다음 출력을 생성합니다.
Java에서 double을 int로 변환
double을 int로 유형 변환하는 전체 프로그램은 다음과 같습니다.
public class TypecastingExample2 {
public static void main(String[] args){
System.out.println((int)1.87);
System.out.println((double)1 / 2);
}
}
위 프로그램은 다음 출력을 생성합니다.
Java에서 int를 이중 변환으로
int에서 double 유형으로 변환하는 전체 프로그램은 다음과 같습니다.
public class IntToDoubleExample {
public static void main(String args[]) {
int i = 200;
double d = i;
System.out.println(d);
}
}
위 프로그램은 다음 출력을 생성합니다.
Java에서 이중 바이트로 변환
더블-바이트 유형 변환의 전체 프로그램은 다음과 같습니다.
public class DoubleTOByteExample {
public static void main(String args[])
{
double d1 = 10.5;
byte b1 = d1; //compile time error
byte b1 = (byte) d1; //compile time error
System.out.println("\ndouble value: " + d1);
System.out.println("Converted byte value: " + b1 );
}
}
위 프로그램은 다음 출력을 생성합니다.
참고. 자바에서 암묵적으로 더블을 바이트로 변환하려고 하면 바이트 데이터 형식이 1바이트의 메모리를 가져가고 더블은 8바이트의 메모리를 가져간다. 1바이트의 메모리에 8바이트의 메모리를 할당하려면 명시적인 캐스팅이 필요합니다.
Java에서 바이트를 이중으로 변환
바이트-더블 유형 변환의 전체 프로그램은 다음과 같습니다.
public class ByteToDoubleExample {
public static void main(String args[]) {
byte b1 = 10;
double d1 = b1;
System.out.println("byte value: " + b1);
System.out.println("Converted double value: " + d1);
}
}
위 프로그램은 다음 출력을 생성합니다.
암시적 타입 캐스팅의 전체 프로그램은 아래에 나열되어 있으며, 여기서 캐스팅은 자동으로 수행됩니다.
public class ImplicitConversionExample {
public static void main(String args[]) {
byte i = 50;
// No casting needed for below conversion
short j = i;
int k = j;
long l = k;
float m = l;
double n = m;
System.out.println("byte value : " + i);
System.out.println("short value : " + j);
System.out.println("int value : " + k);
System.out.println("long value : " + l);
System.out.println("float value : " + m);
System.out.println("double value : " + n);
}
}
위 프로그램은 다음 출력을 생성합니다.
Java에서 클래스 유형의 암시적 캐스팅
더 큰 유형에 더 작은 유형을 할당하는 경우 캐스팅이 필요하지 않습니다.
클래스 유형에도 동일하게 적용됩니다.
전체 프로그램은 아래에 나열되어 있습니다.
class Parent {
public void disp() {
System.out.println("Parent disp called");
}
}
public class ImplicitTypecastingExample2 extends Parent {
//child class
public static void main(String args[]) {
Parent p = new ImplicitTypecastingExample2();
p.disp();
}
}
위 프로그램은 다음 출력을 생성합니다.
Java의 명시적 형변환
한 유형의 데이터가 다른 유형의 변수에 할당될 때 다음 두 가지 조건이 충족되면 축소 유형 변환이 발생합니다.
- 대상 유형이 소스 유형보다 작습니다.
- 이 두 가지 조건이 충족되면 축소 변환이 발생합니다. 예를 들어 int는 모든 유효한 double 값을 보유하기에 충분하지 않으므로 명시적인 캐스트 문이 필요합니다.
더 작은 활자에서 더 큰 활자 크기로 유형 캐스팅:
바이트 -> 짧은 -> 문자 -> int -> 긴 -> 부동 소수점 -> 더블
숫자 유형을 char 또는 부울로 자동 변환하지 않습니다.
또한 char과 boolean은 서로 호환되지 않습니다.
명시적 캐스팅은 Narrowing 캐스팅이라고도 합니다.
축소 또는 명시적 Typecasting의 전체 프로그램은 다음과 같습니다.
public class TypecastingExample4 {
public static void main(String[] args){
float point=10.5f;
int a=f;//Compile time error
int number=(int)point;
System.out.println(point);
System.out.println(point);
}
}
위 프로그램은 컴파일 타임 오류를 생성합니다.
축소형 주조의 전체 프로그램은 다음과 같습니다.
public class TypecastingExample5 {
public static void main(String[] args){
float point=10.5f;
int number=(int)point;
System.out.println(point);
System.out.println(point);
}
}
위 프로그램은 다음 출력을 생성합니다.
참고. 여러분도 알다시피, 정수에는 분수 성분이 없습니다.
따라서 분수 성분은 부동 소수점 값이 정수 유형에 할당되면 손실됩니다.
부동 소수점 값이 정수 유형에 할당되면: 절단이 발생합니다.
예를 들어, 값 45.12가 정수에 할당되면 결과 값은 45가 됩니다.
0.12는 잘립니다.
전체 프로그램은 아래에 나열되어 있습니다.
public class TypecastingExample6 {
public static void main(String[] args){
int number=150;
byte b=(byte)number;
System.out.println(number);
System.out.println(b);
}
}
위 프로그램은 다음 출력을 생성합니다.
전체 프로그램은 아래에 나열되어 있습니다.
public class TypecastingExample7 {
public static void main(String[] args){
byte r=10;
byte s=10;
byte c=r+s;//Compile Time Error: because r+s=20 will be int
System.out.println(c);
}
}
위 프로그램은 컴파일 시간 오류를 생성합니다.
전체 프로그램은 아래에 나열되어 있습니다.
public class TypecastingExample8 {
public static void main(String[] args){
byte r=10;
byte s=10;
byte c=(byte)(r+s);
System.out.println(c);
}
}
위 프로그램은 다음 출력을 생성합니다.
Java에서 이중 바이트로 변환
우리가 알고 있듯이 Java에서 암시적으로 double을 바이트로 변환하려고 하면 오류가 발생합니다.
byte 데이터 유형은 1바이트의 메모리를 사용하고, double은 8바이트의 메모리를 사용합니다.
1바이트 메모리에 8바이트 메모리를 할당하려면 명시적인 캐스팅이 필요합니다.
더블-바이트 변환의 전체 프로그램은 다음과 같습니다.
public class DoubleToByteExplicitConversion {
public static void main(String args[]) {
double d1 = 10.5;
byte b1 = (byte) d1;
System.out.println("\ndouble value: " + d1);
System.out.println("Converted byte value: " + b1);
}
}
위 프로그램은 다음 출력을 생성합니다.
Java에서 클래스 유형의 명시적 유형 캐스팅
더 큰 유형을 더 작은 유형에 할당할 때 이를 명시적으로 유형 변환해야 합니다. 전체 프로그램은 아래에 나열되어 있습니다.
class ParentClass {
public void disp() {
System.out.println("Parent disp called");
}
}
public class ExplicitExample extends Parent {
//child class
public void disp() {
System.out.println("Child disp called");
}
public static void main(String args[]) {
Parent p = new ExplicitExample();
p.disp();
ExplicitExample c = p;
c.disp();
}
}
참고. 위 코드를 실행하면 "유형 불일치: 상위에서 하위로 변환할 수 없습니다."라는 예외가 발생합니다.
코드를 수정하려면 Child 클래스로 캐스팅해야 합니다. 전체 프로그램은 아래에 나열되어 있습니다.
class ParentClass {
public void disp() {
System.out.println("Parent disp called");
}
}
public class ExplicitExample extends Parent {
//child class
public void disp() {
System.out.println("Child disp called");
}
public static void main(String args[]) {
ExplicitExample p = new ExplicitExample();
p.disp();
ExplicitExample c = p;
c.disp();
}
}
위 프로그램은 다음 출력을 생성합니다.
2) 업 캐스팅과 다운 캐스팅
업캐스팅
업캐스팅은 하위 유형을 상속 트리 위쪽의 상위 유형으로 캐스팅하는 것입니다. 업캐스팅은 필요하지 않습니다. 그러나 상위 유형만 다루는 일반 코드를 작성하려면 업캐스팅이 필요합니다. Upcasting의 전체 프로그램은 다음과 같습니다.
class Super {
// super class
void Sample() {
System.out.println("method of super class");
}
}
public class TypecastingExample9 extends Super {
//sub class
void Sample() {
System.out.println("method of sub class");
}
public static void main(String args[]) {
Super obj = (Super) new TypecastingExample9();
obj.Sample();
}
}
위 프로그램은 다음 출력을 생성합니다.
참고 . 캐스팅으로 인해 실제 개체 유형이 변경되지 않습니다. TypecastingExample9 개체는 여전히 TypecastingExample9 개체입니다. 참조 유형만 변경됩니다.
다운 캐스팅
다운캐스팅은 하위 유형을 상속 트리 아래로 캐스팅하는 것입니다.
실제 객체 유형이 대상 객체 유형이 아닌 경우 다운캐스팅이 실패할 수 있습니다.
다운캐스팅은 업캐스팅보다 더 자주 사용됩니다.
하위 유형의 특정 동작에 액세스하려는 경우 다운캐스팅을 사용합니다.
전체 프로그램은 아래에 나열되어 있습니다.
class Super1 {
void Sample() {
System.out.println("method of super class");
}
}
public class TypecastingExample10 extends Super1 {
void Sample() {
System.out.println("method of sub class");
}
public static void main(String args[]) {
Super1 obj = new TypecastingExample10();
TypecastingExample10 sub = (TypecastingExample10) obj;
sub.Sample();
}
}
위 프로그램은 다음 출력을 생성합니다.
참고 . 여기에서 Teaching() 메소드에서는 전달된 Dog 객체의 인스턴스가 있는지 확인하고 이를 Dog 유형으로 다운캐스트한 다음 해당 특정 메소드인bark()를 호출합니다.
오토박싱과 언박싱
오토박싱
오토박싱은 기본 유형 변수를 해당 래퍼 클래스 객체로 자동 변환하는 것을 의미합니다.
기본 값이 다음과 같은 경우 컴파일러는 자동으로 변환을 처리합니다.
- 래퍼 클래스 객체를 기대하는 함수에 인수로 전달됩니다.
- 래퍼 클래스 유형의 변수에 할당됩니다.
Autoboxing의 전체 프로그램은 다음과 같습니다.
import java.util.ArrayList;
import java.util.List;
public class TypecastingExample11 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
//autoboxing by passing as an argument
//int values is converted to Integer
//by compiler during compilation
list.add(i);
}
System.out.println(list);
char c = 'a';
//autoboxing by assigning an char to Character object
Character ch = c;
System.out.println(ch);
}
}
위 프로그램은 다음 출력을 생성합니다.
언박싱
래퍼 유형의 개체를 해당 기본 값으로 변환하는 것을 박싱 해제라고 합니다.
예를 들어 정수를 int로 변환합니다.
Java 컴파일러는 래퍼 클래스의 객체가 다음과 같은 경우 언박싱을 적용합니다.
- 해당 기본 유형의 값을 기대하는 메소드에 매개변수로 전달됩니다.
- 해당 기본 유형의 변수에 할당됩니다.
언박싱의 전체 프로그램은 다음과 같습니다.
public class TypecastingExample12 {
public static void main(String[] args) {
Integer integer = new Integer(-10);
int i = abs(integer);
System.out.println(i);
int j = integer;
System.out.println(j);
}
private static int abs(int i) {
return (i < 0) ? -i : i;
}
}
위 프로그램은 다음 출력을 생성합니다.
이 포스팅에서는 Java의 유형 캐스팅 또는 변환에 대해 알아보고 Java 프로그래밍 언어에서 유형 캐스팅을 사용하는 방법을 예제와 함께 배웠습니다.
'자바(Java)' 카테고리의 다른 글
Java의 스택 클래스 (1) | 2024.02.05 |
---|---|
Java의 무작위 클래스 (0) | 2024.02.04 |
Java의 명명 규칙 (1) | 2024.02.04 |
Spring Boo란 무엇일까? (0) | 2024.02.03 |
Java의 Excel에서 조건부 포맷을 사용하여 셀 강조 표시 (0) | 2024.02.03 |