Java

[Java] Sting, Int, Char 타입 변환

얼복무 2024. 11. 15. 20:03

 

은근히 쓰려고 하면 헷갈리는 타입 변환들...

방법도 많고 메소드도 많고 한 번에 정리해두는 게 좋을 것 같아 모아서 포스팅 해봅니다.

 

String으로 변환

1. Int to String

String.valueOf()

int num = 123;
String str = String.valueOf(num);
System.out.println(str);  // 출력: "123"

 

Integer.toString()

int num = 123;
String str = Integer.toString(num);
System.out.println(str);  // 출력: "123"

 

문자열 덧셈 연산자 사용

int num = 123;
String str = num + "";
System.out.println(str);  // 출력: "123"

 

toString과 valueOf의 차이점

왜 Integer 클래스에서 사용하지 않고 String 클래스의 메소드를 사용하냐면. null 처리 때문입니다.

기본 자료형인 int는 null 값이 들어갈 수가 없으니 당연히 Integer 클래스를 사용할 때 차이가 있습니다.

 

//toString 메소드
public static String toString(int i) {
    if (i == Integer.MIN_VALUE)
        return "-2147483648";
    int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
    char[] buf = new char[size];
    getChars(i, size, buf);
    return new String(buf, true);
}

//int
public static String valueOf(int i) {
	return Integer.toString(i);
}

//오브젝트(Integer 등..)
public static String valueOf(Object obj) {  
       return (obj == null) ? "null" : obj.toString();  
   }

 

 

valueOf는 Wrapper 클래스에 구현된 toString을 호출하는 건 동일합니다.

그러나 Integer 객체를 매개변수로 valueOf를 호출하면 객체가 null일 때 "null"이라는 String을 반환해주게 됩니다.

즉 NullPointException 오류가 발생할 경우가 줄어들게 되죠. 

 

하지만 대부분의 경우 기본 자료형 int, double 등... 을 다루게 될 테니 toString과 valueOf 사이에 큰 차이는 없습니다.

성능을 조금 더 고려한다면 메소드를 한 번 더 호출해야 하는 valueOf보다 toString이 더 낫겠죠.

 

 

2. Char to String

String.valueOf()

char ch = 'A';
String str = String.valueOf(ch);
System.out.println(str);  // 출력: "A"

 

Character.toString()

char ch = 'A';
String str = Character.toString(ch);
System.out.println(str);  // 출력: "A"

 

문자열 덧셈 연산자 사용

char ch = 'A';
String str = ch + "";
System.out.println(str);  // 출력: "A"

 

 

3. Array(char) to String

String 생성자 사용

char[] chars = {'J', 'a', 'v', 'a'};
String str = new String(chars);
System.out.println(str);  // 출력: "Java"

 

String.valueOf()

char[] chars = {'J', 'a', 'v', 'a'};
String str = String.valueOf(chars);
System.out.println(str);  // 출력: "Java"

 

4. Array to String

Arrays.toString()

일반 스트링 형태가 아닌 [J, a, v, a] 처럼 배열의 요소 형태로 출력

char[] chars = {'J', 'a', 'v', 'a'};
String str = Arrays.toString(chars);  // char[] 배열을 문자열로 변환
System.out.println(str);  // 출력: "[J, a, v, a]" (배열의 요소가 쉼표로 구분됨)
int[] nums = {1, 2, 3, 4};
String str = Arrays.toString(nums);
System.out.println(str);  // 출력: "[1, 2, 3, 4]"

 

5. 'StringBuilder' 또는 'StringBuffer'

StringBuilder

단일 스레드 환경에서 더 적합함. 속도 빠름.

int num = 123;
char ch = 'A';
String str = new StringBuilder().append(num).append(ch).toString();
System.out.println(str);  // 출력: "123A"


StringBuffer

동기화 지원. 멀티 스레드 환경에서 더 적합함.

int num = 123;
char ch = 'A';
String str = new StringBuffer().append(num).append(ch).toString();
System.out.println(str);  // 출력: "123A"

 

Int로 변환

1. String to Int

String.parseInt

String str = "111";
int num = Integer.parseInt(str);

 

Integer.valueOf

String str = "111";
int num = Integer.valueOf(str);

 

paseInt와 valueOf의 차이점

valueOf라는 메소드 자체는 String이나 Integer 등 많은 클래스에서 찾아볼 수 있습니다.

결과도 동일하게 출력한다면 궁극적으로 valueOf와 다른 메소드의 차이란 무엇인가 하는 생각이 들죠.

그건 바로 결과값의 차이입니다.

public static int parseInt(String s) throws NumberFormatException {
    return parseInt(s,10);
}

public static Integer valueOf(String s, int radix) throws NumberFormatException {
    return Integer.valueOf(parseInt(s,radix));
}
public static Integer valueOf(int i) {
	final int offset = 128;
	if (i >= -128 && i <= 127) { // must cache
		return IntegerCache.cache[i + offset];
	}
	return new Integer(i);
}

 

parseInt는 기본 자료형(Primitive Type)인 int를 반환합니다.

 

valueOf는 메소드 안에서 parseInt을 부르고, 그걸 한 번 더 감싸는 작업을 거쳐 참조 자료형(Reference Type)인 Integer (Wrapper 객체)를 반환합니다.

 

Java 1.5부터 오토박싱, 오토언박싱을 제공하면서 int로 선언한 객체에서도 valueOf 메소드를 사용할 수 있어 실제로 출력되는 결과는 같지만 상황에 따라 적절한 메소드를 사용하시면 됩니다.

 

2. Char to Int

ASCII 코드로 계산하기

유니코드 값으로 '1'은 49고, '0'은 48입니다. 그래서 '1'-'0'을 하면 1이 나옵니다.

이런 방식은 0부터 9까지의 숫자만 사용 가능합니다.

char c = '1'; // 문자 '1'
int i = c - '0'; // '1'에서 '0'을 빼면 숫자 1이 됩니다.
System.out.println(i); // 1 출력

 

 

Character.getNumericValue

char c = '1';
int i = Character.getNumericValue(c); // '1'을 1로 변환
System.out.println(i); //1 출력

 

Char로 변환

1. Int to Char

ASCII 코드로 계산하기

반대로 int에 '0'을 더하면 char로 변환할 수 있습니다.

int num = 3;
char ch = (char) ('0' + num); // '0'에 숫자를 더해서 문자 '3'을 얻음
System.out.println(ch); // 3 출력

 

2. String to Char Array

toCharArray()

String str = "Hello, World!";
        
// String을 char[] 배열로 변환
char[] charArray = str.toCharArray();

for (char c : charArray) {
    System.out.print(c +" ");
}

//출력: H e l l o , W o r l d !

 

3. 문자열 중 특정 문자

charAt(int index)

문자열의 인덱스는 0부터 length() - 1까지입니다.
빈 문자열에서 charAt(0)을 호출하면 예외가 발생합니다.

String str = "Hello, World!";        
// 인덱스 0에서 문자 얻기

char ch1 = str.charAt(0);  // 'H'
System.out.println(ch1);    // H 출력        

// 인덱스 7에서 문자 얻기
char ch2 = str.charAt(7);  // 'W'
System.out.println(ch2);    // W 출력        

// 마지막 문자 얻기 (인덱스 12)
char ch3 = str.charAt(str.length() - 1); // '!'
System.out.println(ch3);    // ! 출력