λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

String, StringBuffer, StringBuilder의 차이점과 μ‚¬μš©μ΄μœ 

by 5566 2023. 11. 21.

I. String, StringBuffer, StringBuilder의 κ°œμš”

1. String 클래슀

  • String ν΄λž˜μŠ€λŠ” λΆˆλ³€(Immutable)ν•œ 객체λ₯Ό μƒμ„±ν•œλ‹€.
  • ν•œ 번 μƒμ„±λœ String κ°μ²΄λŠ” 값을 λ³€κ²½ν•  수 μ—†μœΌλ©°, λ³€κ²½ μ‹œμ—λŠ” μƒˆλ‘œμš΄ String 객체가 μƒμ„±λœλ‹€.
  • λ¬Έμžμ—΄ 연산이 빈번히 λ°œμƒν•  경우 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ λ§Žμ•„μ§€κ³  μ„±λŠ₯이 μ €ν•˜λœλ‹€.

2. StringBuffer 클래슀

  • StringBuffer ν΄λž˜μŠ€λŠ” κ°€λ³€(Mutable)ν•œ 객체λ₯Ό μƒμ„±ν•œλ‹€.
  • λ¬Έμžμ—΄ 연산을 μœ„ν•œ μ—¬λŸ¬ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜λ©°, κΈ°μ‘΄ 객체의 λ‚΄μš©μ„ λ³€κ²½ν•  수 μžˆλ‹€.
  • StringBuilder ν΄λž˜μŠ€μ™€ μ‚¬μš©λ²•, μ„±λŠ₯ λ©΄μ—μ„œ μœ μ‚¬ν•˜μ§€λ§Œ 동기화(synchronized)λ₯Ό μ§€μ›ν•˜μ—¬, λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.
  • λ¬Έμžμ—΄ 연산이 자주 λ°œμƒν•˜λŠ” 경우 μ‚¬μš©ν•  수 μžˆλ‹€.

3. StringBuilder 클래슀

  • StringBuilder ν΄λž˜μŠ€λ„ κ°€λ³€(Mutable)ν•œ 객체λ₯Ό μƒμ„±ν•œλ‹€.
  • StringBuffer ν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ λ¬Έμžμ—΄ 연산을 μœ„ν•œ μ—¬λŸ¬ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜λ©°, κΈ°μ‘΄ 객체의 λ‚΄μš©μ„ λ³€κ²½ν•  수 μžˆλ‹€.
  • StringBuffer ν΄λž˜μŠ€μ™€μ˜ κ°€μž₯ 큰 차이점은 동기화(synchronized)λ₯Ό μ§€μ›ν•˜μ§€ μ•Šμ•„ λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ‚¬μš©ν•  λ•Œ μ„±λŠ₯μƒμ˜ 이점이 μžˆλ‹€.
  • λ¬Έμžμ—΄ 연산이 자주 λ°œμƒν•˜κ³ , λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ΄ μ•„λ‹Œ κ²½μš°μ— μ‚¬μš©ν•  수 μžˆλ‹€.

    II. String 클래슀

String ν΄λž˜μŠ€λŠ” μžλ°”μ—μ„œ κ°€μž₯ 기본적인 λ¬Έμžμ—΄μ„ ν‘œν˜„ν•˜λŠ” ν΄λž˜μŠ€μ΄λ‹€. 이 ν΄λž˜μŠ€λŠ” λΆˆλ³€(Immutable)ν•œ 속성을 가지고 μžˆμ–΄, ν•œ 번 μƒμ„±λœ String κ°μ²΄λŠ” 값을 λ³€κ²½ν•  수 μ—†μœΌλ©° λ³€κ²½ μ‹œμ—λŠ” μƒˆλ‘œμš΄ String 객체가 μƒμ„±λœλ‹€.

1. λ¬Έμžμ—΄ 생성

String 객체λ₯Ό μƒμ„±ν•˜λŠ” λ°©λ²•μ—λŠ” 두 가지가 μžˆλ‹€. 첫 λ²ˆμ§ΈλŠ” λ¦¬ν„°λŸ΄μ„ μ΄μš©ν•œ 생성이닀. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같이 String 객체λ₯Ό 생성할 수 μžˆλ‹€.

String str1 = "Hello";  

두 번째 방법은 new μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜μ—¬ μƒμ„±ν•˜λŠ” 것이닀.

String str2 = new String("Hello");

2. λ¬Έμžμ—΄ μ—°μ‚°

String ν΄λž˜μŠ€λŠ” λ¬Έμžμ—΄μ„ 닀루기 μœ„ν•œ μ—¬λŸ¬ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€. κ°€μž₯ 일반적으둜 μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  • length(): λ¬Έμžμ—΄μ˜ 길이λ₯Ό λ°˜ν™˜ν•œλ‹€.
  • charAt(int index): 주어진 μΈλ±μŠ€μ— ν•΄λ‹Ήν•˜λŠ” 문자λ₯Ό λ°˜ν™˜ν•œλ‹€.
  • substring(int beginIndex): 주어진 μΈλ±μŠ€λΆ€ν„° λ¬Έμžμ—΄μ˜ λκΉŒμ§€λ₯Ό λ°˜ν™˜ν•œλ‹€.
  • concat(String str): 주어진 λ¬Έμžμ—΄μ„ 이어 뢙인 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.
  • equals(Object obj): 주어진 객체와 λ¬Έμžμ—΄μ΄ λ™μΌν•œμ§€ ν™•μΈν•œλ‹€.
  • toUpperCase(), toLowerCase(): λŒ€λ¬Έμž, μ†Œλ¬Έμžλ‘œ λ³€ν™˜ν•œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.

3. λ¬Έμžμ—΄ 비ꡐ

String ν΄λž˜μŠ€λŠ” λ¬Έμžμ—΄μ„ λΉ„κ΅ν•˜λŠ” λ©”μ„œλ“œλ„ μ œκ³΅ν•œλ‹€. 주둜 μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  • equals(): 주어진 객체와 λ¬Έμžμ—΄μ΄ λ™μΌν•œμ§€ ν™•μΈν•œλ‹€. κ°’μ˜ 비ꡐλ₯Ό μˆ˜ν–‰ν•œλ‹€.
  • compareTo() : 두 λ¬Έμžμ—΄μ„ μ‚¬μ „μ‹μœΌλ‘œ λΉ„κ΅ν•˜μ—¬ μˆœμ„œλ₯Ό λ°˜ν™˜ν•œλ‹€. μœ λ‹ˆμ½”λ“œ 값을 λΉ„κ΅ν•œλ‹€.
  • equalsIgnoreCase(): λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•Šκ³  λΉ„κ΅ν•œλ‹€.

4. λ¬Έμžμ—΄ λ³€ν™˜

String ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ μžλ£Œν˜•μœΌλ‘œμ˜ λ³€ν™˜μ„ μœ„ν•œ λ©”μ„œλ“œλ„ μ œκ³΅ν•œλ‹€. λͺ‡ 가지 μ˜ˆμ‹œλ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • toLowerCase(): λ¬Έμžμ—΄μ„ μ†Œλ¬Έμžλ‘œ λ³€ν™˜ν•œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.
  • toUpperCase(): λ¬Έμžμ—΄μ„ λŒ€λ¬Έμžλ‘œ λ³€ν™˜ν•œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.
  • trim(): λ¬Έμžμ—΄μ˜ μ–‘ 끝에 μžˆλŠ” 곡백을 μ œκ±°ν•œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.
  • valueOf(): λ‹€λ₯Έ μžλ£Œν˜•μ˜ 값을 λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.

String ν΄λž˜μŠ€λŠ” 맀우 μœ μš©ν•˜κ³  널리 μ‚¬μš©λ˜μ§€λ§Œ, λ¬Έμžμ—΄μ΄ 자주 λ³€κ²½λ˜λŠ” κ²½μš°μ—λŠ” μ„±λŠ₯ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ κ²½μš°μ—λŠ” StringBuffer ν΄λž˜μŠ€λ‚˜ StringBuilder 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

III. StringBuffer 클래슀

StringBuffer ν΄λž˜μŠ€λŠ” μžλ°”μ—μ„œ λ¬Έμžμ—΄μ„ κ°€λ³€μ μœΌλ‘œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ ν΄λž˜μŠ€μ΄λ‹€. StringBuffer 객체λ₯Ό μƒμ„±ν•˜λ©΄ λ¬Έμžμ—΄ 연산을 μœ„ν•œ λ‹€μ–‘ν•œ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 있으며, κΈ°μ‘΄ 객체의 λ‚΄μš©μ„ λ³€κ²½ν•  수 μžˆλ‹€.

1. StringBuffer 객체 생성

StringBuffer 객체λ₯Ό μƒμ„±ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™λ‹€.

StringBuffer sb = new StringBuffer(); // 빈 λ¬Έμžμ—΄λ‘œ μ΄ˆκΈ°ν™”
StringBuffer sb = new StringBuffer("Hello"); // 초기 λ¬Έμžμ—΄λ‘œ μ΄ˆκΈ°ν™”

2. λ¬Έμžμ—΄ μ—°μ‚°

StringBuffer ν΄λž˜μŠ€λŠ” λ¬Έμžμ—΄ 연산을 μœ„ν•œ λ‹€μ–‘ν•œ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€. κ°€μž₯ 일반적으둜 μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  • append(): λ¬Έμžμ—΄μ˜ 끝에 주어진 값을 μΆ”κ°€ν•œλ‹€.
  • insert(): 주어진 μœ„μΉ˜μ— 값을 μ‚½μž…ν•œλ‹€.
  • delete(): 주어진 λ²”μœ„μ— ν•΄λ‹Ήν•˜λŠ” λ¬Έμžμ—΄μ„ μ‚­μ œν•œλ‹€.
  • replace(): 주어진 λ²”μœ„μ— ν•΄λ‹Ήν•˜λŠ” λ¬Έμžμ—΄μ„ μƒˆλ‘œμš΄ λ¬Έμžμ—΄λ‘œ λŒ€μ²΄ν•œλ‹€.
  • reverse(): λ¬Έμžμ—΄μ„ μ—­μˆœμœΌλ‘œ λ³€ν™˜ν•œλ‹€.
  • substring(): 주어진 λ²”μœ„μ— ν•΄λ‹Ήν•˜λŠ” λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.

3. StringBuffer와 String의 차이점

StringBufferλŠ” Stringκ³Ό 달리 가변적인 속성을 가진닀. λ”°λΌμ„œ, λ¬Έμžμ—΄ 연산이 빈번히 λ°œμƒν•˜λŠ” 경우 StringBufferλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ„±λŠ₯적으둜 μœ λ¦¬ν•˜λ‹€. String은 λ¬Έμžμ—΄ μ—°μ‚° μ‹œ 맀번 μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰κ³Ό μ„±λŠ₯이 μ €ν•˜λ  수 μžˆλ‹€. ν•˜μ§€λ§Œ StringBufferλŠ” κΈ°μ‘΄ 객체의 λ‚΄μš©μ„ λ³€κ²½ν•˜κΈ° λ•Œλ¬Έμ— μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

λ˜ν•œ, StringBufferλŠ” 동기화(synchronized)λ₯Ό μ§€μ›ν•˜μ—¬ λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€. μ—¬λŸ¬ 개의 μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— StringBuffer 객체λ₯Ό μ ‘κ·Όν•˜κ³  변경해도 이 μž‘μ—…λ“€μ΄ λ™κΈ°ν™”λ˜μ–΄ 순차적으둜 μ²˜λ¦¬λ˜λ―€λ‘œ μΌκ΄€λœ κ²°κ³Όλ₯Ό 얻을 수 μžˆλ‹€.

4. μ£Όμ˜μ‚¬ν•­

StringBuffer 클래슀λ₯Ό μ‚¬μš©ν•  λ•Œμ—λŠ” μ£Όμ˜ν•΄μ•Ό ν•  λͺ‡ 가지 사항이 μžˆλ‹€.

  • StringBuffer 객체λ₯Ό μ‚¬μš©ν•  λ•Œμ—λŠ” λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ ν¬λ‹€λŠ” 점을 κ³ λ €ν•΄μ•Ό ν•œλ‹€. λ”°λΌμ„œ, λ¬Έμžμ—΄ 연산이 자주 λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λŠ” String 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 더 νš¨μœ¨μ μ΄λ‹€.
  • StringBufferλŠ” 동기화λ₯Ό μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, μ‹±κΈ€μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” StringBuilderλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ„±λŠ₯상 이점이 μžˆλ‹€.
  • StringBuffer ν΄λž˜μŠ€λŠ” λ©”μ„œλ“œ 체이닝을 μ§€μ›ν•œλ‹€. λ”°λΌμ„œ, μ—¬λŸ¬ 개의 λ©”μ„œλ“œλ₯Ό μ—°μ†ν•΄μ„œ ν˜ΈμΆœν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€. 예λ₯Ό λ“€μ–΄,
StringBuffer sb = new StringBuffer();
sb.append("Hello ").append("world");

μœ„μ™€ 같이 μ—¬λŸ¬ 개의 λ¬Έμžμ—΄μ„ μ—°μ†ν•΄μ„œ μΆ”κ°€ν•  수 μžˆλ‹€.

IV. StringBuilder 클래슀

StringBuilder ν΄λž˜μŠ€λŠ” μžλ°”μ—μ„œ λ¬Έμžμ—΄μ„ κ°€λ³€μ μœΌλ‘œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ 클래슀둜, StringBuffer ν΄λž˜μŠ€μ™€ μœ μ‚¬ν•œ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. StringBuilder 객체λ₯Ό μƒμ„±ν•˜λ©΄ λ¬Έμžμ—΄ 연산을 μœ„ν•œ λ‹€μ–‘ν•œ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 있으며, κΈ°μ‘΄ 객체의 λ‚΄μš©μ„ λ³€κ²½ν•  수 μžˆλ‹€.

1. StringBuilder 객체 생성

StringBuilder 객체λ₯Ό μƒμ„±ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™λ‹€.

StringBuilder sb = new StringBuilder(); // 빈 λ¬Έμžμ—΄λ‘œ μ΄ˆκΈ°ν™”
StringBuilder sb = new StringBuilder("Hello"); // 초기 λ¬Έμžμ—΄λ‘œ μ΄ˆκΈ°ν™”

2. λ¬Έμžμ—΄ μ—°μ‚°

StringBuilder ν΄λž˜μŠ€λŠ” λ¬Έμžμ—΄ 연산을 μœ„ν•œ λ‹€μ–‘ν•œ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€. κ°€μž₯ 일반적으둜 μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  • append(): λ¬Έμžμ—΄μ˜ 끝에 주어진 값을 μΆ”κ°€ν•œλ‹€.
  • insert(): 주어진 μœ„μΉ˜μ— 값을 μ‚½μž…ν•œλ‹€.
  • delete(): 주어진 λ²”μœ„μ— ν•΄λ‹Ήν•˜λŠ” λ¬Έμžμ—΄μ„ μ‚­μ œν•œλ‹€.
  • replace(): 주어진 λ²”μœ„μ— ν•΄λ‹Ήν•˜λŠ” λ¬Έμžμ—΄μ„ μƒˆλ‘œμš΄ λ¬Έμžμ—΄λ‘œ λŒ€μ²΄ν•œλ‹€.
  • reverse(): λ¬Έμžμ—΄μ„ μ—­μˆœμœΌλ‘œ λ³€ν™˜ν•œλ‹€.
  • substring(): 주어진 λ²”μœ„μ— ν•΄λ‹Ήν•˜λŠ” λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.

3. StringBufferμ™€μ˜ 차이점

StringBuilderλŠ” StringBuffer와 κΈ°λŠ₯μ μœΌλ‘œλŠ” λ™μΌν•˜μ§€λ§Œ, μŠ€λ ˆλ“œ 동기화λ₯Ό κ³ λ €ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ μ—μ„œ 차이가 μžˆλ‹€. λ”°λΌμ„œ, μ‹±κΈ€μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ λ¬Έμžμ—΄ 연산을 μˆ˜ν–‰ν•  λ•Œμ—λŠ” StringBuilderλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 StringBuffer보닀 μ„±λŠ₯상 이점이 μžˆλ‹€.

4. μ£Όμ˜μ‚¬ν•­

StringBuilder 클래슀λ₯Ό μ‚¬μš©ν•  λ•Œμ—λŠ” λ‹€μŒκ³Ό 같은 사항을 μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

  • StringBuilder 객체λ₯Ό μ‚¬μš©ν•  λ•Œμ—λŠ” λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ ν¬λ‹€λŠ” 점을 κ³ λ €ν•΄μ•Ό ν•œλ‹€. λ”°λΌμ„œ, λ¬Έμžμ—΄ 연산이 자주 λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λŠ” String 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 더 νš¨μœ¨μ μ΄λ‹€.
  • StringBuilder κ°μ²΄λŠ” μŠ€λ ˆλ“œ 동기화λ₯Ό κ³ λ €ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ‚¬μš©ν•  λ•Œμ—λŠ” 동기화λ₯Ό 직접 관리해주어야 ν•œλ‹€.
  • StringBuilder ν΄λž˜μŠ€λŠ” λ©”μ„œλ“œ 체이닝을 μ§€μ›ν•œλ‹€. λ”°λΌμ„œ, μ—¬λŸ¬ 개의 λ©”μ„œλ“œλ₯Ό μ—°μ†ν•΄μ„œ ν˜ΈμΆœν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€. 예λ₯Ό λ“€μ–΄,
StringBuilder sb = new StringBuilder();
sb.append("Hello ").append("world");

μœ„μ™€ 같이 μ—¬λŸ¬ 개의 λ¬Έμžμ—΄μ„ μ—°μ†ν•΄μ„œ μΆ”κ°€ν•  수 μžˆλ‹€.

V. String, StringBuffer, StringBuilder의 차이

String, StringBuffer, StringBuilder은 λͺ¨λ‘ μžλ°”μ—μ„œ λ¬Έμžμ—΄μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ ν΄λž˜μŠ€μ΄μ§€λ§Œ, 각각의 νŠΉμ§•κ³Ό μš©λ„κ°€ λ‹€λ₯΄λ‹€. λ‹€μŒμ€ 각 클래슀의 차이점을 μ„€λͺ…ν•œλ‹€.

1. String 클래슀

String ν΄λž˜μŠ€λŠ” μžλ°”μ—μ„œ κ°€μž₯ 기본적으둜 μ‚¬μš©λ˜λŠ” λ¬Έμžμ—΄μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ œκ³΅λ˜λŠ” ν΄λž˜μŠ€μ΄λ‹€. λ‹€μŒμ€ String 클래슀의 νŠΉμ§•μ΄λ‹€.

  • String κ°μ²΄λŠ” ν•œλ²ˆ μƒμ„±λ˜λ©΄ λ³€κ²½ν•  수 μ—†λŠ” λΆˆλ³€(immutable) 속성을 가진닀. 즉, κΈ°μ‘΄ λ¬Έμžμ—΄μ„ λ³€κ²½ν•˜λŠ” 연산을 μˆ˜ν–‰ν•˜λ©΄ μƒˆλ‘œμš΄ String 객체가 μƒμ„±λœλ‹€.
  • λ¬Έμžμ—΄ μ—°μ‚° μ‹œ 맀번 μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜λ―€λ‘œ λ©”λͺ¨λ¦¬ 곡간을 많이 μ°¨μ§€ν•˜κ²Œ 될 수 μžˆλ‹€.
  • λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ•ˆμ „ν•˜λ‹€.

2. StringBuffer 클래슀

StringBuffer ν΄λž˜μŠ€λŠ” μžλ°”μ—μ„œ λ¬Έμžμ—΄μ„ κ°€λ³€μ μœΌλ‘œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ 클래슀둜, λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€. λ‹€μŒμ€ StringBuffer 클래슀의 νŠΉμ§•μ΄λ‹€.

  • StringBuffer κ°μ²΄λŠ” 가변적인 속성을 가진닀. μƒμ„±λœ 객체의 λ‚΄μš©μ„ λ³€κ²½ν•  수 있으며, λ¬Έμžμ—΄ 연산이 빈번히 λ°œμƒν•˜λŠ” κ²½μš°μ— μœ μš©ν•˜λ‹€.
  • λ¬Έμžμ—΄ μ—°μ‚° μ‹œ κΈ°μ‘΄ 객체의 λ‚΄μš©μ„ λ³€κ²½ν•˜λ―€λ‘œ μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. λ”°λΌμ„œ, λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰κ³Ό μ„±λŠ₯이 κ°œμ„ λœλ‹€.
  • λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

3. StringBuilder 클래슀

StringBuilder ν΄λž˜μŠ€λŠ” StringBuffer와 κΈ°λŠ₯적으둜 λ™μΌν•˜μ§€λ§Œ, μŠ€λ ˆλ“œ 동기화λ₯Ό κ³ λ €ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ μ—μ„œ 차이가 μžˆλ‹€. λ‹€μŒμ€ StringBuilder 클래슀의 νŠΉμ§•μ΄λ‹€.

  • StringBuilder κ°μ²΄λŠ” μ‹±κΈ€μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ λ¬Έμžμ—΄ 연산을 μˆ˜ν–‰ν•  λ•Œμ— μ‚¬μš©ν•œλ‹€. μŠ€λ ˆλ“œ 동기화λ₯Ό κ³ λ €ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— StringBuffer보닀 μ„±λŠ₯상 이점이 μžˆλ‹€.
  • λ¬Έμžμ—΄ μ—°μ‚° μ‹œ κΈ°μ‘΄ 객체의 λ‚΄μš©μ„ λ³€κ²½ν•˜λ―€λ‘œ μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. λ”°λΌμ„œ, λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰κ³Ό μ„±λŠ₯이 κ°œμ„ λœλ‹€.
  • λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” 동기화 처리λ₯Ό 직접 관리해주어야 μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

4. μ μ ˆν•œ 선택 방법

String, StringBuffer, StringBuilder 쀑 μ–΄λ–€ 클래슀λ₯Ό μ‚¬μš©ν•΄μ•Ό ν• μ§€λŠ” 상황에 따라 λ‹€λ₯΄λ‹€. λ‹€μŒμ€ 선택 방법에 λŒ€ν•œ κ°€μ΄λ“œλΌμΈμ΄λ‹€.

  • λ¬Έμžμ—΄ 변경이 λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λŠ” String 클래슀λ₯Ό μ‚¬μš©ν•œλ‹€. λΆˆλ³€(immutable) 속성을 가지고 있기 λ•Œλ¬Έμ— μ•ˆμ •μ„±κ³Ό 예츑 κ°€λŠ₯성이 λ†’λ‹€.
  • λ¬Έμžμ—΄ 변경이 λΉˆλ²ˆν•˜κ²Œ λ°œμƒν•˜κ³  λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ•ˆμ „ν•œ μ²˜λ¦¬κ°€ ν•„μš”ν•œ κ²½μš°μ—λŠ” StringBuffer 클래슀λ₯Ό μ‚¬μš©ν•œλ‹€.
  • λ¬Έμžμ—΄ 변경이 λΉˆλ²ˆν•˜κ²Œ λ°œμƒν•˜μ§€λ§Œ μ‹±κΈ€μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ•ˆμ „ν•œ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•œ κ²½μš°μ—λŠ” StringBuilder 클래슀λ₯Ό μ‚¬μš©ν•œλ‹€.

μ μ ˆν•œ 클래슀λ₯Ό μ„ νƒν•˜μ—¬ λ¬Έμžμ—΄ 처리λ₯Ό μˆ˜ν–‰ν•¨μœΌλ‘œμ¨ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰κ³Ό μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆλ‹€.

VI. μ‚¬μš© 이유

String, StringBuffer, StringBuilder ν΄λž˜μŠ€λŠ” λͺ¨λ‘ λ¬Έμžμ—΄μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ ν΄λž˜μŠ€μ΄μ§€λ§Œ, 각각의 νŠΉμ§•μ— 따라 μ‚¬μš© μ΄μœ κ°€ λ‹€λ₯Ό 수 μžˆλ‹€. λ‹€μŒμ€ 각 클래슀의 μ‚¬μš© μ΄μœ μ— λŒ€ν•œ μ„€λͺ…이닀.

1. String 클래슀의 μ‚¬μš© 이유

String ν΄λž˜μŠ€λŠ” μžλ°”μ—μ„œ κ°€μž₯ 일반적으둜 μ‚¬μš©λ˜λŠ” λ¬Έμžμ—΄ 처리 ν΄λž˜μŠ€μ΄λ‹€. λ‹€μŒμ€ String 클래슀의 μ‚¬μš© μ΄μœ μ΄λ‹€.

  • String κ°μ²΄λŠ” λΆˆλ³€(immutable) 속성을 가지고 μžˆλ‹€. λ”°λΌμ„œ, ν•œλ²ˆ μƒμ„±λœ λ¬Έμžμ—΄μ€ λ³€κ²½ν•  수 μ—†λ‹€. 이λ₯Ό 톡해 μ•ˆμ •μ„±κ³Ό 예츑 κ°€λŠ₯성이 μ¦κ°€ν•œλ‹€.
  • λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€. μŠ€λ ˆλ“œ 간에 κ³΅μœ λ˜λŠ” λ°μ΄ν„°λ‘œμ„œ μ‚¬μš©ν•¨μœΌλ‘œμ¨ 동기화 문제λ₯Ό μ˜ˆλ°©ν•œλ‹€.
  • λ¬Έμžμ—΄ 연산이 ν•„μš”ν•œ κ²½μš°μ—λŠ” μƒˆλ‘œμš΄ String 객체λ₯Ό μƒμ„±ν•œλ‹€. 이λ₯Ό 톡해 κΈ°μ‘΄ 객체의 λ‚΄μš©μ΄ λ³€κ²½λ˜μ§€ μ•Šκ³ , 예기치 μ•Šμ€ κ²°κ³Όλ₯Ό 방지할 수 μžˆλ‹€.
  • λ‚΄λΆ€μ μœΌλ‘œ λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄ ν’€(string literal pool)μ΄λΌλŠ” μ˜μ—­μ„ μ‚¬μš©ν•˜μ—¬ λ™μΌν•œ λ¬Έμžμ—΄μ„ κ³΅μœ ν•œλ‹€. λ”°λΌμ„œ, λ™μΌν•œ λ¬Έμžμ—΄μ— λŒ€ν•œ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ΅œμ ν™”ν•  수 μžˆλ‹€.

2. StringBuffer 클래슀의 μ‚¬μš© 이유

StringBuffer ν΄λž˜μŠ€λŠ” λ¬Έμžμ—΄μ„ κ°€λ³€μ μœΌλ‘œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ 클래슀둜, λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€. λ‹€μŒμ€ StringBuffer 클래슀의 μ‚¬μš© μ΄μœ μ΄λ‹€.

  • StringBuffer κ°μ²΄λŠ” 가변적인 속성을 가진닀. λ”°λΌμ„œ, ν•œλ²ˆ μƒμ„±λœ 객체의 λ‚΄μš©μ„ λ³€κ²½ν•  수 μžˆλ‹€. 이λ₯Ό 톡해 λ¬Έμžμ—΄ 연산을 μœ μ—°ν•˜κ²Œ μˆ˜ν–‰ν•  수 μžˆλ‹€.
  • λ¬Έμžμ—΄ 연산이 빈번히 λ°œμƒν•˜λŠ” κ²½μš°μ— μœ μš©ν•˜λ‹€. StringBuffer ν΄λž˜μŠ€λŠ” κΈ°μ‘΄ 객체의 λ‚΄μš©μ„ λ³€κ²½ν•˜λ―€λ‘œ, μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. 이λ₯Ό 톡해 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰κ³Ό μ„±λŠ₯이 κ°œμ„ λœλ‹€.
  • λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€. μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— StringBuffer 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄ 연산을 μˆ˜ν–‰ν•΄λ„, 동기화 처리λ₯Ό 톡해 예기치 μ•Šμ€ κ²°κ³Όλ₯Ό 방지할 수 μžˆλ‹€.

3. StringBuilder 클래슀의 μ‚¬μš© 이유

StringBuilder ν΄λž˜μŠ€λŠ” StringBuffer와 κΈ°λŠ₯적으둜 λ™μΌν•˜μ§€λ§Œ, μŠ€λ ˆλ“œ 동기화λ₯Ό κ³ λ €ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ μ—μ„œ 차이가 μžˆλ‹€. λ‹€μŒμ€ StringBuilder 클래슀의 μ‚¬μš© μ΄μœ μ΄λ‹€.

  • μ‹±κΈ€μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ λ¬Έμžμ—΄ 연산을 μˆ˜ν–‰ν•  λ•Œμ— μ‚¬μš©ν•œλ‹€. μŠ€λ ˆλ“œ 동기화λ₯Ό κ³ λ €ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— StringBuffer보닀 μ„±λŠ₯상 이점이 μžˆλ‹€.
  • λ¬Έμžμ—΄ 연산이 빈번히 λ°œμƒν•˜λŠ” κ²½μš°μ— μœ μš©ν•˜λ‹€. StringBuilder ν΄λž˜μŠ€λŠ” κΈ°μ‘΄ 객체의 λ‚΄μš©μ„ λ³€κ²½ν•˜λ―€λ‘œ, μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. 이λ₯Ό 톡해 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰κ³Ό μ„±λŠ₯이 κ°œμ„ λœλ‹€.
  • λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” 동기화 처리λ₯Ό 직접 관리해주어야 μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

μ μ ˆν•œ λ¬Έμžμ—΄ 처리 클래슀λ₯Ό μ„ νƒν•˜μ—¬ μ‚¬μš©ν•¨μœΌλ‘œμ¨, λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰κ³Ό μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆλ‹€. 상황에 λ§žλŠ” 클래슀λ₯Ό μ„ νƒν•˜μ—¬ λ¬Έμžμ—΄ 연산을 μˆ˜ν–‰ν•˜λ„λ‘ ν•œλ‹€.

VI. μ‚¬μš© 이유

String, StringBuffer, StringBuilder ν΄λž˜μŠ€λŠ” λ¬Έμžμ—΄μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ λ‹€μ–‘ν•œ ν΄λž˜μŠ€μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ, 각각의 ν΄λž˜μŠ€λŠ” λ‹€μ–‘ν•œ νŠΉμ§•κ³Ό μš©λ„λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. 이번 μ„Ήμ…˜μ—μ„œλŠ” 각 클래슀의 μ‚¬μš© μ΄μœ μ— λŒ€ν•΄ μžμ„Ένžˆ μ„€λͺ…ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

1. String 클래슀의 μ‚¬μš© 이유

String ν΄λž˜μŠ€λŠ” Javaμ—μ„œ κ°€μž₯ 일반적으둜 μ‚¬μš©λ˜λŠ” λ¬Έμžμ—΄ 처리 ν΄λž˜μŠ€μž…λ‹ˆλ‹€. μ•„λž˜λŠ” String 클래슀의 μ‚¬μš© μ΄μœ μ— λŒ€ν•œ μ„€λͺ…μž…λ‹ˆλ‹€.

  • String κ°μ²΄λŠ” λΆˆλ³€(immutable) 속성을 가지고 μžˆμŠ΅λ‹ˆλ‹€. 즉, ν•œ 번 μƒμ„±λœ λ¬Έμžμ—΄μ€ λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ νŠΉμ§•μ€ μ•ˆμ •μ„±κ³Ό 예츑 κ°€λŠ₯성을 λ†’μž…λ‹ˆλ‹€.
  • λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μŠ€λ ˆλ“œ 간에 κ³΅μœ λ˜λŠ” λ°μ΄ν„°λ‘œ μ‚¬μš©ν•¨μœΌλ‘œμ¨ 동기화 문제λ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ¬Έμžμ—΄ 연산이 ν•„μš”ν•œ 경우, μƒˆλ‘œμš΄ String 객체가 μƒμ„±λ©λ‹ˆλ‹€. κΈ°μ‘΄ 객체의 λ‚΄μš©μ΄ λ³€κ²½λ˜μ§€ μ•Šμ•„ 예기치 μ•Šμ€ κ²°κ³Όλ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ‚΄λΆ€μ μœΌλ‘œ λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄ ν’€(string literal pool)μ΄λΌλŠ” μ˜μ—­μ„ μ‚¬μš©ν•˜μ—¬ λ™μΌν•œ λ¬Έμžμ—΄μ„ κ³΅μœ ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 λ™μΌν•œ λ¬Έμžμ—΄μ— λŒ€ν•œ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2. StringBuffer 클래슀의 μ‚¬μš© 이유

StringBuffer ν΄λž˜μŠ€λŠ” λ¬Έμžμ—΄μ„ κ°€λ³€μ μœΌλ‘œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 클래슀둜, λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜λŠ” StringBuffer 클래슀의 μ‚¬μš© μ΄μœ μ— λŒ€ν•œ μ„€λͺ…μž…λ‹ˆλ‹€.

  • StringBuffer κ°μ²΄λŠ” 가변적인 속성을 κ°€μ§‘λ‹ˆλ‹€. λ”°λΌμ„œ, ν•œ 번 μƒμ„±λœ 객체의 λ‚΄μš©μ„ λ³€κ²½ν•  수 μžˆμ–΄ λ¬Έμžμ—΄ 연산을 μœ μ—°ν•˜κ²Œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ¬Έμžμ—΄ 연산이 빈번히 λ°œμƒν•˜λŠ” κ²½μš°μ— μœ μš©ν•©λ‹ˆλ‹€. StringBuffer ν΄λž˜μŠ€λŠ” κΈ°μ‘΄ 객체의 λ‚΄μš©μ„ λ³€κ²½ν•˜λ―€λ‘œ, μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰κ³Ό μ„±λŠ₯을 κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— StringBuffer 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄ 연산을 μˆ˜ν–‰ν•΄λ„, 동기화 처리λ₯Ό 톡해 예기치 μ•Šμ€ κ²°κ³Όλ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

3. StringBuilder 클래슀의 μ‚¬μš© 이유

StringBuilder ν΄λž˜μŠ€λŠ” StringBuffer와 κΈ°λŠ₯적으둜 λ™μΌν•˜μ§€λ§Œ, μŠ€λ ˆλ“œ 동기화λ₯Ό κ³ λ €ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ•„λž˜λŠ” StringBuilder 클래슀의 μ‚¬μš© μ΄μœ μ— λŒ€ν•œ μ„€λͺ…μž…λ‹ˆλ‹€.

  • μ‹±κΈ€μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ λ¬Έμžμ—΄ 연산을 μˆ˜ν–‰ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. μŠ€λ ˆλ“œ 동기화λ₯Ό κ³ λ €ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— StringBuilderλŠ” StringBuffer보닀 μ„±λŠ₯적인 이점이 μžˆμŠ΅λ‹ˆλ‹€.
  • λ¬Έμžμ—΄ 연산이 빈번히 λ°œμƒν•˜λŠ” κ²½μš°μ— μœ μš©ν•©λ‹ˆλ‹€. StringBuilder ν΄λž˜μŠ€λŠ” κΈ°μ‘΄ 객체의 λ‚΄μš©μ„ λ³€κ²½ν•˜λ―€λ‘œ, μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰κ³Ό μ„±λŠ₯을 κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” 직접 동기화 처리λ₯Ό ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

μ μ ˆν•œ λ¬Έμžμ—΄ 처리 클래슀λ₯Ό μ„ νƒν•˜μ—¬ μ‚¬μš©ν•¨μœΌλ‘œμ¨, λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰κ³Ό μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 상황에 λ§žλŠ” 클래슀λ₯Ό μ„ νƒν•˜μ—¬ λ¬Έμžμ—΄ 연산을 μˆ˜ν–‰ν•˜μ„Έμš”.

λŒ“κΈ€