1~3. Object ํด๋ž˜์Šค์™€ equals()


Object ํด๋ž˜์Šค

  • ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์ตœ๊ณ  ์กฐ์ƒ. ์˜ค์ง 11๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋งŒ์„ ๊ฐ–๊ณ  ์žˆ์Œ
  • notify(), wait() ๋“ฑ์€ ์“ฐ๋ ˆ๋“œ ๊ด€๋ จ ๋ฉ”์„œ๋“œ

eqauls(Object obj)

  • ๊ฐ์ฒด ์ž์‹ (this)๊ณผ ์ฃผ์–ด์ง„ ๊ฐ์ฒด(obj)๋ฅผ ๋น„๊ต
  • Object ํด๋ž˜์Šค์˜ equals()๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ๋น„๊ต(์ฐธ์กฐ๋ณ€์ˆ˜ ๊ฐ’ ๋น„๊ต)
class Value {
	int value;
	Value(int value) {
		this.value = value;
	}
	// equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ value๋ฅผ ๋น„๊ต
	@Override
	public boolean equals(Object obj) {
		// ์ฐธ์กฐ๋ณ€์ˆ˜ ํ˜•๋ณ€ํ™˜ ์ „์—๋Š” ํ•ญ์ƒ instanceof ๋กœ ํ™•์ธ
		if (!(obj instanceof Value)) {
			return false;
		}
		Value v = (Value)obj;
		return this.value == v.value;
	}
}
public class Ex9_1 {
	public static void main(String[] args) {
		Value v1 = new Value(10);
		Value v2 = new Value(10);
		// v1๊ณผ v2์˜ ๊ฐ’์€ ๊ฐ™์ง€๋งŒ equals ๊ฐ€ ๋น„๊ตํ•˜๋Š” ๊ฐ’์€ ์ฐธ์กฐ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— false ๋ฐ˜ํ™˜
		System.out.println(v1.equals(v2));
	}
}

eqauls(Object obj)์˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ

  • ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜(iv)์˜ ๊ฐ’์„ ๋น„๊ตํ•˜๋„๋ก equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
class Person {
	long id;
	public boolean equals(Object obj) {
		if (obj instanceof Person) {
			return id == ((Person)obj).id;
		} else {
			return false;
		}
	}
	Person(long id) {
		this.id = id;
	}
}

4~6. hashCode(), toString()


hashCode()

  • ๊ฐ์ฒด์˜ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • Object ํด๋ž˜์Šค์˜ hashCode()๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ int๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฐ˜ํ™˜
  • equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋ฉด, hashCode()๋„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผ ํ•จ
    • equals() ๊ฒฐ๊ณผ๊ฐ€ true ๋ฉด ๋‘ ๊ฐ์ฒด์˜ ํ•ด์‹œ์ฝ”๋“œ๋Š” ๊ฐ™์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ
  • System.identityHashCode(Object obj)๋Š” Object ํด๋ž˜์Šค์˜ hashCode()์™€ ๋™์ผ

toString(), toString()์˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ

  • toString() : ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ
public String toString() {
	return getClass.getName() + "@" + Integer.toHexString(hashCode());
}
class Card {
	String kind;
	int number;
	Card() {
		this("SPADE", 1);
	}
	Card(String kind, int number) {
		this.kind = kind;
		this.number = number;
	}
	// equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— hashCode()๋„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
	@Override
	public int hashCode() {
		return Objects.hash(kind, number);
	}
	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof Card)) {
			return false;
		}
		return this.kind.equals(((Card)obj).kind) && this.number == ((Card)obj).number;
	}
	@Override
	public String toString() {
		return "kind : " + kind + " number : " + number;
	}
}
public class Ex9_4 {
	public static void main(String[] args) {
		Card c1 = new Card();
		Card c2 = new Card();
		System.out.println(c1.equals(c2));
		System.out.println(c1.toString());
		System.out.println(c2.toString());
		System.out.println(c1.hashCode());
		System.out.println(c2.hashCode());
	}
}

7~10. String ํด๋ž˜์Šค


String ํด๋ž˜์Šค

  • String ํด๋ž˜์Šค = ๋ฐ์ดํ„ฐ(char[]) + ๋ฉ”์„œ๋“œ(๋ฌธ์ž์—ด ๊ด€๋ จ)
public final class String implements java.io.Serializable, Comparable {
	private char[] value;
		...
}
  • ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ถˆ๋ณ€(immutable) ํด๋ž˜์Šค
String a = "a";
String b = "b";
a = a + b; // "a" ๋Š” ์‚ฌ๋ผ์ง€๊ณ  "ab" ๊ฐ€ ์ฐธ์กฐ๋ณ€์ˆ˜ a ์— ๋‹ค์‹œ ํ• ๋‹น๋จ
  • ๋ง์…ˆ ์—ฐ์‚ฐ์ž(+)๋ฅผ ์ด์šฉํ•œ ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ์€ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง
    • ๋ฌธ์ž์—ด์˜ ๊ฒฐํ•ฉ์ด๋‚˜ ๋ณ€๊ฒฝ์ด ์žฆ๋‹ค๋ฉด, ๋‚ด์šฉ์„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ StringBuffer ์‚ฌ์šฉ
String str = "hello";
str = str + " world";

Java ์—์„œ String ํƒ€์ž…์€ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋‹ค. ์ฆ‰, ์œ„ ์ฝ”๋“œ์—์„œ "hello" ๊ฐ€ "hello world" ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ "hello" ์™€ "hello world" ๊ฐ์ฒด๊ฐ€ ๋”ฐ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

str ๋ณ€์ˆ˜๊ฐ€ "hello" ์—์„œ "hello world" ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋ฉด "hello" ๊ฐ์ฒด๋Š” ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ์ƒํƒœ๊ฐ€ ๋˜์–ด GC ์˜ ๋Œ€์ƒ์ด ๋œ๋‹ค.

String str = "";
for (int i = 0; i < 10000; i++) {
    str += i;
}

๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋ฉด ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” String ๊ฐ์ฒด 10000๊ฐœ๊ฐ€ Heap ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์— ์น˜๋ช…์ ์ผ ์ˆ˜ ์žˆ๋‹ค.

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++) {
    sb.append(i);
}
String str = sb.toString();

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋ณ€์„ฑ์„ ๊ฐ€์ง€๋Š” StringBuilder ์™€ StringBuffer ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„ ์ฝ”๋“œ ์ฒ˜๋Ÿผ .append() .delete() ๋“ฑ์˜ API ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผ ๊ฐ์ฒด ๋‚ด์—์„œ ๋ฌธ์ž์—ด์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ์ด ๋นˆ๋ฒˆํ•œ ๋กœ์ง์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒฝ์šฐ StringBuilder ์™€ StringBuffer ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ด๋‹ค.

๋ฌธ์ž์—ด์˜ ๋น„๊ต

  • String str = โ€œabc; ์™€ String str = new String(โ€abcโ€); ์˜ ๋น„๊ต
String str1 = "abc";             // ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด "abc"์˜ ์ฃผ์†Œ๊ฐ€ str1์— ์ €์žฅ๋จ
String str2 = "abc";             // ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด "abc"์˜ ์ฃผ์†Œ๊ฐ€ str2์— ์ €์žฅ๋จ
String str3 = new String("abc"); // ์ƒˆ๋กœ์šด String ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
String str4 = new String("abc"); // ์ƒˆ๋กœ์šด String ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
str1 == str2      // true;
str1.equals(str2) // true;
str3 == str4      // false;
str3.equals(str4) // true;

๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด

  • ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋จ (constant pool์— ์ €์žฅ)
  • ๊ฐ™์€ ๋‚ด์šฉ์˜ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์€ ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค์–ด์ง

๋นˆ ๋ฌธ์ž์—ด ("", empty String)

  • ๋‚ด์šฉ์ด ์—†๋Š” ๋ฌธ์ž์—ด. ํฌ๊ธฐ๊ฐ€ 0์ธ charํ˜• ๋ฐฐ์—ด์„ ์ €์žฅํ•˜๋Š” ๋ฌธ์ž์—ด
  • ํฌ๊ธฐ๊ฐ€ 0์ธ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์–ด๋Š ํƒ€์ž…์ด๋‚˜ ๊ฐ€๋Šฅ
  • ๋ฌธ์ž์™€ ๋ฌธ์ž์—ด์˜ ์ดˆ๊ธฐํ™”
String s = null;
char c = '\u0000';
// ์œ„ ๋ณด๋‹ค ์•„๋ž˜์˜ ์ฝ”๋“œ๊ฐ€ ๋‚˜์Œ
Stirng s = "";
char c = ' ';

11. String ์ƒ์„ฑ์ž


String ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์™€ ๋ฉ”์„œ๋“œ

// String(String s) ๊ฑฐ์˜ ์•ˆ์”€
String s = new String("Hello");
// String(char[] value)
char[] c = {'H', 'e', 'l', 'l', 'o'};
String s = new String(c);
// String(StringBuffer buf)
StringBuffer sb = new StringBuffer("Hello");
String s = new String(sb);
// char charAt(int index)
String s = "Hello";
String n = "0123456";
char c = s.charAt(1);  // 'e'
cahr c2 = n.charAt(1); // '1'
// int compareTo(String str)
int i = "aaa".compareTo("aaa");  // i  = 0
int i2 = "aaa".compareTo("bbb"); // i2 = -1
int i3 = "bbb".compareTo("aaa"); // i3 = 1
// String concat(String str)
String s = "Hello";
String s2 = s.concat(" World"); // s2 = "Hello World"
// boolean contains(CharSequence s)
String s = "abcdefg";
boolean b = s.contains("bc"); // b = true
// boolean endsWith(String suffix)
String file = "Hello.txt";
boolean b = file.endsWith("txt"); // b = true
// boolean equals(Object obj)
String s = "Hello";
boolean b = s.equals("Hello");  // true
boolean b2 = s.equals("hello"); // false
// boolean equalsIgnoreCase(String str)
String s = "Hello";
boolean b = s.equalsIgnoreCase("HELLO");  // true
boolean b2 = s.equalsIgnoreCase("heLLo"); // true
// int indexOf(int ch)
String s = "Hello";
int idx1 = s.indexof('o'); // 4
int idx2 = s.indexof('k'); // -1
// int indexOf(int ch, int pos)
String s = "Hello";
int idx1 = s.indexof('e', 0); // 1
int idx2 = s.indexof('e', 2); // -1
// int indexOf(String str)
String s = "ABCDEFG";
int idx = s.indexOf("CD"); // 2
// int lastIndexOf(int ch)
String s = "java.lang.Object";
int idx1 = s.lastIndexOf('.'); // 9
int idx2 = s.indexOf('.');     // 4
// int lastIndexOf(String str)
String s = "java.lang.java";
int idx1 = s.lastIndexOf('java'); // 10
int idx2 = s.indexOf('java');     // 0
// int length()
String s = "Hello";
int length = s.length(); // 5
// String[] split(String regex)
String animals = "dog,cat,bear";
String arr[] = animals.split(","); // {"dog", "cat", "bear"}
// String[] split(String regex, int limit)
String animals = "dog,cat,bear";
String arr[] = animals.split(",", 2); // {"dog", "cat,bear"}
// boolean startsWith(String prefix)
String s = "java.lang.Object";
boolean b = s.startsWith("java");  // true
boolean b2 = s.startsWith("lang"); // false
// String substring(int begin, int end)
String s = "java.lang.Object";
String c = s.substring(10);   // "Object"
String p = s.substring(5, 9); // "lang"
// String toLowerCase()
String s = "Hello";
String s1 = s.toLowerCase(); // "hello"
// String toUpperCase()
String s = "Hello";
String s1 = s.toUpperCase(); // "HELLO"
// String trim()
String s = "   Hello World   ";
String s1 = s.trim(); // "Hello World"
// static String valueOf(๊ธฐ๋ณธํ˜•)
String b = String.valueOf(true); // "true"
String c = String.valueOf('a'); // "a"
String i = String.valueOf(100); // "100"

12~14. StringJoiner, ๋ฌธ์ž์—ด๊ณผ ๊ธฐ๋ณธํ˜•


join()๊ณผ StringJoiner

  • join()์€ ์—ฌ๋Ÿฌ ๋ฌธ์ž์—ด ์‚ฌ์ด์— ๊ตฌ๋ถ„์ž๋ฅผ ๋„ฃ์–ด์„œ ๊ฒฐํ•ฉ
String animals = "dog,cat,bear";
String[] arr = animals.split(",");
String str = String.join("-", arr);
System.out.println(str); // dog-cat-bear

๋ฌธ์ž์—ด๊ณผ ๊ธฐ๋ณธํ˜• ๊ฐ„์˜ ๋ณ€ํ™˜

  • ์ˆซ์ž๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•
int i = 100;
String str1 = i + "";
String str2 = String.valueOf(i);
  • ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•
int i = Integer.parseInt("100");
int i2 = Integer.valueOf("100");
Integer i2 = Integer.valueOf("100"); // ์›๋ž˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์€ Integer

15~18. StringBuffer ํด๋ž˜์Šค


StringBuffer ํด๋ž˜์Šค

  • String ์ฒ˜๋Ÿผ ๋ฌธ์žํ˜• ๋ฐฐ์—ด(char[])์„ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • ๊ทธ๋Ÿฌ๋‚˜ String ๊ณผ ๋‹ฌ๋ฆฌ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ (mutable)

StringBuffer์˜ ์ƒ์„ฑ์ž

  • ๋ฐฐ์—ด์€ ๊ธธ์ด ๋ณ€๊ฒฝ๋ถˆ๊ฐ€. ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•˜๋ฉด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด ์ƒ์„ฑ
  • StringBuffer๋Š” ์ €์žฅํ•  ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๊ณ ๋ คํ•ด์„œ ์ ์ ˆํ•œ ํฌ๊ธฐ๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•จ
public StringBuffer(int length) {
	value = new char[length];
	shared = false;
}
public StringBuffer() {
	this(16); // ๋ฒ„ํผ์˜ ํฌ๊ธฐ ๋ฏธ์ง€์ • ์‹œ 16์œผ๋กœ ์ƒ์„ฑ
}
public StringBuffer(String str) {
	this(str.length() + 16); // ์ง€์ •ํ•œ ๋ฌธ์ž์—ด๋ณด๋‹ค 16 ํฌ๊ฒŒ ์ƒ์„ฑ
	append(str);
}

StringBuffer์˜ ๋ณ€๊ฒฝ

  • StringBuffer ๋Š” String ๊ณผ ๋‹ฌ๋ฆฌ ๋‚ด์šฉ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅ
  • append() ๋Š” ์ง€์ •๋œ ๋‚ด์šฉ์„ StringBuffer ์— ์ถ”๊ฐ€ ํ›„, StringBuffer ์˜ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜
StringBuffer sb2 = sb.append("ZZ");
System.out.println(sb);  // abc123ZZ
System.out.println(sb2); // abc123ZZ
// ์•„๋ž˜์™€ ๊ฐ™์ด ์จ๋„๋œ๋‹ค
StringBuffer sb = new StringBuffer("abc");
sb.append("123").append("ZZ");

StringBuffer์˜ ๋น„๊ต

  • StringBuffer ๋Š” equals() ๊ฐ€ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋˜์–ด ์žˆ์ง€ ์•Š์Œ (์ฃผ์†Œ ๋น„๊ต)
  • StringBuffer ์„ String ์œผ๋กœ ๋ณ€ํ™˜ ํ›„์— equals() ๋กœ ๋น„๊ต
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb.equals(sb2)); // false
String s = sb.toString();
String s2 = sb2.toString();
System.out.println(s.equals(s2)); // true

19~20. StringBuffer ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ


StringBuffer ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ

public class Ex9_12 {
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("01");
		StringBuffer sb2 = sb.append(23);
		sb.append('4').append(56);
		StringBuffer sb3 = sb.append(78);
		sb3.append(9.0);
		System.out.println("sb =" + sb);
		System.out.println("sb2=" + sb2);
		System.out.println("sb3=" + sb3);
		System.out.println("sb =" + sb.deleteCharAt(10));
		System.out.println("sb =" + sb.delete(3, 6));
		System.out.println("sb =" + sb.insert(3, "abc"));
		System.out.println("sb =" + sb.replace(6, sb.length(), "END"));
		System.out.println("capacity=" + sb.capacity());
		System.out.println("length=" + sb.length());
	}
}

21~24. StringBuilder, Math ํด๋ž˜์Šค


StringBuilder

  • StringBuffer๋Š” ๋™๊ธฐํ™” ๋˜์–ด ์žˆ์Œ. ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ์— ์•ˆ์ „ (thread-safe)
  • ๋ฉ€์‹œ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ๋™๊ธฐํ™”๋Š” ๋ถˆํ•„์š”ํ•œ ์„ฑ๋Šฅ ์ €ํ•˜
    • ์ด๋Ÿด ๋• StringBuffer ๋Œ€์‹  StringBuilder ๋ฅผ ์‚ฌ์šฉ

Math ํด๋ž˜์Šค

  • ์ˆ˜ํ•™ ๊ด€๋ จ static ๋ฉ”์„œ๋“œ์˜ ์ง‘ํ•ฉ
public class RoundTest {
	public static void main(String[] args) {
		for (double d = 1.5; d <= 10.5; d++) {
			double d1 = Math.round(d);
			double d2 = Math.rint(d);
			System.out.printf("%4.1f %4.1f %4.1f%n", d, d1, d2);
		}
	}
}
 1.5  2.0  2.0
 2.5  3.0  2.0
 3.5  4.0  4.0
 4.5  5.0  4.0
 5.5  6.0  6.0
 6.5  7.0  6.0
 7.5  8.0  8.0
 8.5  9.0  8.0
 9.5 10.0 10.0
10.5 11.0 10.0

StringBuilder ์™€ StringBuffer ์˜ ์ฐจ์ด


public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, Comparable<StringBuilder>, CharSequence
{
public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, Comparable<StringBuffer>, CharSequence
{

StringBuilder ์™€ StringBuffer ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋™์ผํ•œ ์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ๋‹ค. ์ฆ‰, ๋™์ผํ•œ API ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋‘˜์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ผ๊นŒ?

// StringBuilder
@Override
@HotSpotIntrinsicCandidate
public StringBuilder append(String str) {
    super.append(str);
    return this;
}
// StringBuffer
@Override
public synchronized StringBuffer append(Object obj) {
    toStringCache = null;
    super.append(String.valueOf(obj));
    return this;
}

.append() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ด ๋‘˜์˜ ์ฐจ์ด๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. StringBuilder ์™€ ๋‹ฌ๋ฆฌ StringBuffer ๋Š” synchronized ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, StringBuilder ๋Š” Thread-Safe ํ•˜์ง€ ์•Š์€ ๋ฐ˜๋ฉด StringBuffer ๋Š” Thread-Safe ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ์˜ ์•ˆ์ •์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, StringBuilder ๋Š” ๋™๊ธฐํ™”๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„  StringBuffer ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์œ„ ๊ทธ๋ฆผ์€ String StringBuilder StringBuffer ์˜ ํŠน์ง•์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌ๋œ ํ‘œ์ด๋‹ค. ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์— ๋งž์ถฐ ์•Œ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

25~27. ๋ž˜ํผํด๋ž˜์Šค, Number ํด๋ž˜์Šค


๋ž˜ํผ(wrapper) ํด๋ž˜์Šค

  • 8๊ฐœ์˜ ๊ธฐ๋ณธํ˜•์„ ๊ฐ์ฒด๋กœ ๋‹ค๋ค„์•ผํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค
    • boolean โ†’ Boolean
    • char โ†’ Character
    • int โ†’ Integer

Number ํด๋ž˜์Šค

  • ๋ชจ๋“  ์ˆซ์ž ๋ž˜ํผ ํด๋ž˜์Šค์˜ ์กฐ์ƒ

28~31. ์˜คํ† ๋ฐ•์‹ฑ & ์–ธ๋ฐ•์‹ฑ


๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

  • ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•
int     i  = new Integer("100").intValue();
int     i2 = Integer.parseInt("100");       // ์ฃผ๋กœ ์ด ๋ฐฉ๋ฒ•์„ ๋งŽ์ด ์‚ฌ์šฉ
Integer i3 = Integer.valueOf("100");
  • n์ง„๋ฒ•์˜ ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•
int i4 = Integer.parseInt("100",2);  // 100(2)  -> 4
int i5 = Integer.parseInt("100",8);  // 100(8)  -> 64
int i6 = Integer.parseInt("100",16); // 100(16) -> 256
int i7 = Integer.parseInt("FF",16);  // FF(16)  -> 255

์˜คํ† ๋ฐ•์‹ฑ & ์–ธ๋ฐ•์‹ฑ

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(10);            // ์˜คํ† ๋ฐ•์‹ฑ. 10 -> new Integer(10)
int value = list.get(0); // ์–ธ๋ฐ•์‹ฑ. new Integer(10) -> 10
  • ๊ธฐ๋ณธํ˜•๊ณผ ์ฐธ์กฐํ˜• ๊ฐ„์˜ ์ž๋™ ํ˜•๋ณ€ํ™˜
    • ์˜คํ† ๋ฐ•์‹ฑ : int โ†’ Integer (๊ธฐ๋ณธํ˜•์„ ๋ž˜ํผํด๋ž˜์Šค๋กœ)
    • ์–ธ๋ฐ•์‹ฑ : Integer โ†’ int (๋ž˜ํผํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ณธํ˜•์œผ๋กœ)
public class Ex9_16 {
	public static void main(String[] args) {
		int i = 10;
		
		// ๊ธฐ๋ณธํ˜•์„ ์ฐธ์กฐํ˜•์œผ๋กœ ํ˜•๋ณ€ํ™˜(ํ˜•๋ณ€ํ™˜ ์ƒ๋žต๊ฐ€๋Šฅ)
		Integer intg = (Integer)i; // Integer intg = Integer.valueOf(i);
		Object obj = (Object)i;    // Object obj = (Object)Integer.valueOf(i);
		
		Long lng = 100L; // Long lng = new Long(100L);
		
		int i2 = intg + 10;  // ์ฐธ์กฐํ˜•๊ณผ ๊ธฐ๋ณธํ˜•๊ฐ„์˜ ์—ฐ์‚ฐ ๊ฐ€๋Šฅ
		long l = intg + lng; // ์ฐธ์กฐํ˜• ๊ฐ„์˜ ๋ง์…ˆ๋„ ๊ฐ€๋Šฅ
		
		Integer intg2 = new Integer(20);
		int i3 = (int)intg2; // ์ฐธ์กฐํ˜•์„ ๊ธฐ๋ณธํ˜•์œผ๋กœ ํ˜•๋ณ€ํ™˜๋„ ๊ฐ€๋Šฅ(ํ˜•๋ณ€ํ™˜ ์ƒ๋žต๊ฐ€๋Šฅ)
	}
}