๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Java·๏ปฟServlet·๏ปฟJSP

JAVA ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ์•„์•ผํ•  String ํด๋ž˜์Šค - 1ํŽธ

by Leica 2023. 2. 17.
๋ฐ˜์‘ํ˜•

 

๋ณธ ํฌ์ŠคํŒ…์—์„œ๋Š” 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 ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

๊ทธ๋Ÿผ ๋ชจ๋‘๋“ค ์—ด๊ณตํ•ด์š”!

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€