JAVA κ°λ°μκ° μμμΌν String ν΄λμ€ - 1νΈ
λ³Έ ν¬μ€ν μμλ JAVA κ°λ°μκ° μμμΌνλ String ν΄λμ€μ λν μ£Όμ λ΄μ©λ€μ μ 리ν΄λ³΄λ €κ³ ν©λλ€.
λͺ©μ°¨
- λ¬Έμμ΄ λΆμ΄κΈ° - concat() VS '+' μ°μ°μ
- λΆλ³(immutable)
- λ¬Έμμ΄ λΉκ΅ - == VS equals()
- String κ°μ²΄ μμ± - 리ν°λ΄ VS new μ°μ°μ
λ¬Έμμ΄ λΆμ΄κΈ° - concat() VS '+' μ°μ°μ
concat() λ©μλμ + μ°μ°μλ λ λ€ λ κ°μ λ¬Έμμ΄μ μ΄μ΄λΆμ¬ μλ‘μ΄ λ¬Έμμ΄μ λ°νν©λλ€. νμ§λ§, λ κ°μ§ λ°©λ²μλ μ°¨μ΄μ μ΄ μμ΅λλ€.
- concat() λ©μλλ νΈμΆνλ λ¬Έμμ΄ λ€μ μ λ¬λ λ¬Έμμ΄μ μ΄μ΄λΆμ λλ€.
- + μ°μ°μλ μΌμͺ½ λ¬Έμμ΄κ³Ό μ€λ₯Έμͺ½ λ¬Έμμ΄μ μ΄μ΄λΆμ λλ€.
λ€μμ κ°λ¨ν μμ μ λλ€.
String str1 = "Hello";
String str2 = "World";
String str3 = str1.concat(str2);
String str4 = str1 + str2;
System.out.println(str3); // μΆλ ₯: "HelloWorld"
System.out.println(str4); // μΆλ ₯: "HelloWorld"
μ μμ μμ str3μ str1κ³Ό str2λ₯Ό concat() λ©μλλ₯Ό μ¬μ©νμ¬ μ΄μ΄λΆμΈ κ²°κ³Όμ΄λ©°, str4λ + μ°μ°μλ₯Ό μ¬μ©νμ¬ μ΄μ΄λΆμΈ κ²°κ³Όμ
λλ€. λ κ°μ§ λ°©λ² λͺ¨λ κ°μ κ²°κ³Όλ₯Ό λ°νν©λλ€.
κ·Έλ¬λ concat() λ©μλλ λ κ°μ λ¬Έμμ΄μ μ΄μ΄λΆμΌ λ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νμ§λ§, + μ°μ°μλ λ¬Έμμ΄ μ°κ²° μ λ΄λΆμ μΌλ‘ StringBuilder λλ StringBuffer κ°μ²΄λ₯Ό μ¬μ©νμ¬ μλ‘μ΄ λ¬Έμμ΄μ μμ±νκ² λ©λλ€. λ°λΌμ, λ¬Έμμ΄ μ°κ²° μμ
μ΄ λ§μμ§μλ‘ + μ°μ°μλ₯Ό μ¬μ©νλ κ²λ³΄λ€ concat() λ©μλλ₯Ό μ¬μ©νλ κ²μ΄ μ±λ₯μ μ 리ν©λλ€.
νμ§λ§, μλ° 5λΆν°λ μ»΄νμΌλ¬κ° λ¬Έμμ΄ μ°κ²° μμ
μ μλμΌλ‘ StringBuilder κ°μ²΄λ₯Ό μ¬μ©νλλ‘ μ΅μ ννμ¬, + μ°μ°μμ concat() λ©μλμ μ±λ₯ μ°¨μ΄κ° ν¬κ² μ€μ΄λ€μμ΅λλ€. λ°λΌμ, μ±λ₯ μ°¨μ΄κ° ν¬μ§ μλ€λ©΄ λ κ°μ§ λ°©λ² μ€ νΈν λ°©λ²μ μ¬μ©νλ©΄ λ©λλ€.
λΆλ³(immutable)
String ν΄λμ€λ λΆλ³(immutable) ν΄λμ€μ λλ€. μ΄λ String κ°μ²΄λ₯Ό μμ±ν νμλ κ·Έ κ°μ λ³κ²½ν μ μμμ μλ―Έν©λλ€. μ¦, ν λ² μμ±λ λ¬Έμμ΄μ μ λλ‘ μμ ν μ μμΌλ©°, λ¬Έμμ΄μ μλμ κ°μ΄ concat() λ©μλλ‘ λ³κ²½νλ©΄ μλ‘μ΄ String κ°μ²΄κ° μμ±λ©λλ€.
String str1 = "Hello";
String str2 = str1.concat(" World"); // μλ‘μ΄ κ°μ²΄ μμ±
System.out.println(str1); // μΆλ ₯ κ²°κ³Ό : "Hello"
System.out.println(str2); // μΆλ ₯ κ²°κ³Ό : "Hello World"
μμ μμ μμ str1μ "Hello" λ¬Έμμ΄μ μ°Έμ‘°νλ String κ°μ²΄μ λλ€. μ΄ν str1μ concat() λ©μλλ‘ " World"λ₯Ό μΆκ°νλ©΄ μλ‘μ΄ String κ°μ²΄κ° μμ±λ©λλ€. κ·Έλ¬λ str1μ κ°μ μ¬μ ν "Hello"μΈ μ±λ‘ μ μ§λ©λλ€. λ°λΌμ str1μ μΆλ ₯νλ©΄ "Hello"κ°, str2λ "Hello World"κ° μΆλ ₯λ©λλ€.
μ΄λ²μλ λ€λ₯Έ μμ λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2); // μΆλ ₯ κ²°κ³Ό : true
str1 += " World";
str2 += " World";
System.out.println(str1 == str2); // μΆλ ₯ κ²°κ³Ό : false
μμ μμ μμ str1κ³Ό str2λ λͺ¨λ "Hello"λ₯Ό μ°Έμ‘°νλ String κ°μ²΄μ λλ€. μ΄ν str1κ³Ό str2μ κ°κ° += μ°μ°μλ₯Ό μ¬μ©νμ¬ " World"λ₯Ό μΆκ°νλ©΄, str1κ³Ό str2λ κ°κ° "Hello World"λ₯Ό μ°Έμ‘°νλ μλ‘μ΄ String κ°μ²΄λ₯Ό κ°λ¦¬ν€κ² λ©λλ€. κ·Έλ¬λ String ν΄λμ€λ immutable(λΆλ³)μ΄κΈ° λλ¬Έμ, String κ°μ²΄κ° ν λ² μμ±λλ©΄ κ·Έ κ°μ λ³κ²½ν μ μμ΅λλ€. λ°λΌμ, str1 += " World" μ½λλ μ€μ λ‘λ "Hello"μ " World"λ₯Ό μΆκ°νλ κ²μ΄ μλλΌ, "Hello"μ " World"λ₯Ό ν©μ³ μλ‘μ΄ String κ°μ²΄λ₯Ό μμ±νκ³ , str1μ μ΄ μλ‘μ΄ κ°μ²΄λ₯Ό μ°Έμ‘°νκ² λ©λλ€. λ°λΌμ, str1κ³Ό str2κ° μ°Έμ‘°νλ κ°μ²΄λ μλ‘ λ€λ¦ λλ€. λ°λΌμ str1 == str2λ₯Ό λΉκ΅νλ©΄ falseκ° λ°νλ©λλ€.
λΆλ³μ±μ Javaμμ λ§€μ° μ€μν κ°λ μ€ νλμ΄λ©°, μ΄λ₯Ό μ μ΄ν΄νκ³ νμ©νλ©΄ λ³΄λ€ μμ μ μ΄κ³ ν¨μ¨μ μΈ μ½λλ₯Ό μμ±ν μ μμ΅λλ€. μ΄λ¬ν νΉμ±μ λ©ν°μ€λ λ© νκ²½μμ μμ μ μΈ λμμ 보μ₯νκ³ , λ¬Έμμ΄ μ°μ° μ μμ λ²νΌλ₯Ό μμ±νλ μ€λ²ν€λλ₯Ό μ€μ¬μ€λλ€.
λ¬Έμμ΄ λΉκ΅ - == VS equals()
κ·Έλ¬λ μ μμ μ½λμμ str1κ³Ό str2λ₯Ό equals() λ©μλλ‘ λΉκ΅νλ€λ©΄, "Hello World"λΌλ κ°μ λ¬Έμμ΄μ κ°κΈ° λλ¬Έμ trueκ° λ°νλ©λλ€. μ΄λ String ν΄λμ€κ° equals() λ©μλλ₯Ό μ€λ²λΌμ΄λ©νμ¬, λ String κ°μ²΄κ° κ°κ³ μλ λ¬Έμμ΄μ΄ κ°μμ§λ₯Ό λΉκ΅νλλ‘ κ΅¬νλμ΄ μκΈ° λλ¬Έμ λλ€.
System.out.println(str1.equals(str2)); // μΆλ ₯ κ²°κ³Ό : true
Javaμμ == μ°μ°μλ λ κ°μ κ°μ²΄κ° λ©λͺ¨λ¦¬μμ λμΌν μμΉμ μλμ§λ₯Ό λΉκ΅ν©λλ€. μ¦, λ κ°μ κ°μ²΄κ° κ°μ κ°μ²΄μΈμ§λ₯Ό λΉκ΅ν©λλ€. λ°λ©΄ equals() λ©μλλ λ κ°μ κ°μ²΄κ° λμΌν κ°μ κ°λμ§λ₯Ό λΉκ΅ν©λλ€. μ¦, λ κ°μ κ°μ²΄κ° κ°μ κ°μ²΄λ μλμ§λ§, κ°μ κ°μ κ°λ κ°μ²΄μΈμ§λ₯Ό λΉκ΅ν©λλ€. λ€μμ == μ°μ°μμ equals() λ©μλλ₯Ό μ¬μ©νμ¬ String κ°μ²΄λ₯Ό λΉκ΅νλ μμ μ½λμ λλ€.
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
// == μ°μ°μλ‘ λΉκ΅
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
// equals() λ©μλλ‘ λΉκ΅
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
μ μ½λμμ str1κ³Ό str2λ λͺ¨λ "hello"λ₯Ό μ°Έμ‘°νλ λμΌν String κ°μ²΄λ₯Ό κ°λ¦¬ν€λ―λ‘, == μ°μ°μλ₯Ό μ¬μ©νμ¬ λΉκ΅νλ©΄ trueκ° λ°νλ©λλ€. λ°λ©΄ str1κ³Ό str3μ μλ‘ λ€λ₯Έ String κ°μ²΄λ₯Ό μμ±νλ―λ‘ == μ°μ°μλ₯Ό μ¬μ©νμ¬ λΉκ΅νλ©΄ falseκ° λ°νλ©λλ€. κ·Έλ¬λ equals() λ©μλλ₯Ό μ¬μ©νμ¬ λΉκ΅νλ©΄, str1κ³Ό str2, κ·Έλ¦¬κ³ str1κ³Ό str3λ λͺ¨λ λμΌν κ°μ κ°κΈ° λλ¬Έμ trueκ° λ°νλ©λλ€.
String κ°μ²΄ μμ± - 리ν°λ΄ VS new μ°μ°μ
Javaμμ String κ°μ²΄λ λ κ°μ§ λ°©λ²μΌλ‘ μμ±ν μ μμ΅λλ€. 리ν°λ΄(Literal)λ‘ μμ±νλ λ°©λ²κ³Ό new μ°μ°μλ₯Ό μ¬μ©νμ¬ μμ±νλ λ°©λ²μ
λλ€. μ΄ λ κ°μ§ λ°©λ²μ μ°¨μ΄μ μ κ°μ²΄μ μμ±κ³Ό κ΄λ¦¬ λ°©μμ μμ΅λλ€.
리ν°λ΄λ‘ λ¬Έμμ΄ κ°μ²΄λ₯Ό μμ±νλ©΄, JVM λ΄λΆμ μΌλ‘ λ¬Έμμ΄ λ¦¬ν°λ΄ ν(String Literal Pool)μ λ¬Έμμ΄μ μ μ₯ν©λλ€. μ΄ λ, 리ν°λ΄λ‘ μμ±λ λ¬Έμμ΄ κ°μ²΄λ JVM λ΄λΆμμ κ΄λ¦¬λλ©°, λμΌν 리ν°λ΄μ κ°μ§ λ¬Έμμ΄ κ°μ²΄κ° μ΄λ―Έ μ‘΄μ¬νλ κ²½μ°, μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νμ§ μκ³ κΈ°μ‘΄μ κ°μ²΄λ₯Ό μ°Έμ‘°ν©λλ€.
new μ°μ°μλ₯Ό μ¬μ©νμ¬ λ¬Έμμ΄ κ°μ²΄λ₯Ό μμ±νλ©΄, νμ μλ‘μ΄ κ°μ²΄κ° μμ±λλ©°, μ΄ κ°μ²΄λ JVMμ μΌλ°μ μΈ ν λ©λͺ¨λ¦¬μ μ μ₯λ©λλ€. μ¦ λ¦¬ν°λ΄λ‘ μμ±λ κ°μ²΄μλ λ€λ₯Έ λ©λͺ¨λ¦¬ μμμ μ‘΄μ¬νκ² λ©λλ€.
π JVMμ String literal poolκ³Ό ν λ©λͺ¨λ¦¬
JVMμ λ©λͺ¨λ¦¬λ₯Ό ν¬κ² λ κ°μ§ μμμΌλ‘ ꡬλΆν©λλ€. μ€ν(Stack)κ³Ό ν(Heap) μμμ λλ€. μ€νμ λ©μλκ° νΈμΆλ λλ§λ€ ν λΉλλ μ§μ λ³μλ₯Ό μ μ₯νλ μμμ λλ€. νμ κ°μ²΄λ₯Ό μ μ₯νλ μμμΌλ‘, κ°μ²΄ μμ± μμ λμ μΌλ‘ ν λΉλ©λλ€. String ν΄λμ€μ κ²½μ°, 리ν°λ΄λ‘ μμ±λ λ¬Έμμ΄μ String Literal Poolμ μ μ₯λ©λλ€. String Literal Poolμ JVMμ ν μμμμ λ³λλ‘ κ΄λ¦¬λλ©°, κ°μ λ΄μ©μ λ¬Έμμ΄μ΄ μλ€λ©΄ λ©λͺ¨λ¦¬λ₯Ό 곡μ νμ¬ μ¬μ©ν©λλ€. μ΄λ λ©λͺ¨λ¦¬ μ¬μ©λμ μ€μ΄λ μ₯μ μ΄ μμ΅λλ€.
λ€μμ 리ν°λ΄κ³Ό new μ°μ°μλ₯Ό μ¬μ©νμ¬ λ¬Έμμ΄ κ°μ²΄λ₯Ό μμ±νλ μμ μ½λμ
λλ€.
String str1 = "hello"; // 리ν°λ΄λ‘ μμ±
String str2 = new String("hello"); // new μ°μ°μλ‘ μμ±
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true
μ μ½λμμ str1κ³Ό str2λ λͺ¨λ "hello"λ₯Ό κ°λ String κ°μ²΄μ
λλ€. == μ°μ°μλ‘ λΉκ΅νλ©΄, str1κ³Ό str2λ μλ‘ λ€λ₯Έ κ°μ²΄μ΄λ―λ‘ falseκ° λ°νλ©λλ€. κ·Έλ¬λ equals() λ©μλλ‘ λΉκ΅νλ©΄, str1κ³Ό str2λ λμΌν κ°μ κ°λ κ°μ²΄μ΄λ―λ‘ trueκ° λ°νλ©λλ€.
μΌλ°μ μΌλ‘ 리ν°λ΄μ μ¬μ©νλ κ²μ΄ μ±λ₯μ μ΄μ μ΄ μμΌλ―λ‘, κ°λ₯ν κ²½μ° λ¦¬ν°λ΄λ‘ λ¬Έμμ΄ κ°μ²΄λ₯Ό μμ±νλ κ²μ΄ μ’μ΅λλ€. κ·Έλ¬λ λ¬Έμμ΄μ λμ μΌλ‘ μμ±ν΄μΌνλ κ²½μ°μλ new μ°μ°μλ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
μ±λ₯ κ΄λ ¨ μΆκ° μ€λͺ π
리ν°λ΄λ‘ λ¬Έμμ΄ κ°μ²΄λ₯Ό μμ±νλ κ²μ΄ μ±λ₯μ μ΄μ μ΄ μλ μ΄μ λ λ¬Έμμ΄ λ¦¬ν°λ΄ ν(String Literal Pool)μ΄λΌλ JVMμ νΉλ³ν μμ λλ¬Έμ
λλ€.
리ν°λ΄λ‘ λ¬Έμμ΄ κ°μ²΄λ₯Ό μμ±νλ©΄, JVMμ μ΄ λ¬Έμμ΄ κ°μ²΄λ₯Ό 리ν°λ΄ νμ μ μ₯ν©λλ€. λ§μ½ κ°μ λ¬Έμμ΄ λ¦¬ν°λ΄μ κ°μ§ λ¬Έμμ΄ κ°μ²΄κ° μ΄λ―Έ μ‘΄μ¬νλ€λ©΄, JVMμ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νμ§ μκ³ , μ΄μ μ μμ±λ κ°μ²΄λ₯Ό μ°Έμ‘°ν©λλ€. μ΄λ κ² λ¬Έμμ΄ κ°μ²΄λ₯Ό μμ±νλ©΄, JVMμ λΆνμν κ°μ²΄ μμ±μ νΌν μ μμ΄μ λ©λͺ¨λ¦¬ μ¬μ©λμ μ€μΌ μ μμ΅λλ€.
λ°λ©΄μ new μ°μ°μλ‘ λ¬Έμμ΄ κ°μ²΄λ₯Ό μμ±νλ κ²½μ°, νμ μλ‘μ΄ κ°μ²΄κ° μμ±λλ―λ‘ μ΄μ μ μμ±λ κ°μ²΄μ κ°μ λ΄μ©μ κ°μ§ λ¬Έμμ΄ κ°μ²΄κ° μ¬λ¬ κ° μ‘΄μ¬ν μ μμ΅λλ€. μ΄ κ²½μ°, λ©λͺ¨λ¦¬ μ¬μ©λμ΄ λμ΄λκ³ , κ°λΉμ§ 컬λ μ
(Garbage Collection)μ΄ μμ£Ό λ°μνκ² λμ΄ μ±λ₯μ μν₯μ λ―ΈμΉ μ μμ΅λλ€.
λν 리ν°λ΄λ‘ μμ±λ λ¬Έμμ΄ κ°μ²΄λ μ»΄νμΌ μμ μ μμ±λλ―λ‘, λ°νμ μ λ¬Έμμ΄ κ°μ²΄λ₯Ό μμ±νλ κ²λ³΄λ€ λ λΉ λ₯΄κ² μ²λ¦¬λ©λλ€. λ°λΌμ κ°λ₯ν κ²½μ°μλ λ¬Έμμ΄ λ¦¬ν°λ΄μ μ¬μ©νλ κ²μ΄ μ±λ₯μ μ΄μ μ΄ μμ΅λλ€.
λ¬Έμμ΄μ λμ μμ± μΆκ° μ€λͺ π
λ¬Έμμ΄μ λμ μΌλ‘ μμ±ν΄μΌ νλ κ²½μ°λ λ³΄ν΅ λ€μκ³Ό κ°μ μν©μμ λ°μν©λλ€.
- μ¬μ©μ μ λ ₯ μ²λ¦¬: μ¬μ©μκ° μ λ ₯ν κ°μ λ¬Έμμ΄λ‘ λ°μλ€μ¬μΌ νλ κ²½μ°, μ λ ₯κ°μ λ°λΌ λμ μΌλ‘ λ¬Έμμ΄μ μμ±ν΄μΌ ν©λλ€.
- νμΌ μ²λ¦¬: νμΌμμ μ½μ΄λ€μΈ λ°μ΄ν°λ₯Ό λ¬Έμμ΄λ‘ λ³ννμ¬ μ²λ¦¬ν΄μΌ νλ κ²½μ°, νμΌ ν¬κΈ°κ° λ§€μ° ν¬κ±°λ νμΌ λ΄μ©μ΄ λμ μΌλ‘ λ³κ²½λ μ μλ κ²½μ°μλ λ¬Έμμ΄μ λμ μΌλ‘ μμ±ν΄μΌ ν©λλ€.
- λ°μ΄ν°λ² μ΄μ€ μ²λ¦¬: λ°μ΄ν°λ² μ΄μ€μμ μ‘°νν κ²°κ³Όλ₯Ό λ¬Έμμ΄λ‘ λ³ννμ¬ μ²λ¦¬ν΄μΌ νλ κ²½μ°, μ‘°ν κ²°κ³Όμ λ°λΌ λμ μΌλ‘ λ¬Έμμ΄μ μμ±ν΄μΌ ν©λλ€.
- μΉ μ ν리μΌμ΄μ μ²λ¦¬: μΉ μ ν리μΌμ΄μ μμ μ¬μ©μμκ² λμ μΌλ‘ μμ±λ HTML, CSS, JavaScript μ½λλ₯Ό 보μ¬μ€μΌ νλ κ²½μ°, μ΄ μ½λλ₯Ό λ¬Έμμ΄λ‘ μμ±ν΄μΌ ν©λλ€.
- λ‘κ·Έ μ²λ¦¬: λ‘κ·Έ νμΌμ μ μ₯ν λ©μμ§λ₯Ό λ¬Έμμ΄λ‘ μμ±νμ¬ μ μ₯ν΄μΌ νλ κ²½μ°, λ‘κ·Έ λ©μμ§μ λ°λΌ λμ μΌλ‘ λ¬Έμμ΄μ μμ±ν΄μΌ ν©λλ€.
μ΄ μΈμλ λ¬Έμμ΄μ λμ μΌλ‘ μμ±ν΄μΌ νλ λ€μν μν©μ΄ μμ μ μμ΅λλ€. μ΄λ¬ν κ²½μ°μλ StringBuilderλ StringBuffer ν΄λμ€λ₯Ό μ¬μ©νμ¬ λ¬Έμμ΄μ λμ μΌλ‘ μμ±ν μ μμ΅λλ€. μ΄ ν΄λμ€μ λν΄μλ λ€μ ν¬μ€ν μμ μμΈν λ€λ£¨κ² μ΅λλ€.
κ·ΈλΌ λͺ¨λλ€ μ΄κ³΅ν΄μ!