[Java] Sting, Int, Char 타입 변환
은근히 쓰려고 하면 헷갈리는 타입 변환들...
방법도 많고 메소드도 많고 한 번에 정리해두는 게 좋을 것 같아 모아서 포스팅 해봅니다.
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); // ! 출력