Java·ο»ΏServlet·ο»ΏJSP

JAVA κ°œλ°œμžκ°€ μ•Œμ•„μ•Όν•  String 클래슀 - 1편

Leica 2023. 2. 17. 02:50
λ°˜μ‘ν˜•

 

λ³Έ ν¬μŠ€νŒ…μ—μ„œλŠ” 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 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ λ™μ μœΌλ‘œ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. 이 ν΄λž˜μŠ€μ— λŒ€ν•΄μ„œλŠ” λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œ μžμ„Ένžˆ λ‹€λ£¨κ² μŠ΅λ‹ˆλ‹€. 

 

그럼 λͺ¨λ‘λ“€ μ—΄κ³΅ν•΄μš”!

 

λ°˜μ‘ν˜•