자바 - 형 변환(Type Conversion)
<목차>
• 형 변환(Type Conversion)
형 변환은 하나의 데이터의 유형을 다른 데이터 유형으로 변환하는 것을 말한다. 형 변환은 데이터의 유형이 서로 호환 가능할 때만 사용이 가능하다. 형 변환은 크게 두 가지 유형으로 나뉜다. 암시적 형 변환(implicit type conversion)과 명시적 형 변환(explicit type conversion)이다.
1. 암시적 형 변환(자동 형 변환, Implicit Type Conversion)
데이터 타입을 자동으로 변환하는 것을 뜻한다. 다시 말해서 컴파일러나 인터프리터가 프로그램 실행 중에 자동으로 타입 변환을 수행하는 것을 말한다. 하지만 때로는 의도치 않은 결과를 초래할 수 있다.
<요약>
- 더 작은 데이터 유형에서 더 큰 데이터 유형으로 변환되는 것을 의미한다.
- 데이터 손실이 없거나 최소화된다. 대표적인 예로 정수를 부동 소수점 수로 변환할 때 소수점 이하 자리가 추가될 수 있다.
- 크기에 따른 자료형 계층 구조에 따라 발생한다.
2. 명시적 형 변환(강제 형 변환, Explicit Type Conversion, Casting)
프로그래머가 직접 데이터 타입을 변환하는 것을 의미한다. 프로그래밍 언어에서 제공하는 형 변환 연산자나 함수를 사용하여 데이터를 다른 데이터 타입으로 변환하는 것을 말한다.
프로그래머가 직접 변환을 하기 때문에 데이터 손실이나 예기치 않은 오류에 대한 주의가 필요하다. 잘못된 형 변환은 에러를 유발한다.
<요약>
- 더 큰 데이터 유형에서 더 작은 데이터 유형으로 변환하거나, 데이터 유형을 명시적으로 지정하여 변환
- 데이터 손실이 발생할 수 있다. 예를 들어 실수를 정수로 변환할 때 소수점 이하 값이 버려지는 것
- 형 변환 연산자를 사용하여 수행한다.
<예시>
public class sample {
public static void main (String[] args) {
System.out.println("암시적 형 변환(자동 형 변환)");
// int -> double
int a = 10;
double doubleValue = a;
// 작은 데이터 -> 큰 데이터 유형
byte b = 5;
int intValue1 = b;
// 문자<char>에서 정수(int)
char c = 'A';
int intValue2 = c; // 유니코드 값으로 반환
System.out.println(doubleValue + ", " + intValue1 + ", " + intValue2);
System.out.println("명시적 형 변환(강제 형 변환)");
// 큰 데이터 -> 작은 데이터 유형
double d = 3.14;
int intValue3 = (int) d;
// 정수 -> 바이트(byte)
int e = 200;
byte bytValue = (byte) e; // 범위를 벗어나면 데이터 손실
// 문자열(String)에서 정수(int)
String f = "123";
int intValue4 = Integer.parseInt(f);
// 정수 -> 문자(char)
int g = 63;
char charValue = (char) g; // 유니코드 값으로 '?' 출력
// 정수에서 부동 소수점 수로
int h = 13;
float floatValue = (float) h;
// 정수(int)를 문자열(String)로
int j = 123;
String strValue1 = "" + j; // 정수 앞에 빈 문자열을 더해주면 문자열이 된다.
String strValue2 = String.valueOf(j);
String strValue3 = Integer.toString(j);
System.out.println(intValue3 + " " + bytValue + " " + intValue4 + " " + charValue + " " + floatValue);
System.out.println("문자열 변환 : " + strValue1 + " " + strValue2 + " " + strValue3);
}
}
<결과>
암시적 형 변환(자동 형 변환) 10.0, 5, 65 명시적 형 변환(강제 형 변환) 3 -56 123 ? 13.0 문자열 변환 : 123 123 123 |
• 추가 내용(final과 다양한 형 변환)
1. Final
'final'은 변수, 메서드, 클래스에 적용되는 키워드로, 해당 요소가 변경되지 않도록 한다. 한 번 적용된 요소는 변경할 수 없으며, 값이나 동작이 고정된다.
<예시>
public class sample {
public static void main (String[] args) {
// final 변수
final int num = 3; // num은 상수로 값 변경 불가
// final 메서드
// 해당 메서드는 하위 클래스에서 오버라이드(재정의) 불가
class fm {
final void printMessage() {
System.out.println("final method");
}
}
// final 클래스
// 해당 클래스는 상속을 금지한다. 즉, 다른 클래스에서 사용할 수 없다.
final class finalClass {
// 내용 생략...
}
// list의 경우에도 final로 재할당 못하게 막을 수 있다.
// 다만 add, remove 가능하기 때문에 "final List<?> a = List.of("a", "b");"라고 하면 할당, 변경이 금지된다.
}
}
2. 형 변환과 관련된 키워드
(1) 캐스팅 연산자
'(타입)' 형태로 사용하는 명시적 형 변환(강제, 캐스팅)을 위해 사용되는 연산자이다. 데이터를 원하는 타입으로 변환한다.
형 변환의 예시에서 다룬 적 있다.
(2) instanceof 연산자
객체의 타입을 확인하기 위한 연산자, 특정 타입에 해당하는지 여부를 판단할 수 있다.
if (obj instanceof MyClass) {
MyClass myObj = (MyClass) obj; // 객체를 MyClass로 형 변환했다.
}
(3) auto unboxing 및 auto boxing
워닛 타입과 래퍼 클래스 간의 자동 변환 기능을 제공한다.
[참고] - https://bluenoa.tistory.com/78#text4
자바 - 문자
문자열 문자열 포매팅 포맷 코드 원시 자료형 • 문자열 자바에서 문자열(String)은 텍스트 데이터를 나타내는 데 사용되는 자료형이다. 문자열은 여러 개의 문자들로 구성되거나 단일 문자일 수
bluenoa.tistory.com
Integer integerObj = 10; // auto boxing
int intValue = integerObj; // auto unboxing
(4) 타입 캐스팅 메서드
래퍼 클래스들은 데이터를 원시 타입으로 변환하는 메서드를 제공한다.
Integer integerObj = 20;
int intVlaue = integerObj.intValue(); // Integer -> int 변환
(5) Arrays 클래스의 변환 메서드
import java.util.Arrays;
public class sample {
public static void main (String[] args) {
int[] intArray = {10, 22, 48};
// 방법1
double[] doubleArray = Arrays.stream(intArray).asDoubleStream().toArray();
System.out.println(Arrays.toString(doubleArray));
// 방법2
double[] doubleArray2 = new double[3];
for (int i=0; i < intArray.length; i++) {
doubleArray2[i] = intArray[i];
}
System.out.println(Arrays.toString(doubleArray2));
}
}