[Java] 형변환(Casting)

Kim yeonhee·2024년 12월 8일

Java

목록 보기
2/3


어떠한 변수형을 다른 형으로 강제로 치환해야 할 경우 형변환을 사용한다.
변수형 타입이 맞지 않은 상태에서 계산하거나 리턴하는 경우 오류가 발생한다.
이번 글은 자바의 형변환에 대해서 정리를 해보려고 한다.


String to Int

문자열에서 정수형으로 형변환 하는 방법은 두가지가 있다.

(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일 내용 추가

Data의 크기가 큰 String → int형

💀 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 로 계산이 올바르게 된 것을 확인할 수 있다.



String to Double, Float

(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값을 준 뒤 테스트했다.
문자열을 실수형으로 변환이 잘 된 것을 확인할 수 있다.



Int to String

정수형에서 문자열로 변환하는 방법은 두가지가 있다.

(1) String.valueOf();
   → String 클래스 내부에 있는 메서드이며, 매개변수를 받아서 문자열로 반환한다.
(2) Integer.toString();
   → Integer 클래스 내부에 있는 메서드이며 int 타입의 정수를 매개변수로 받아서 문자열로 반환한다.

위 메서드들은 변환하는 정수 타입이 int(Primitive type)인지 Integer(Wrapper class)인지에 따라 차이가 발생한다.

String클래스의 valueOf()메서드 자체가 Integer.toString()메서드를 사용하고 있기 때문에
매개변수에 int를 사용할 때 두 메서드는 동일하게 동작한다.


💡 Wrapper class인 Integer의 값이 null일 경우

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);
	}


정수형이 문자열로 변환이 잘 된 것을 확인할 수 있다.



Double Float to String

정수형과 마찬가지로 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);
	}

Double, Float to Int

실수를 정수로 치환하는 방법은 (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);
	}

Int to Double, Float

정수형을 실수형으로 변경하는 방법은 마찬가지로 (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_numdouble, float형으로 변환 되어서 3.0으로 출력되는 것을 확인할 수 있다.
출력 결과는 같다.




출처/참고한글
JUnit assertions : make the assertion between floats

0개의 댓글