Skip to content

Latest commit

ย 

History

History
88 lines (46 loc) ยท 4.13 KB

[Java] Java์˜ String.md

File metadata and controls

88 lines (46 loc) ยท 4.13 KB

Java์˜ String์— ๊ด€ํ•ด์„œ

Java์—์„œ String์€ ๊ต‰์žฅํžˆ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋‘ ๊ฐ€์ง€ ์ƒ์„ฑ ๋ฐฉ์‹์ด ์žˆ๋‹ค.

  1. new ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•œ ๋ฐฉ์‹
  2. ๋ฆฌํ„ฐ๋Ÿด์„ ์ด์šฉํ•œ ๋ฐฉ์‹

์ด ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์—๋Š” ํฐ ์ฐจ์ด์ ์ด ์กด์žฌํ•œ๋‹ค.

new๋ฅผ ํ†ตํ•ด String ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด Heap ์˜์—ญ์— ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.

๋ฆฌํ„ฐ๋Ÿด์„ ์ด์šฉํ•  ๊ฒฝ์šฐ, String Constant Pool์ด๋ผ๋Š” ์˜์—ญ์— ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.

public class StringMemory{
  public static void main(String[] args){
    String literal = "loper";
    String object = new String("loper");
    
    literal == object; // false
    literal.equals(object); // true
  }
}
  • == ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋Š” false์ด๋‹ค. == ์—ฐ์‚ฐ์ž๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ ๊ฐ์ฒด์ฒ˜๋Ÿผ Heap ์˜์—ญ์— ์ƒ์„ฑ๋œ String ๊ฐ์ฒด์™€ ๋ฆฌํ„ฐ๋Ÿด์„ ์ด์šฉํ•ด String Constant Pool์— ์ €์žฅ๋œ String ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์€ ๋‹ค๋ฅผ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.
  • equals() ๋ฉ”์†Œ๋“œ์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋Š” true์ด๋‹ค. ์ด๋Š” ๋ฌธ์ž์—ด ๋‚ด์šฉ์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด์„œ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋งž๋‹ค.

์™œ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ๊นŒ?

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋™์ž‘ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. String์„ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์„ ์–ธํ•  ๊ฒฝ์šฐ, ๋‚ด๋ถ€์ ์œผ๋กœ String์˜ intern()์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ฒŒ ๋œ๋‹ค.

  • intern() : ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์ด String Constant Pool์— ์กด์žฌํ•˜๋Š”์ง€ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ ์ฃผ์†Œ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์—†๋‹ค๋ฉด String Constant Pool์— ๋„ฃ๊ณ  ์ƒˆ๋กœ์šด ์ฃผ์†Œ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.
public class StringMemoryInternTest{
  public static void main(Strig[] args){
    String literal = "loper";
    String object = new String("loper");
    String intern = object.intern(); // ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœ. 
    
    literal == object; // false
    literal.equals(object); // true
    
    literal == intern; // true
    literal.equals(intern); // true
  }
}

๊ธฐ์กด์— new๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ String ๊ฐ์ฒด์™€ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ƒ์„ฑ๋œ String ๊ฐ์ฒด๋ฅผ == ์—ฐ์‚ฐํ•˜์˜€์„ ๊ฒฝ์šฐ, false๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์ง€๋งŒ new๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ String ๊ฐ์ฒด์˜ intern() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด String ๊ฐ์ฒด์ธ intern์— ๋Œ€์ž…ํ•  ๊ฒฝ์šฐ, ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ƒ์„ฑ๋œ String ๊ฐ์ฒด์™€ == ์—ฐ์‚ฐ์‹œ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ๋ฆฌํ„ฐ๋Ÿด๋กœ "loper"๋ผ๋Š” ๋ฌธ์ž์—ด์ด String Constant Pool์— ์ €์žฅ๋˜์—ˆ๊ณ , intern() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ String Constant Pool์— "loper"๋ผ๋Š” ๋ฌธ์ž์—ด์„ ๊ฒ€์ƒ‰ํ•˜๊ฒŒ ๋˜๊ณ  ์ด๋ฏธ ์ €์žฅ๋œ "loper" ๋ฌธ์ž์—ด์„ ๋ฐœ๊ฒฌํ• ํ…Œ๋‹ˆ ๋™์ผํ•œ ์ฃผ์†Œ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ true๊ฐ€ ์„ฑ๋ฆฝ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

String Constant Pool์˜ ์œ„์น˜ ๋ณ€๊ฒฝ

Java 6๊นŒ์ง€ String Constant Pool์˜ ์œ„์น˜๋Š” Perm ์˜์—ญ์ด์—ˆ๋‹ค. Perm ์˜์—ญ์— ์œ„์น˜ํ–ˆ๋˜๊ฒŒ Java 7์—์„œ Heap ์˜์—ญ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” OOM(Out Of Memory) ๋•Œ๋ฌธ์ด๋‹ค.

Perm ์˜์—ญ์€ ๊ณ ์ •๋œ ์‚ฌ์ด์ฆˆ์ด๋ฉฐ Runtime์— ์‚ฌ์ด์ฆˆ๊ฐ€ ํ™•์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. Perm ์˜์—ญ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๋Š˜๋ฆด์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์–ด์จŒ๊ฑฐ๋‚˜ Runtime์— ์‚ฌ์ด์ฆˆ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Java 6๊นŒ์ง€๋Š” String์˜ intern() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ OOM์„ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ  ๊ทธ ๋ถ€๋ถ„์„ ์ปจํŠธ๋กคํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋งž๋‹ค.

๊ทธ๋ž˜์„œ Oracle์˜ ์—”์ง€๋‹ˆ์–ด๋“ค์ด Java 7์—์„œ Perm ์˜์—ญ์ด ์•„๋‹Œ Heap ์˜์—ญ์œผ๋กœ String Constant Pool์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋‹ค. Heap ์˜์—ญ์œผ๋กœ ๋ณ€๊ฒฝํ•จ์œผ๋กœ์จ ์–ป๋Š” ์ด์ ์€ ๋ฌด์—‡์ผ๊นŒ?

-> ๋ฐ”๋กœ String Constant Pool์˜ ๋ชจ๋“  ๋ฌธ์ž์—ด๋„ GC์˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

String Constant Pool์˜ ์‚ฌ์ด์ฆˆ ๋˜ํ•œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, -xx:StringTableSize ์˜ต์…˜์œผ๋กœ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์—ฌ๊ธฐ์—๋Š” 1,000,000๊ณผ ๊ฐ™์€ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ 1,000,003๊ณผ ๊ฐ™์€ ์†Œ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” hashCode ์„ฑ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์ด๋ฉฐ ์•„ํ‹ฐํด์— ์ž์„ธํ•œ ๋‚ด์šฉ์ด ๋‚˜์™€์žˆ๋‹ค.

++ 2020.09.19 ์ถ”๊ฐ€ ํ•ด๋‹น ๋ธ”๋กœ๊ทธ์˜ ๋‚ด์šฉ์ด ์ดํ•ด๊ฐ€ ์ž˜๋˜์–ด์„œ ์ฒจ๋ถ€ํ•˜๋ฉฐ, ์ถ”ํ›„์— ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.