안드로이드/자바 형 변환 완벽 정리: String ↔ int 안전하게 바꾸기

Prompt Architect 편집팀 · 2026-06-18 · 7분

TL;DR — 안드로이드와 자바에서 String을 int로, int를 String으로 변환하는 표준 방법과 NumberFormatException 같은 흔한 오류를 안전하게 막는 실무 패턴을 정리했습니다.

안드로이드 앱을 만들다 보면 사용자가 EditText에 입력한 값은 숫자처럼 보여도 사실은 문자열(String) 이고, 화면에 표시하려는 숫자는 정수(int) 인 경우가 대부분입니다. 이 둘 사이의 경계를 제대로 넘지 못하면 컴파일 에러가 나거나, 더 무섭게는 런타임에 앱이 그대로 멈춰버립니다. 이 글에서는 Stringint 사이의 형 변환을 단순히 "한 줄짜리 코드"로 외우는 데서 끝내지 않고, 왜 변환이 필요한지, 어떤 함정이 있는지, 실무에서 어떻게 안전하게 처리하는지까지 한 번에 정리합니다.

1. 왜 형 변환이 필요한가

가장 흔한 시나리오는 사용자 입력 처리입니다. 예를 들어 수량을 입력받는 화면을 생각해봅시다.

// EditText에서 가져온 값은 항상 String이다
String quantityText = quantityInput.getText().toString();

// 아래처럼 바로 더하기를 하면 의도와 다르게 동작한다
String wrong = quantityText + 1;   // "10" + 1 → "101" (문자열 이어붙이기!)

"10" + 1의 결과는 11이 아니라 "101" 입니다. 문자열에 +를 쓰면 산술 덧셈이 아니라 연결(concatenation) 이 되기 때문입니다. 숫자 계산을 하려면 반드시 String을 int로 바꿔야 합니다. 반대로 계산 결과를 화면(TextView)에 보여주려면 int를 다시 String으로 바꿔야 하죠. 이렇게 양방향 변환은 안드로이드 개발의 가장 기초적이면서도 가장 자주 쓰이는 작업입니다.

2. 타입의 개념: 원시 타입 vs 래퍼 클래스

변환을 이해하려면 두 가지 개념을 구분해야 합니다.

  • 원시 타입(primitive): int, long, double 등. 값 자체를 직접 담는 가벼운 타입입니다.
  • 래퍼 클래스(wrapper): Integer, Long, Double 등. 원시 값을 객체로 감싼 형태이며, 변환에 쓰는 유틸리티 메서드를 제공합니다.

int로 바꾸는 도구는 래퍼 클래스인 Integer가 들고 있고, String으로 바꾸는 도구는 String 클래스 자체가 들고 있다고 기억하면 헷갈리지 않습니다.

3. String → int 변환

가장 표준적인 방법은 Integer.parseInt() 입니다.

// 문자열을 정수로 변환
String priceText = "2500";
int price = Integer.parseInt(priceText);   // price == 2500

int doubled = price * 2;                    // 이제 산술 계산 가능 → 5000

Integer.parseInt()는 문자열을 분석해 원시 타입 int 를 돌려줍니다. 만약 객체 형태인 Integer가 필요하다면 Integer.valueOf()를 쓸 수 있습니다.

// 원시 int 대신 Integer 객체가 필요할 때
Integer count = Integer.valueOf("42");   // 내부적으로 -128~127은 캐싱됨

둘의 차이는 미묘합니다. parseIntint를, valueOfInteger를 반환하며, 컬렉션(List<Integer>)에 담거나 null 가능성을 표현해야 할 때는 valueOf 쪽이 자연스럽습니다. 단순 계산용이라면 parseInt로 충분합니다.

4. int → String 변환

정수를 문자열로 바꾸는 표준 방법은 String.valueOf() 입니다.

// 정수를 문자열로 변환
int score = 98;
String scoreText = String.valueOf(score);   // "98"

resultView.setText(scoreText);              // TextView에 안전하게 표시

이 외에도 자주 보이는 방법이 몇 가지 더 있습니다.

int level = 7;

// 방법 1: String.valueOf — 가장 권장 (null도 "null"로 안전하게 처리)
String a = String.valueOf(level);

// 방법 2: Integer.toString — 명시적이고 의도가 분명함
String b = Integer.toString(level);

// 방법 3: 빈 문자열 이어붙이기 — 동작은 하지만 권장하지 않음
String c = "" + level;

세 방법 모두 "7"을 만들지만, String.valueOf()를 1순위로 권합니다. 이유는 null 안전성 때문입니다. 만약 변환 대상이 Integer 객체이고 그 값이 null이라면, String.valueOf(null)NullPointerException 없이 문자열 "null"을 돌려주지만, someInteger.toString()은 그대로 크래시가 납니다. "" + level 방식은 동작은 하지만 가독성이 떨어지고 컴파일러가 불필요한 객체를 만들 수 있어 코드 리뷰에서 지적받기 쉽습니다.

5. 예외 처리와 안전한 변환 패턴

여기가 실무에서 가장 중요한 부분입니다. Integer.parseInt()숫자가 아닌 문자열을 만나면 NumberFormatException을 던집니다.

int n = Integer.parseInt("12abc");   // NumberFormatException 발생 → 앱 크래시!
int m = Integer.parseInt("");        // 빈 문자열도 예외
int k = Integer.parseInt(" 30 ");    // 앞뒤 공백 때문에 예외

사용자 입력은 절대 신뢰할 수 없으므로, 변환은 항상 방어적으로 작성해야 합니다. 가장 기본적인 방법은 try-catch입니다.

// 안전한 변환: 실패하면 기본값(0) 반환
int parseSafely(String input) {
    try {
        return Integer.parseInt(input.trim());   // trim으로 공백 제거
    } catch (NumberFormatException e) {
        return 0;   // 또는 사용자에게 오류 안내
    }
}

좀 더 깔끔하게 하려면, 변환 전에 입력 자체를 검증할 수도 있습니다.

// 변환 전 사전 검증
String raw = quantityInput.getText().toString().trim();

if (raw.isEmpty()) {
    showToast("값을 입력해 주세요");
    return;
}

int quantity;
try {
    quantity = Integer.parseInt(raw);
} catch (NumberFormatException e) {
    showToast("숫자만 입력할 수 있습니다");
    return;
}
// 여기서부터 quantity는 안전하게 사용 가능

코틀린을 쓴다면 더 우아한 방법이 있습니다. toIntOrNull()은 변환 실패 시 예외 대신 null을 돌려줘서 try-catch 없이도 안전합니다.

// 코틀린: 실패하면 null, 엘비스 연산자로 기본값 지정
val quantity: Int = raw.toIntOrNull() ?: 0

// 정수 → 문자열은 toString()으로 충분
val text: String = quantity.toString()

6. 흔한 실수와 엣지 케이스

  • 공백 미처리: "30 "이나 " 30"처럼 앞뒤 공백이 있으면 예외가 납니다. 변환 전 .trim()을 습관화하세요.
  • int 범위 초과: int는 약 ±21억(2,147,483,647)까지만 담습니다. 전화번호나 큰 ID를 Integer.parseInt로 바꾸면 오버플로/예외가 날 수 있으니 이런 값은 long(Long.parseLong)이나 그냥 String으로 다루세요.
  • 천 단위 콤마: "1,000"은 숫자가 아니라 예외 대상입니다. 콤마를 먼저 제거(replace(",", ""))해야 합니다.
  • 앞자리 0: "007"은 정상 변환되어 7이 됩니다(예외 아님). 다만 변환하면 앞의 0이 사라지므로, 우편번호처럼 0이 의미 있는 값은 String으로 유지해야 합니다.
  • null 입력: Integer.parseInt(null)NumberFormatException을 던집니다. null 가능성이 있으면 변환 전에 확인하세요.

7. 요약

변환 방향 권장 메서드 주의점
String → int Integer.parseInt(s) NumberFormatException 방어 필수
String → Integer Integer.valueOf(s) 컬렉션/null 표현에 적합
int → String String.valueOf(n) null 안전, 1순위 권장
int → String Integer.toString(n) 의도 명확, null 객체 주의

핵심은 변환 메서드 자체는 한 줄이지만, 사용자 입력을 다룰 때는 반드시 예외 처리를 동반해야 한다는 점입니다. 변환 코드 한 줄을 외우는 것보다, "이 입력이 숫자가 아닐 수 있다"는 가정을 항상 깔고 코드를 짜는 습관이 훨씬 중요합니다.

AI에게 물어볼 때 (프롬프트 팁)

이런 형 변환·예외 처리 문제는 AI에게 물어보면 빠르게 해결되지만, 질문을 구체적으로 던질수록 정답에 가까운 코드를 받습니다. Prompt Architect의 관점에서 효과적인 프롬프트 예시 세 가지를 소개합니다.

1) 맥락 + 제약을 명시한 변환 요청

안드로이드(Java)에서 EditText의 문자열을 int로 변환하려고 해.
입력이 비어 있거나 숫자가 아닐 수 있어. NumberFormatException으로
앱이 죽지 않도록 try-catch를 포함한 안전한 변환 함수를 작성하고,
실패 시 사용자에게 Toast로 안내하는 코드까지 보여줘.

2) 동작하지 않는 코드의 원인 진단 요청

아래 코드에서 "10" + 1 의 결과가 11이 아니라 101이 나와.
왜 이런 결과가 나오는지 자바의 타입 관점에서 설명하고,
올바르게 산술 덧셈을 하려면 어떻게 고쳐야 하는지 알려줘.
[여기에 코드 붙여넣기]

3) 언어/버전 비교 요청

String을 int로 변환하는 방법을 자바와 코틀린에서 각각 보여주고,
코틀린의 toIntOrNull()이 자바의 Integer.parseInt + try-catch에 비해
어떤 장점이 있는지 표로 비교해줘.

이처럼 언어와 버전, 입력의 불확실성, 원하는 출력 형태(함수/표/설명) 를 명시하면 AI가 훨씬 정확하고 바로 쓸 수 있는 코드를 돌려줍니다. 좋은 답은 좋은 질문에서 나온다는 원칙은 형 변환 같은 작은 문제에서도 똑같이 적용됩니다.