3. [Java] 영어가 싫어요 - numbers.replaceAll(a,b);
https://school.programmers.co.kr/learn/courses/30/lessons/120894
틀린 코드
class Solution {
public long solution(String numbers) {
String[] words = {
"zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine"
};
for (int i = 0; i < words.length; i++) {
numbers = numbers.replace(words[i], String.valueOf(i));
}
return Integer.parseInt(numbers);
}
}
테스트는 통과했으나 답안 제출시 런타임 에러
✅ Integer.parseInt() 사용 시 런타임 에러
- 만약 숫자 문자열이 int의 범위를 초과하면 런타임 에러가 발생한다.
- 그래서 일부 테스트 케이스에서 에러가 난 것
- 예를 들어서, 만약 13자리 숫자가 들어오면 int(32비트 정수)의 최대값 2,147,483,647을 초과함
- → Integer.parseInt()는 처리 못 함 → 런타임 에러 (NumberFormatException) 발생
- 따라서 return 타입을 int가 아니라 long 타입으로 변경해야 한다.
개선한 코드
class Solution {
public long solution(String numbers) {
String[] words = {
"zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine"
};
for (int i = 0; i < words.length; i++) {
numbers = numbers.replaceAll(words[i], String.valueOf(i));
}
return Long.parseLong(numbers); // ✅ int → long 으로 변경
}
}
기본형 VS 래퍼클래스
✅ 기본형 (Primitive type)
- int → 기본형 정수 타입 (primitive int)
- long → 기본형 정수 타입 (primitive long)
👉 메모리에 값 자체를 저장함
👉 성능이 빠르고 메모리 사용이 효율적
✅ 참조형 (Reference type, Wrapper class)
- Integer → 참조형 (래퍼 클래스, Wrapper class for int)
- Long → 참조형 (래퍼 클래스, Wrapper class for long)
👉 객체이기 때문에 null 값을 가질 수 있음
👉 ArrayList<Integer>처럼 제네릭에 사용 가능
👉 기본형은 제네릭에서 사용할 수 없음 → 참조형 필요