int에서 String으로 어떻게 변환합니까?


745

나는 어디에서 모든 변환 프로젝트에서 일하고 있어요 intString 다음과 같이 수행됩니다 :

int i = 5;
String strI = "" + i;

Java에 익숙하지 않습니다.

내가 생각하는 것처럼 이것이 일반적인 습관입니까? 아니면 잘못된 것입니까?


47
"바보, 쉽게" 방법은 문자열 = ""+ 정수이고;
Fattie


2
방금 "빠르고 간단한"방법입니다. 조금 바보이지만 작동합니다!
Fattie

1
내 동료가했다 Integer.valueOf(i).toString(). 그는 물건을 좋아했을 것입니다. 그것은 그의 의도를 매우 분명히 나타내지 만, 내 취향에는 약간 길다.
Ole VV

5
45 줄의 코드 만 있으면 7 개의 인터페이스를 구현할 수 있습니다.
Ska

답변:


958

일반적인 방법은 Integer.toString(i)또는 String.valueOf(i)입니다.

연결은 작동하지만, 저자가 위의 두 가지 방법에 대해 알지 못한다는 것을 암시하는 것은 독창적이지 않으며 나쁜 냄새가 날 수 있습니다.

Java는 문자열과 함께 사용될 때 + 연산자를 특별히 지원합니다 ( 문서 참조 ).

StringBuilder sb = new StringBuilder();
sb.append("");
sb.append(i);
String strI = sb.toString();

컴파일 타임에. 그것은 약간 덜 효율적인 (의 sb.append()호출 끝나는 Integer.getChars()것 인, Integer.toString()어쨌든 했을),하지만 작동합니다.

Grodriguez의 의견에 대답 : ** 아니오, 컴파일러 이 경우 빈 문자열을 최적화 하지 않습니다 .

simon@lucifer:~$ cat TestClass.java
public class TestClass {
  public static void main(String[] args) {
    int i = 5;
    String strI = "" + i;
  }
}
simon@lucifer:~$ javac TestClass.java && javap -c TestClass
Compiled from "TestClass.java"
public class TestClass extends java.lang.Object{
public TestClass();
  Code:
   0:    aload_0
   1:    invokespecial    #1; //Method java/lang/Object."<init>":()V
   4:    return

public static void main(java.lang.String[]);
  Code:
   0:    iconst_5
   1:    istore_1

StringBuilder를 초기화하십시오.

   2:    new    #2; //class java/lang/StringBuilder
   5:    dup
   6:    invokespecial    #3; //Method java/lang/StringBuilder."<init>":()V

빈 문자열을 추가하십시오.

   9:    ldc    #4; //String
   11:    invokevirtual    #5; //Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;

정수를 추가하십시오.

   14:    iload_1
   15:    invokevirtual    #6; //Method java/lang/StringBuilder.append:
(I)Ljava/lang/StringBuilder;

마지막 문자열을 추출하십시오.

   18:    invokevirtual    #7; //Method java/lang/StringBuilder.toString:
()Ljava/lang/String;
   21:    astore_2
   22:    return
}

거기에 제안 JDK 9 타겟으로이 동작을 변경하고 지속적인 작업.


9
jvm의 jit 컴파일러는 어떻습니까? :-) javac는 멋진 최적화를 수행하지 않습니다.
피터 Štibraný

5
누가 알겠습니까 :) javac는 숫자 리터럴을 사용할 때 이러한 유형의 표현식을 최적화합니다 (예 : "" + 5가 됨 "5").
SimonJ

5
네, 그런데 왜 "" + 5그냥 대신에 "5"하시겠습니까?
Grungondola

3
좋은! 그들이 모르는 다른 것에 대해
Sнаđошƒаӽ

2
"" + integer접근법은 공식 오라클 튜토리얼 중 하나 에서 사용됩니다 .
Tomasz Nocoń

252

괜찮습니다.하지만 그런 것을 쓰지 않았습니다. 나는 이것을 선호한다 :

String strI = Integer.toString(i);

101
모든 유형에 대해 정확히 동일한 호출을 사용할 수 있으므로 String.valueOf 접근 방식을 선호합니다.
Jon Skeet

1
NumberFormatter가 더 나은 접근 방식이 될 것입니다
Kasturi

좋은 대답입니다. 나는 그것을 의견 이상의 것으로 게시 할 것입니다.
duffymo

2
내 무지에 대해 죄송하지만 현재 문화를 사용하지 않습니까? .NET 배경 BTW를 구성하고 있습니다.
Ε Г И І И О

3
정수의 경우 기본적으로 문화권에 맞는 항목이 없습니다 (소수점 또는 천 단위 구분 기호는 없습니다). 그게 다야 NumberFormatter. 와 같은 형식을 사용할 수 있습니다 NumberFormat.getInstance(Locale.FRENCH).
Kat

111

좋은 방법이 아닙니다.

int에서 문자열로 변환 할 때 다음을 사용해야합니다.

int i = 5;
String strI = String.valueOf(i);

7
1. 빈 줄을 요구합니다. 2. 연결을 요청합니다. 3. 문자열이 없으므로 int를 문자열로 변환합니다. 다리도의 해결책은 첫 단계를 피하십시오.
Nicolas

에 추가되기 전에 int i박스에 넣 습니까? IntegerString strI
케빈 메러디스

1
@KevinMeredith는 아닙니다. 실제로 호출 할 것입니다 StringBuilder.append(int)(그리고 모든 기본 유형에 StringBuilder대한 append메소드가 있습니다).
Kat

60

그것은 단지 최적화 1이 아닙니다 . 난 싫어

"" + i

내가 정말로하고 싶은 것을 표현하지 않기 때문에 2 .

(빈) 문자열에 정수를 추가하고 싶지 않습니다. 정수를 문자열로 변환하고 싶습니다.

Integer.toString(i)

또는 선호하는 것은 아니지만 연결보다 낫다면 객체 (정수)의 문자열 표현을 얻으십시오.

String.valueOf(i)

1. 루프 에서처럼 자주 호출되는 코드의 경우 최적화는 연결을 사용하지 않는 지점이기도합니다 .

2. 이 사용 유효하지 않습니다 실제 처럼 연결 System.out.println("Index: " + i); 또는 String id = "ID" + i;


3
이 맥락에서 성능에 대해 이야기하는 사람들은 산만합니다. 훨씬 더 멀리, 훨씬 더 멀리, 훨씬 더 중요한 것은 가독성 입니다.
브라이언 괴츠

23

많은 입문 대학 과정이이 스타일을 가르치는 것 같습니다 (제 경험상).

  • 클래스 나 메소드를 이해하지 않아도됩니다. 일반적으로 이것은“클래스”라는 단어가 언급되기 전에, 심지어 메서드 호출까지도 배웁니다. 따라서 같은 String.valueOf(…)것을 사용하면 학생들을 혼란스럽게 할 수 있습니다.

  • 사실,이 같은 우리에게 판매되었다 - 그것은 "연산자 오버로드"의 그림입니다 (자바는 사용자 정의 연산자 오버로딩을 허용하지 않기 때문에, 여기에 작은 경이) 관용적 오버로드 된 연산자를 사용합니다.

따라서 그것은 교훈적 필요성에서 태어 났거나 (이것은 단지 나쁜 가르침이라고 주장하지만) 그렇지 않으면 Java에서는 시연하기 어려운 원리를 설명하는 데 사용될 수 있습니다.


2
나는 ""+와 같은 반대로 구성하면 초보자를 혼란스럽게 할 것이라고 생각합니다. 그리고 그것은 그들의 남은 생애 동안 나쁜 스타일입니다.
Konstantin Zyubin

15

표현식

"" + i

로 연결 문자열 변환i런타임시 으로 . 식의 전체 유형은입니다 String. i먼저 Integer객체 ( new Integer(i)) 로 변환 된 다음 String.valueOf(Object obj)호출됩니다. 따라서

"" + String.valueOf(new Integer(i));

분명히 이것은 호출 String.valueOf(new Integer(i))하는 것 보다 약간 성능이 떨어 지므로 동일한 결과를 얻을 수 있습니다.

장점은 ""+i타이핑이 더 쉽고 빠르며 일부 사람들은 더 읽기 쉽다고 생각할 수 있다는 것입니다. 그것은하지 않습니다 코드 냄새 가 어떤 깊은 문제가있는 것은 아닙니다으로.

(참고 : JLS 15.8.1 )


3
"동등한"진술은 동일하지 않습니다. String.valueOf필요한 권투를 호출하더라도 i(을 허용하는 과부하 int가 없기 때문에) 사용하지 new Integer(i)않고을 사용 Integer.valueOf(i)합니다. 그러나 실제로이 작업을 수행하지 않습니다. 그것은 않습니다 new StringBuilder().append("").append(i).toString()SimonJ의 대답 노트로,. StringBuilder는 프리미티브 int i를 String으로 변환하는 자체 로직을 가지고 있습니다.
Mark Peters

4
코드 냄새에 관한 부분은 맞습니다. 코드 냄새는 잘못된 용어입니다. 그래서 공감대를 벗겠습니다.
Mark Peters

""+ i로 비효율적 인 것 같습니다. 간단한 Integer.toString 또는 String.valueOf 만 권장됩니다. 참조 javadevnotes.com/java-integer-to-string-examples
JavaDev

14

개인적으로, 나는이 코드에서 나쁜 것을 보지 못했습니다.

int 값을 기록하려고 할 때 매우 유용하며 로거는 문자열을 허용합니다. String을 허용하는 메서드를 호출해야하지만 int 값이있는 경우 이러한 변환이 편리하다고 말하고 싶습니다.

Integer.toString또는 사이의 선택은 String.valueOf모두 맛의 문제입니다.
... 그리고 내부적으로는 String.valueOf호출이 Integer.toString메서드를 호출합니다 . :)


12

내가 아는 다른 방법은 Integer수업입니다.

Integer.toString(int n);
Integer.toString(int n, int radix);

구체적인 예 (필요하지는 않지만) :

String five = Integer.toString(5); // returns "5"

예를 들어 다른 기본 유형에서도 작동합니다 Double.toString.

자세한 내용은 여기를 참조하십시오.


9

이 기술은 제가 10 년 전에 취한 학부 수준의 자바 소개 수업에서 배웠습니다. 그러나 IIRC에서는 아직 String 및 Integer 클래스 메서드를 얻지 못했습니다.

이 기술은 간단하고 타이핑이 빠릅니다. 내가하고있는 모든 것이 무언가를 인쇄하는 것이라면 사용합니다 (예 :System.out.println("" + i); . 그러나 변환을 수행하는 가장 좋은 방법은 아니라고 생각합니다. 또한 성능이 문제가 될 경우 속도가 느려집니다 (다른 답변뿐만 아니라 아래도 더).

개인적으로, 나는 무슨 일이 일어나고 있는지 분명하기 때문에 Integer.toString ()을 선호합니다. 혼란스러워 보이는 것처럼 String.valueOf ()가 두 번째 선택이 될 것입니다 (darioo의 답변 후 주석을 참조하십시오).

grins의 경우 :) 나는 ""+ i, Integer.toString 및 String.ValueOf의 세 가지 기술을 테스트하기 위해 클래스를 작성했습니다. 각 테스트는 정수를 1에서 10000으로 문자열로 변환했습니다. 그런 다음 Linux 시간을 통해 각각 실행 했습니다. 명령을 5 번 실행했습니다. Integer.toString ()은 String.valueOf ()보다 한 번 더 빠르며 세 번 묶었 고 String.valueOf ()는 한 번 더 빠릅니다. 그러나 그 차이는 몇 밀리 초를 넘지 않았습니다.

""+ i 기술은 Integer.toString ()보다 1 밀리 초 빠르고 String.valueOf ()보다 1 밀리 초 느리면 (하나는 String.valueOf () Integer.toString ())보다 빠릅니다. 일반적으로 몇 밀리 초 느리지 만, 약 50 밀리 초 느린 테스트가있었습니다. YMMV .


1
JIT를 고려하는 것을 잊지 마십시오. 처음 몇 번의 변환은 속도가 훨씬 느리고 타이밍이 왜곡됩니다. 내 MacBook에서 연결은 다른 두 가지 방법 (변환 당 ~ 50ns가 소요됨)보다 ~ 20ns 더 오래 걸리므로 ms 순서대로 본 차이는 임의의 오류 (스케줄링, 인터럽트 등) 때문일 수 있습니다.
SimonJ

6

문자열로 변환하는 방법에는 여러 가지가 있습니다.

StringBuilder string = string.append(i).toString();
String string = String.valueOf(i);
String string = Integer.toString(i);

StringBuilder 문자열 = string.append (i) .toString (); ... 흠, StringBuilder입니까, 아니면 String입니까? 여기 엉망 ...
Franta

6

문자열 사용 방법에 따라 다릅니다. 도움이 될 수 있습니다.

String total =  Integer.toString(123) + Double.toString(456.789);

5

SimonJ에 주로 영향을 미칩니다. 나는 ""+ i 관용구를 정말로 싫어한다. String.valueOf (i)라고하면 Java는 정수를 문자열로 변환하고 결과를 반환합니다. ""+ i라고 말하면 Java는 StringBuilder 객체를 생성하고 빈 문자열을 추가하고 정수를 문자열로 변환 한 다음 StringBuilder에 추가 한 다음 StringBuilder를 String으로 변환합니다. 추가 단계가 많이 있습니다. 큰 프로그램에서 한 번만하면 큰 문제가되지 않습니다. 그러나 항상이 작업을 수행하는 경우 컴퓨터에서 추가 작업을 많이 수행하고 정리해야 할 추가 개체를 모두 만드는 것입니다. 마이크로 최적화에 열광하고 싶지 않지만 무의미하게 낭비하고 싶지 않습니다.


5
String strI = String.valueOf(i);

String string = Integer.toString(i);

두 가지 방법이 모두 맞습니다.


5

정수를 문자열로 변환하는 방법은 여러 가지가 있습니다.

1)

Integer.toString(10);

2)

 String hundred = String.valueOf(100); // You can pass an int constant
 int ten = 10;
 String ten = String.valueOf(ten)

삼)

String thousand = "" + 1000; // String concatenation

4)

String million = String.format("%d", 1000000)

1
String.format ( "% d", 1000000) ... 이것은 실제로 Int >> String 변환이 아니며, 오버로드에도 불구하고 여기서 String >> String 처리입니다. 그래서 나는 이것을 추천하지 않습니다. 단지 변환의 목적이 아닙니다.
Franta

5

문자열로 변환하는 세 가지 방법이 있습니다

  1. String string = "" + i;
  2. String string = String.valueOf(i);
  3. String string = Integer.toString(i);

1
당신은 잊었다 : String.format("%d", i).
브라이언 괴츠

3

""+ i 사용은 숫자를 문자열로 변환하는 가장 짧고 간단한 방법입니다. 가장 효율적이지는 않지만 가장 분명한 IMHO이며 일반적으로 더 중요합니다. 코드가 단순할수록 실수 할 가능성이 줄어 듭니다.


2
String.valueOf 또는 Integer.toString을 호출하는 데 어떻게 실수가 있습니까?
Eva

1
String.valueOf ()의 비 이상적인 용도를 발견했지만 지금은 기억할 수 없습니다. 출력이 정확했지만 효율성이 떨어졌습니다""+i
Peter Lawrey

2

개인적으로 나는 ""+ 나는 원래의 질문 포스터가 "취약한"상태라고 생각한다. Java 외에도 많은 OO 언어를 사용했습니다. 해당 구문이 적합하도록 의도 된 경우 Java는 문자열로 변환하기 위해 ""를 필요로하지 않고 i 만 해석하고 대상 유형이 명확하지 않고 오른쪽에 단일 값만 제공되기 때문에 수행합니다. . 다른 코드는 다른 제조사 나 다른 플랫폼에서 만든 다른 버전의 Javac가 코드를 포팅해야하는 경우 고려 될 때 컴파일러를 속이는 '트릭'처럼 보인다. Typecast를 사용하십시오 : (문자열) i. 윙크

내 학습 방식과 다른 코드를 빠르게 읽을 때 이러한 구문을 쉽게 이해할 수 있도록 Integer.toString (i) 메서드에 투표합니다. Java가 백그라운드에서 작업을 구현하는 방법에서 ns 또는 2를 잊어 버렸습니다 .String.valueOf (i)이 메소드는 나에게 올바르게 느끼고 정확히 무슨 일이 일어나고 있는지 말합니다.

좋은 점은 아마도 StringBuilder를 사용하는 것입니다. 텍스트와 int 또는 다른 객체가 혼합 된 문자열을 작성하는 좋은 대답입니다.

내 두 센트는 Mans 질문에 대한 이미 잘 지불 된 키티에 던져졌습니다 ... 스마일

일부 반사 후 내 자신의 답변 편집 :

Ok, Ok, 이것에 대해 좀 더 생각하고 있었고 String.valueOf (i)도 완벽하게 좋습니다. 정수 값을 나타내는 String을 원합니다. lol, 영어는 Java보다 구문 분석하기가 훨씬 어렵습니다! 그러나 나머지 답변 / 의견을 남깁니다 ... 가능한 경우 항상 가장 낮은 수준의 메소드 / 함수 체인을 사용하고 여전히 가독성을 유지하도록 String.valueOf가 Integer.toString을 호출하면 전체 오렌지를 사용하는 이유는 무엇입니까? 어쨌든 껍질을 벗기면 흠?

StringBuilder에 대한 내 의견을 명확히하기 위해 대부분 문자 그대로의 텍스트와 int로 구성된 콤보를 사용하여 많은 문자열을 작성하며 + 사이에 포함 된 위에서 언급 한 루틴에 대한 호출로 길고 추악한 느낌을 줄 수 있습니다. 어쨌든 SB 객체와 append 메소드에는 과부하가있어 계속 진행하여 사용하는 것이 더 깨끗할 수 있습니다 ... 그래서 지금은 최대 5 센트라고 생각합니다. 롤 ...



-5

간단한 형변환 시도

char c = (char) i;

3
이것은 int를 문자열로 변환하는 좋은 방법이 아닙니다. 실제로 int를 문자열로 변환하지 않고 int를 char로 변환합니다. 이것은 int를 ASCII 문자 코드로 해석하여 해당 문자를 제공합니다. 위험합니다 (음수 값 등).
Nepoxx

위의 질문을 지우십시오 .char와 String은 다릅니다 ...!

그러나 이것은 작동합니다 (ASCII 문자셋 "오프셋") :char c = (char) (i + 48);
electrobabe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.