String
String ๋ฌธ์์ด
Heap ๋ฉ๋ชจ๋ฆฌ ์์ญ์ String ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ
String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1 == s2); false
=> ๋ด์ฉ๋ฌผ์ ๋์ผ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ์ง ์๊ณ ๋ฌด์กฐ๊ฑด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. => garbage๊ฐ ๋๋ฉด garbage collection์ ์ํด ์ ๊ฑฐ๋๋ค.
string constant pool ๋ฉ๋ชจ๋ฆฌ ์์ญ์ String ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ
String x1 = "Hello"; String ์ธ์คํด์ค์ ์ฃผ์๋ฅผ ๋ฆฌํดํ๋ค.
String x2 = "Hello"; ๊ธฐ์กด์ String ์ธ์คํด์ค ์ฃผ์๋ฅผ ๋ฆฌํดํ๋ค.
System.out.println(x1 == x2); true
=> Heap ์ด ์๋ String ์์ํ์ ์์ฑํ๋ค. => ๊ธฐ์กด ์ธ์คํด์ค์ ์ฃผ์๋ฅผ ๋ฆฌํด, ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๋๋ค. => JVM์ด ๋๋ ๋๊น์ง ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง๋๋ค.
String vs StringBuffer ๋น๊ต์ ๋ฐ๋ฅธ ์ฐจ์ด์
String s1 = new String("Hello");
String s2 = new String("Hello");
String s3 = "Hello";
System.out.println(s1.equals(s2)); // ๊ฒฐ๊ณผ: true ์ธ์คํด์ค ์ฃผ์๋ก ๋น๊ตํ์ฌ ๊ฐ์ด ๋์ผ
System.out.println(s1.equals(s3)); // ๊ฒฐ๊ณผ: true String ํด๋์ค์์ equals()๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ
// --------------------------------------------------------------------------------------------------------
StringBuffer b1 = new StringBuffer("Hello");
StringBuffer b2 = new StringBuffer("Hello");
System.out.println(b1 == b2); // ๊ฒฐ๊ณผ : false b1, b2 ์ธ์คํด์ค๊ฐ ๋ค๋ฅด๋๊น ๋น์ฐํ ๊ฒฐ๊ณผ๋ false์ด๋ค.
System.out.println(b1.equals(b2)); // ๊ฒฐ๊ณผ : false ์์ ๋ฐ์ equals()๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ์๊ณ Object์ equals()๋ฅผ ์ฌ์ฉ
ํด๊ฒฐ์ฑ
?
System.out.println(b1.toString().equals(b2.toString()));
// => StringBuffer์์ String์ ๊บผ๋ด ๋น๊ตํ๋ผ!
// --------------------------------------------------------------------------------------
String s1 = new String("Hello");
System.out.println(s1); ๊ฒฐ๊ณผ๊ฐ : Hello
System.out.println(s1.toString()); ๊ฒฐ๊ณผ๊ฐ : Hello
String s2 = s1.toString()
System.out.println(s1 == s2); true
=> ์์ ์ฝ๋๋ ํ๋ก์ ํธ์ toString ๊ณผ์ ์ด๋ ๋์ผํ ๊ณผ์ ์ ๊ฐ์ง๊ณ ์๋ค s1์ด String์ด๊ธฐ ๋๋ฌธ์ toString()์ ๋ฐ๋ก String์ ๋ง๋ค์ง ์๊ณ ๊ทธ๋ฅ s1 ์ฃผ์๋ฅผ ๋ฆฌํดํ๋ค. ๊ฒฐ๊ตญ ์ธ์คํด์ค์ด ์ฃผ์๋ฅผ ๋น๊ตํ์ฌ ๋์ผํ ๊ฐ์ด ๋๊ฒ ๋๋ค
String - mutable vs immutable ๊ฐ์ฒด
String ๊ฐ์ฒด๋ immutable ๊ฐ์ฒด์ด๋ค. ์ฆ ํ ๋ฒ ๊ฐ์ฒด์ ๊ฐ์ ๋ด์ผ๋ฉด ๋ณ๊ฒฝํ ์ ์๋ค.
StringBuffer๋ mutable ๊ฐ์ฒด์ด๋ค. ์๋์ ๋ฌธ์์ด์ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ํด๋์ค์ด๋ค.
StringBuffer๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์์ฌํญ!
StringBuffer์ ๋ด์ฉ๋ฌผ์ ๋น๊ตํ ๋ equals() ์ฌ์ฉํด๋ด์ผ ์์ฉ์๋ค. == ์ฐ์ฐ์์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
Stringbuffer์ object์์ ์์ ๋ฐ์ equals()๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ง ์์๊ธฐ ๋๋ฌธ์์ค๋ฒ๋ผ์ด๋ฉ์ ํ์ง ์์ object์ equals() ์ ์ฉ๋๊ฒ ๋๋ค
๋คํ์ ๋ณ์์ toString
Object obj = new String("Hello"); ์ธ์คํด์ค ์ฃผ์๊ฐ 100์ด๋ผ ๊ฐ์ ํ์;
String x1 = (String) obj; x1 = 100
String x2 = obj.toString(); x2 = 100
System.out.println(x1 == x2);
=> ๋ ํผ๋ฐ์ค๋ฅผ ํตํด ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ํญ์ ์๋ ๊ฐ์ฒด์ ํด๋์ค๋ถํฐ ๋ฉ์๋๋ฅผ ์ฐพ์ ์ฌ๋ผ๊ฐ๋ค. => ๋ฐ๋ผ์ obj๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด์ ํด๋์ค๊ฐ String์ด๊ธฐ ๋๋ฌธ์ obj.toString()์ String ํด๋์ค๋ถํฐ ํด๋น ๋ฉ์๋๋ฅผ ์ฐพ๋๋ค. => String ํด๋์ค๋ toString()์ ์ค๋ฒ๋ผ์ด๋ฉ ํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ obj.toString()์ String ํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ฉ ํ toString()์ ํธ์ถํ๋ ๊ฒ์ด๋ค.
Object (์ต์์)
toString()
A (์์)
toString(), m1()
B (ํ์, ์์)
toString(), m1(), m2()
// ์ปดํ์ผ๋ฌ๋ Object obj์ ๋ฉ์๋๋ง ํ์ธํ๋ฉฐ, tpye ๋ฐ๋ผ์๋ง ํ์ธํ๋ค
Object obj = new Object();
obj.toString(); O - object์ ์๋ toString()๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํ ๊ฒ์ด๋ค
obj.m1(); X object์๋ m1๋ผ๋ ๋ฉ์๋๊ฐ ์ ์ธ๋ ๊ฒ์ด ์๊ธฐ ๋๋ฌธ์ m2 ์ ์ฌ์ฉํ ์ ์๋ค
// ์ปดํ์ผ๋ฌ๊ฐ ๋ฉ์๋๋ฅผ ์ฐพ์ ๋๋ ํด๋น ํด๋์ค๋ถํฐ ์ฐพ๋๋ค
Object obj = new A();
obj.toString(); O - B์ ์๋ toString()๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํ ๊ฒ์ด๋ค
obj.m1(); O - B์ ์๋ m1()๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํ ๊ฒ์ด๋ค
obj.m2(); X
// ํด๋น ํด๋์ค์ ์ ์ธ๋ ๋ฉ์ค๋๊ฐ ์์ผ๋ฉด ์์ ํด๋์ค์์ ์ ์ธ๋ ๊ฒ์ ์ฌ์ฉํ๋ค
Object obj = new B();
obj.toString(); O - A์ ์๋ toString()๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํ ๊ฒ์ด๋ค
obj.m1(); O - B์ ์๋ m1()๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํ ๊ฒ์ด๋ค
obj.m2(); O
์ด๋ฐ ๊ณผ์ ์ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์งํฅ์ ๋ฐ๋ณต์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ C๋ณด๋ค ๋๋ฆฌ๋ค
๋คํ์ ๋ณ์์ ํ๋ณํ, toLoverCaser()
obj๋ฅผ ํตํด ์๋ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ํธ์ถ
Object obj = new String("Hello");
// 1. ์๋ ํ์
์ผ๋ก ํ๋ณํํ๋ผ.
String str = ((String)obj).toLowerCase();
System.out.println(str);
// 2. ์๋ ํ์
์ ๋ ํผ๋ฐ์ค์ ์ ์ฅํ ๋ค์ ์ฌ์ฉํ๋ผ.
String x1 = (String) obj;
str = x1.toLowerCase();
System.out.println(str);
Wrapper ํด๋์ค
๋ํผ ํด๋์ค์ ์ฃผ์ ์ฉ๋: => primitive data type์ ๊ฐ์ ๊ฐ์ฒด๋ก ์ฃผ๊ณ ๋ฐ์ ๋ ์ฌ์ฉํ๋ค. => primitive data type์ ๊ฐ์ ๊ฐ์ฒด์ ๋ด์ ์ ๋ฌํ๊ณ ์ถ๋ค๋ฉด ์ธ์ ๋ wrapper ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๋ฉด ๋๋ค.
Byte b2 = Byte.valueOf((byte)100);
Short s2 = Short.valueOf((short)20000);
Integer i2 = Integer.valueOf(3000000);
Long l2 = Long.valueOf(60000000000L);
Float f2 = Float.valueOf(3.14f);
Double d2 = Double.valueOf(3.14159);
Boolean bool2 = Boolean.valueOf(true);
Character c2 = Character.valueOf((char)0x41);
int ==> Integer Integer.valueOf ์คํ ๋ฐ์ฑ(auto-boxing) - ์๋์ผ๋ก
int i1 = 100;
Integer obj1 = Integer.valueOf(i1);
Integer ==> int obj2.intValue
Integer obj2 = Integer.valueOf(200);
int i2 = obj2.intValue();
auto-boxing/auto-unboxing ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ ํ ๊ฐ์ ๋ฉ์๋๋ก primitive data type๊ณผ ํด๋์ค๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒ์ด๋ค
Integer obj1 = new Integer(100);
new๋ฅผ ์์ฑํ์ฌ Heap์ ์ธ์คํด์ค๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ์ฃผ์๊ฐ ์๋๋ผ Data์ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ==๋ฅผ ํตํด ๋น๊ตํ๋ฉด ๋์ผํ ๊ฐ์ด ๋์ค์ง ์๋๋ค
Integer obj1 = 100;
์ ์ ๋ฆฌํฐ๋ด์ ์ด์ฉํ์ฌ auto-boxing์ผ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ๊ฒฝ์ฐ constants pool์ ์์ฑ
๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ Integer ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ ๊ฐ ์กด์ฌํด์ผ ํ ํ์๊ฐ ์๋ค.
Integer obj5 = Integer.valueOf(100);
์์ ๋์ผํ ์ฝ๋์ด๋ค
int i2 = obj2.intValue();
auto-unboxing ???
Last updated
Was this helpful?