

어떠한 변수형을 다른 형으로 강제로 치환해야 할 경우 형변환을 사용한다.
변수형 타입이 맞지 않은 상태에서 계산하거나 리턴하는 경우 오류가 발생한다.
이번 글은 자바의 형변환에 대해서 정리를 해보려고 한다.
문자열에서 정수형으로 형변환 하는 방법은 두가지가 있다.
(1) Integer.parsInt();
→ 결과 값을 기본 자료형(Primitive Type)인 int로 반환한다.
(2) Integer.valueOf();
→ 결과 값을 참조 자료형(Reference Type)인 Integer 객체로 만들어 반환한다.
String → Int 테스트 코드
public class CastingTest {
public String str_num = "5";
@Test
@DisplayName("String to Int Casting")
public void stringToInt() {
int num_1 = Integer.parseInt(str_num);
int num_2 = Integer.valueOf(str_num);
Assertions.assertEquals(num_1+num_2, 10);
}
}

문자열을 정수형으로 변환한 후 계산이 잘 실행된 것을 확인할 수 있다.
24년 12월 9일 내용 추가
💀 String에서 정수형으로 형변환 시 NumberFormatException.forInputString 에러가 발생했다.

int 타입은 -2,147,483,648 ~ 2,147,483,647 까지의 숫자를 표현할 수 있고,
Long 타입은 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 까지 표현할 수 있다.
만약 Long보다 긴 경우는 BigInteger클래스를 이용해야한다.
자료형의 크기도 잘 확인해서 사용해야한다!
String -> bigInteger 테스트 예제
import java.math.BigInteger;
public class Test {
public static void main(String[] args) {
System.out.println(solution("18446744073709551615", "287346502836570928366"));
}
public static String solution(String a, String b) {
BigInteger b1 = new BigInteger(a);
BigInteger b2 = new BigInteger(b);
return String.valueOf(b1.add(b2));
}
}

bigInteger 로 계산이 올바르게 된 것을 확인할 수 있다.
(1) Double.valueOf();
(2) Float.valueOf();
String → Double 테스트 코드
public String str_num2 = "1.6";
@Test
@DisplayName("String To Double Casting")
public void stringToDouble() {
double d_num = Double.valueOf(str_num2);
System.out.println(d_num);
Assertions.assertEquals(d_num , 1.6, 0.00002);
}
String → float 테스트 코드
public String str_num2 = "1.6";
@Test
@DisplayName("String To Float Casting")
public void stringToFloat() {
float f_num = Float.valueOf(str_num2);
System.out.println(f_num);
Assertions.assertEquals(f_num , 1.6, 0.00002);
}

실수형 변수는 오차 범위가 있기 때문에 테스트 시 delta값을 준 뒤 테스트했다.
문자열을 실수형으로 변환이 잘 된 것을 확인할 수 있다.
정수형에서 문자열로 변환하는 방법은 두가지가 있다.
(1) String.valueOf();
→ String 클래스 내부에 있는 메서드이며, 매개변수를 받아서 문자열로 반환한다.
(2) Integer.toString();
→ Integer 클래스 내부에 있는 메서드이며 int 타입의 정수를 매개변수로 받아서 문자열로 반환한다.
위 메서드들은 변환하는 정수 타입이 int(Primitive type)인지 Integer(Wrapper class)인지에 따라 차이가 발생한다.
String클래스의 valueOf()메서드 자체가 Integer.toString()메서드를 사용하고 있기 때문에
매개변수에 int를 사용할 때 두 메서드는 동일하게 동작한다.
String.valueOf()의 경우에는 값이 잘 나오지만,
Integer.toString() 메서드에서 NullPointerException을 던진다.
public class Test {
public static void main(String[] args) {
Integer integer = null;
System.out.println(String.valueOf(integer));
System.out.println(Integer.toString(integer));
}
}

Int → String 테스트 코드
public int num = 3;
@Test
@DisplayName("Int To String Casting")
public void intToString() {
String str_1 = String.valueOf(num);
String str_2 = Integer.toString(num);
Assertions.assertEquals(str_1, str_2);
}

정수형이 문자열로 변환이 잘 된 것을 확인할 수 있다.
정수형과 마찬가지로 toString(), String.valueOf() 함수로 치환할 수 있다.
float, double → String 테스트 코드
public void castingToString() {
double d_num = 15.15;
float f_num = 15.15f;
String s_num = "";
// double
s_num = String.valueOf(d_num);
s_num = Double.toString(d_num);
// float
s_num = String.valueOf(f_num);
s_num = Float.toString(f_num);
}
실수를 정수로 치환하는 방법은 (int) 캐스팅 방식으로 변환할 수 있다.
이 때 소수점 아래는 버려진다.
float, double → int 테스트 코드
public double d_num = 10.14;
public float f_num = 10.33f;
@Test
@DisplayName("Casting to Int")
public void castingToInt() {
int i_num = (int)d_num;
int i_num2 = (int)f_num;
Assertions.assertEquals(i_num, i_num2);
}

정수형을 실수형으로 변경하는 방법은 마찬가지로 (double), (float) 로 변환할 수 있다.
int → double 테스트 코드
public int i_num = 3;
@Test
@DisplayName("Casting to Double")
public void castingToDouble() {
double d_num = (double)i_num;
System.out.println(d_num);
}
int → float 테스트 코드
@Test
@DisplayName("Casting to Float")
public void castingToFloat() {
float f_num = (float)i_num;
System.out.println(f_num);
}

int형 변수 i_num이 double, float형으로 변환 되어서 3.0으로 출력되는 것을 확인할 수 있다.
출력 결과는 같다.
출처/참고한글
JUnit assertions : make the assertion between floats