์ž๋ฐ”์˜ ์ •์„ - java.lang ํŒจํ‚ค์ง€

๋ธ”๋กœ๊ทธ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค! ๐Ÿก’ integer.blog



์ž๋ฐ”์˜ ์ •์„(๋‚จ๊ถ์„ฑ ์ €) ํ•™์Šต๋‚ด์šฉ ์ •๋ฆฌ

1. java.lang ํŒจํ‚ค์ง€

  • java.lang ํŒจํ‚ค์ง€์˜ ํด๋ž˜์Šค๋“ค์€ import๋ฌธ ์—†์ด๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

2. Object ํด๋ž˜์Šค

  • Object ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์ตœ๊ณ  ์กฐ์ƒ
  • Object ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋“ค์€ ๋ชจ๋“  ํด๋ž˜์Šค์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • Object ํด๋ž˜์Šค๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜๋Š” ์—†๊ณ  11๊ฐœ์˜ ๋ฉ”์†Œ๋“œ๋งŒ ์žˆ๋‹ค.
  • protected Object clone() : ๊ฐ์ฒด ์ž์‹ ์˜ ๋ณต์‚ฌ๋ณธ ๋ฐ˜ํ™˜
  • public boolean equals(Object obj) : ๊ฐ์ฒด ์ž์‹ ๊ณผ ๊ฐ์ฒด obj๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด์ธ์ง€ ํŒ๋‹จ
  • protected void finalize() : ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋  ๋•Œ ๊ฐ€๋น„์ง€์ฝœ๋ ‰ํ„ฐ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ํ˜ธ์ถœ(๊ฑฐ์˜ ์‚ฌ์šฉ์•ˆํ•จ)
  • public Class getClasss() : ๊ฐ์ฒด ์ž์‹ ์˜ ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” Class ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜
  • public int hashCode() : ๊ฐ์ฒด ์ž์‹ ์˜ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜
  • public String toString() : ๊ฐ์ฒด ์ž์‹ ์˜ ์ •๋ณด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜
  • public void notify() : ๊ฐ์ฒด ์ž์‹ ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ํ•˜๋‚˜๋งŒ ๊นจ์šด๋‹ค.
  • public void notifyAll() : ๊ฐ์ฒด ์ž์‹ ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๋ฅผ ๊นจ์šด๋‹ค.
  • public void wait(long timeout, int nanos) : ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ notify()๋‚˜ notifyAll()์„ ํ˜ธ์ถœํ•  ๋•Œ ๊นŒ์ง€ ํ˜„์žฌ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ฌดํ•œํžˆ ๋˜๋Š” ์ง€์ •๋œ ์‹œ๊ฐ„๋™์•ˆ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•œ๋‹ค.

3. equals(Object obj)

  • Object ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ equals ๋ฉ”์†Œ๋“œ๋Š” ๋‘ ๊ฐœ์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š”์ง€(๋‘ ์ฐธ์กฐ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ์ฃผ์†Œ๊ฐ’์ด ๊ฐ™์€์ง€) ํŒ๋‹จ
  • equals ๋ฉ”์†Œ๋“œ๋กœ Value ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” value๊ฐ’์„ ๋น„๊ตํ•˜๋ ค๋ฉด,
    Value ํด๋ž˜์Šค์—์„œ equals ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด์— ์ €์žฅ๋œ ๋‚ด์šฉ์„ ๋น„๊ตํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

4. hashCode()

  • ํ•ด์‹œํ•จ์ˆ˜๋Š” ์ฐพ๋Š” ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด, ๊ทธ ๊ฐ’์ด ์ €์žฅ๋œ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ํ•ด์‹œ์ฝ”๋“œ(hash code)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด์‹œ์ฝ”๋“œ๊ฐ€ ๊ฐ™์€ ๋‘ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ,
    Object ํด๋ž˜์Šค์— ์ •์˜๋œ hashCode ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ์ด์šฉํ•ด์„œ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
    ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐ์ฒด๋Š” ๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.
  • String ํด๋ž˜์Šค๋Š” ๋ฌธ์ž์—ด์˜ ๋‚ด์šฉ์ด ๊ฐ™์œผ๋ฉด ๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก hashCode๋ฉ”์†Œ๋“œ๊ฐ€ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
    ๋ฌธ์ž์—ด์˜ ๋‚ด์šฉ์ด ๊ฐ™์€ str1๊ณผ str2์— ๋Œ€ํ•ด hashCode()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•ญ์ƒ ๋™์ผํ•œ ํ•ด์‹œ์ฝ”๋“œ ๊ฐ’์„ ์–ป๋Š”๋‹ค.

5. toString()

  • Object ํด๋ž˜์Šค์— ์ •์˜๋œ toString()
    public String toString()  {
        return getClass().getName()+"@"+Integer.toHexString(hashCode());
    }
  • ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•  ๋•Œ toString()์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์ง€ ์•Š๊ณ , toString()์„ ํ˜ธ์ถœํ•˜๋ฉด ํด๋ž˜์Šค์ด๋ฆ„+16์ง„์ˆ˜์˜ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • String ํด๋ž˜์Šค์˜ toString()์€ String ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋˜์–ด ์žˆ๋‹ค.
  • Date ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ, Date ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋˜์–ด ์žˆ๋‹ค.

6. clone()

  • ์ž์‹ ์„ ๋ณต์ œํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • Object ํด๋ž˜์Šค์— ์ •์˜๋œ clone()์€ ๋‹จ์ˆœํžˆ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์˜ ๊ฐ’๋งŒ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—
    ์ฐธ์กฐํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค๋Š” ์™„์ „ํ•œ ์ธ์Šคํ„ด์Šค ๋ณต์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.
  • clone()์€ ๋ฐ˜๋“œ์‹œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

7. ๊ณต๋ณ€ ๋ฐ˜ํ™˜ํƒ€์ž… (covariant return type)

  • JDK1.5๋ถ€ํ„ฐ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•  ๋•Œ ๋ถ€๋ชจ ๋ฉ”์†Œ๋“œ์˜ ๋ฐ˜ํ™˜ํƒ€์ž…์„ ์ž์‹ ํด๋ž˜์Šค์˜ ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋‹ค.
    public Point clone()  { // ๋ฐ˜ํ™˜ํƒ€์ž…์„ Object์—์„œ Point๋กœ ๋ณ€๊ฒฝ
        Object obj = null;
        try {
        obj = super.clone();
        } catch(CloneNotSupportedException e) {}
        return (Point)obj; //Point ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜
  • ๊ณต๋ณ€ ๋ฐ˜ํ™˜ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์กฐ์ƒ์˜ ํƒ€์ž…์ด ์•„๋‹Œ, ์‹ค์ œ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ์ž์† ๊ฐ์ฒด์˜ ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด ๋ฒˆ๊ฑฐ๋กœ์šด ํ˜•๋ณ€ํ™˜์ด ์ค„์—ˆ๋‹ค.
    • Point copy = (Point)original.clone(); -> Point copy = original.clone();

8. ๋ฐฐ์—ด ๋ณต์‚ฌ

  • ๋ฐฐ์—ด๋„ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— Object ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉฐ, ๋™์‹œ์— Cloneable ์ธํ„ฐํŽ˜์ด์Šค์™€ Serializable ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•  ๋•Œ๋Š” ๊ฐ™์€ ๊ธธ์ด์˜ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ System.arraycopy()๋ฅผ ์ด์šฉํ•ด์„œ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•˜์ง€๋งŒ clone()์„ ์ด์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • int[] arr = {1,2,3,4,5};
      int[] arrClone = arr.clone();
    • int[] arr = {1,2,3,4,5};
      int[] arrClone = new int[arr.length];
      System.arraycopy(arr,0,arrClone,0,arr.length);
  • ๋ฐฐ์—ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ java.util ํŒจํ‚ค์ง€์˜

Vector
ArrayList
LinkedList
HashSet
TreeSet
HashMap
TreeMap
Calendar
Date์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋“ค๋„ ๋ณต์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

9. ์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ (shallow copy & deep copy)

  • clone()์€ ๊ฐ์ฒด์— ์ €์žฅ๋œ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋ณต์ œํ•  ๋ฟ, ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๊นŒ์ง€ ๋ณต์ œํ•˜์ง€ ์•Š์Œ
    • ์›๋ณธ๊ณผ ๋ณต์ œ๋ณธ์ด ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ
    • ์ด๊ฒƒ์ด ์–•์€ ๋ณต์‚ฌ(shallow copy)
    • ์–•์€ ๋ณต์‚ฌ์—์„œ๋Š” ์›๋ณธ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ณต์‚ฌ๋ณธ๋„ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.
  • ์›๋ณธ์ด ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๊นŒ์ง€ ๋ณต์ œํ•˜๋Š” ๊ฒƒ์ด ๊นŠ์€ ๋ณต์‚ฌ(deep copy)
    • ์›๋ณธ๊ณผ ๋ณต์‚ฌ๋ณธ์ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›๋ณธ์˜ ๋ณ€๊ฒฝ์ด ๋ณต์‚ฌ๋ณธ์— ์˜ํ–ฅ ์—†์Œ

10. getClass()

  • ์ž์‹ ์ด ์†ํ•œ ํด๋ž˜์Šค์˜ Class ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
  • Class ๊ฐ์ฒด๋Š” ์ด๋ฆ„์ด ‘Class’์ธ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด์ด๋‹ค.
    public final class Class implements ... {
      ...
    }
  • Class ๊ฐ์ฒด๋Š” ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์œผ๋ฉฐ, ํด๋ž˜์Šค ๋‹น 1๊ฐœ๋งŒ ์กด์žฌํ•œ๋‹ค.
  • ํด๋ž˜์Šค ํŒŒ์ผ์ด ‘ClassLoader’์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐˆ ๋•Œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ
    • ํŒŒ์ผ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์ฝ์–ด์„œ Classํด๋ž˜์Šค์— ์ •์˜๋œ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ
    • ์ฆ‰, ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ฝ์–ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•œ ํ˜•ํƒœ๋กœ ์ €์žฅํ•œ ๊ฒƒ์ด ํด๋ž˜์Šค ๊ฐ์ฒด
  • Class ๊ฐ์ฒด ์–ป๋Š” ๋ฐฉ๋ฒ•
    • Class cObj = new Card().getClass(); // ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋กœ ๋ถ€ํ„ฐ ์–ป๊ธฐ
    • Class cObj = Card.class; // ํด๋ž˜์Šค ๋ฆฌํ„ฐ๋Ÿด(*.class)๋กœ ๋ถ€ํ„ฐ ์–ป๊ธฐ
    • Class cObj = Class.forName("Card"); //ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ๋ถ€ํ„ฐ ์–ป๊ธฐ
  • ๊ฐ์ฒด ์ƒ์„ฑ
    • Card c = new Card(); // new์—ฐ์‚ฐ์ž๋กœ ๊ฐ์ฒด ์ƒ์„ฑ
    • Card c = Card.class.newInstance(); // Class๊ฐ์ฒด๋กœ ๊ฐ์ฒด ์ƒ์„ฑ

11. String ํด๋ž˜์Šค

  • String ํด๋ž˜์Šค๋Š” ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์žํ˜• ๋ฐฐ์—ด ๋ณ€์ˆ˜(char[]) value๋ฅผ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋กœ ์ •์˜๋˜์–ด์žˆ๋‹ค.
    public final class String implements java.io.Serializable, Comparable {
        private char[] value;
        ...
    }
  • ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์‹œ ์ƒ์„ฑ์ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ž…๋ ฅ๋ฐ›๋Š” ๋ฌธ์ž์—ด์€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ value์— ๋ฌธ์žํ˜• ๋ฐฐ์—ด char[]๋กœ ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
  • String ํด๋ž˜์Šค๋Š” ์•ž์— final์ด ๋ถ™์–ด ์žˆ์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๋ถ€๋ชจ๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค.
  • ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ(Immutable) ํด๋ž˜์Šค๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด ‘+’ ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด์„œ ๋ฌธ์ž์—ด์„ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒฝ์šฐ, ์ธ์Šคํ„ด์Šค ๋‚ด์˜ ๋ฌธ์ž์—ด์ด ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์ด ๋‹ด๊ธด String ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
    • ์ฆ‰, ๋งค ์—ฐ์‚ฐ ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๊ฐ€์ง„ String ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•œ๋‹ค.

11.1. ๋ฌธ์ž์—ด์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 2๊ฐ€์ง€

  • String str1 = "abc"; // ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด “abc”์˜ ์ฃผ์†Œ๋ฅผ str1์— ์ €์žฅ
  • String str2 = new String("abc"); // ์ƒˆ๋กœ์šด String ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
  • ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ์žฌ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์€ ํด๋ž˜์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋  ๋•Œ ์ž๋™์œผ๋กœ ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋œ๋‹ค.)
  • String str1 = "abc";
    String str2 = "abc";
    str1 == str2 ? true
    str1.equals(str2) ? true
    
    String str3 = new String("abc");
    String str4 = new String("abc");
    str3 == str4 ? false
    str3.equals(str4) ? true

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

  • ํด๋ž˜์Šค ํŒŒ์ผ์—๋Š” ์†Œ์ŠคํŒŒ์ผ์— ํฌํ•จ๋œ ๋ชจ๋“  ๋ฆฌํ„ฐ๋Ÿด์˜ ๋ชฉ๋ก์ด ์žˆ๋‹ค.
  • ํ•ด๋‹น ํด๋ž˜์Šค ํŒŒ์ผ์ด ํด๋ž˜์Šค ๋กœ๋”์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐˆ ๋•Œ, ๋ฆฌํ„ฐ๋Ÿด ๋ชฉ๋ก์— ์žˆ๋Š” ๋ฆฌํ„ฐ๋Ÿด๋“ค์ด JVM๋‚ด์— ์žˆ๋Š” ์ƒ์ˆ˜ ์ €์žฅ์†Œ(constant pool)์— ์ €์žฅ๋œ๋‹ค.

11.3. ๋นˆ ๋ฌธ์ž์—ด

  • ๊ธธ์ด๊ฐ€ 0์ธ ๋ฐฐ์—ด์€ ์กด์žฌํ•œ๋‹ค.(C์–ธ์–ด๋Š” ๋ถˆ๊ฐ€๋Šฅ)
  • charํ˜• ๋ฐฐ์—ด๋„ ๊ธธ์ด๊ฐ€ 0์ธ ๋ฐฐ์—ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ์ด ๋ฐฐ์—ด์„ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ๋นˆ ๋ฌธ์ž์—ด์ด๋‹ค.
  • String s = ""; ์—์„œ ์ฐธ์กฐ๋ณ€์ˆ˜ s๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” String ์ธ์Šคํ„ด์Šค๋Š” ๋‚ด๋ถ€์— new char[0] ๊ฐ™์ด ๊ธธ์ด๊ฐ€ 0์ธ charํ˜• ๋ฐฐ์—ด์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
  • char[] chArr = new char[0];
  • int[] iArr = {};

11.4. join()๊ณผ StringJoiner (jdk1.8๋ถ€ํ„ฐ ์ถ”๊ฐ€)

  • join()์€ ๋ฌธ์ž์—ด ์‚ฌ์ด์— ๊ตฌ๋ถ„์ž๋ฅผ ๋„ฃ์–ด์„œ ๊ฒฐํ•ฉ
    String[] arr = { "dog", "cat", "bear"};
    String str = String.join("-", arr);
  • java.util.StringJoinerํด๋ž˜์Šค ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ
    StringJoiner sj = new StringJoiner("," , "[" , "]");
    String[] strArr = { "aaa", "bbb", "ccc" };
    
    for(String s : strArr)
        sj.add(s.toUpperCase());
    
    System.out.println(sj.toString()); // [AAA,BBB,CCC]

11.5. ๊ธฐ๋ณธํ˜•-String ๋ณ€ํ™˜

  • ์ˆซ์ž์— ๋นˆ๋ฌธ์ž์—ด(“”) ๋”ํ•˜๊ธฐ
  • valueOf() ์‚ฌ์šฉ
  • String str1 = 100 + ""; // 100 > "100"
    String str2 = String.valueOf(100); // 100 > "100"
    int i = Integer.parseInt("100") // "100" > 100
    int i2 = Integer.valueOf("100") // "100" > 100
  • valueOf()์˜ ๋ฐ˜ํ™˜ํƒ€์ž…์€ int๊ฐ€ ์•„๋‹ˆ๋ผ Integer์ง€๋งŒ ์˜คํ† ๋ฐ•์‹ฑ์— ์˜ํ•ด ์ž๋™๋ณ€ํ™˜
  • valueOf(String s) ๋Š” ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์— parseInt(String s)๋ฅผ ํ˜ธ์ถœํ•  ๋ฟ์ด๋ฏ€๋กœ, ๋‘ ๋ฉ”์†Œ๋“œ๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…๋งŒ ๋‹ค๋ฅด๊ณ  ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋‹ค.

12. StringBuffer & StringBuilder ํด๋ž˜์Šค

public final class StringBuffer implements java.io.Serializable {
    private char[] value;
    ...
}
  • Stringํด๋ž˜์Šค๋Š” Immutable์ด๋ฏ€๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ง€์ •๋œ ๋ฌธ์ž์—ด์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์ง€๋งŒ, StringBufferํด๋ž˜์Šค๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฌธ์ž์—ด ํŽธ์ง‘์„ ์œ„ํ•œ buffer๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, StringBuffer ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ทธ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • buffer์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด 16๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ์˜ ๋ฒ„ํผ ์ƒ์„ฑ

12.1 append()

  • append()๋Š” ๋ฐ˜ํ™˜ํƒ€์ž…์ด StringBuffer์ด๋ฉฐ ์ž์‹ ์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      StringBuffer sb = new StringBuffer("abc");
      sb.append("123").append("ZZ");
      
  • ์œ„์˜ ์ฝ”๋“œ์—์„œ sb.append("123")์ด sb๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์—ฐ์†์ ์œผ๋กœ append()๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
  • StringBuffer ํด๋ž˜์Šค๋Š” equals() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์ง€ ์•Š์•„์„œ ==๋กœ ๋น„๊ตํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค.
  • StringBuffer ์ธ์Šคํ„ด์Šค์— ๋‹ด๊ธด ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ์Šคํ„ด์Šค์— toString()์„ ํ˜ธ์ถœํ•ด์„œ String์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์€ ํ›„์— equals()์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

12.2. StringBuilder ํด๋ž˜์Šค

  • StringBuffer๋Š” ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ์— ์•ˆ์ „(thread safe)ํ•˜๋„๋ก ๋™๊ธฐํ™” ๋˜์–ด์žˆ๋‹ค.
  • ๋™๊ธฐํ™”๊ฐ€ StringBuffer์˜ ์„ฑ๋Šฅ์„ ๋–จ์–ดํŠธ๋ฆฌ๋ฏ€๋กœ, StringBuffer์—์„œ ์“ฐ๋ ˆ๋“œ์˜ ๋™๊ธฐํ™”๋งŒ ๋บ€ ๊ฒƒ์ด StringBuilder.

13. java.util.Random ํด๋ž˜์Šค

  • Math.random()์€ ๋‚ด๋ถ€์ ์œผ๋กœ Randomํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
  • Math.random()๊ณผ Random์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” ์ข…์ž๊ฐ’(seed)์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ข…์ž๊ฐ’์ด ๊ฐ™์€ Random์ธ์Šคํ„ด์Šค๋“ค์€ ํ•ญ์ƒ ๊ฐ™์€ ๋‚œ์ˆ˜๋ฅผ ๊ฐ™์€ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜
  • ์ƒ์„ฑ์ž Random()์€ ์ข…์ž๊ฐ’์„ System.currentTimeMillis()๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์–ป๋Š” ๋‚œ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

14. java.util.StringTokenizer ํด๋ž˜์Šค

  • StringTokenizer๋Š” ๊ธด ๋ฌธ์ž์—ด์„ ์ง€์ •๋œ ๊ตฌ๋ถ„์ž(delimeter)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ† ํฐ(token)์ด๋ผ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌธ์ž์—ด๋กœ ์ž˜๋ผ๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ
  • StringTokenizer๋Š” ๊ตฌ๋ถ„์ž๋กœ ๋‹จ ํ•˜๋‚˜์˜ ๋ฌธ์ž๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•œ ํ˜•ํƒœ์˜ ๊ตฌ๋ถ„์ž๋Š” ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • StringTokenizer (String str, String delim, boolean returnDelims) - returnDelims ๊ฐ’์„ true๋กœ ํ•˜๋ฉด ๊ตฌ๋ถ„์ž๋„ ํ† ํฐ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
  • split()์€ ๋นˆ ๋ฌธ์ž์—ด๋„ ํ† ํฐ์œผ๋กœ ์ธ์‹, StringTokenizer๋Š” ๋นˆ ๋ฌธ์ž์—ด์„ ํ† ํฐ์œผ๋กœ ์ธ์‹ ์•ˆํ•จ
  • split()์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ† ํฐ์œผ๋กœ ์ž˜๋ผ๋‚ธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์—ด์— ๋‹ด์•„์„œ ๋ฐ˜ํ™˜
  • StringTokenizer๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ† ํฐ์œผ๋กœ ๋ฐ”๋กœ๋ฐ”๋กœ ์ž˜๋ผ์„œ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ split()๋ณด๋‹ค ์„ฑ๋Šฅ ์ข‹์Œ

14.1. ํ•œ๊ธ€๋กœ ๋œ ์ˆซ์ž๋ฅผ ์•„๋ผ๋น„์•„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜

import java.util.*;

class StringTokenizer {
  public static void main(String args[])  {
    String input = "์‚ผ์‹ญ๋งŒ์‚ผ์ฒœ๋ฐฑ์‹ญ์˜ค";
    System.out.println(input); // ์‚ผ์‹ญ๋งŒ์‚ผ์ฒœ๋ฐฑ์‹ญ์˜ค
    System.out.println(hangulToNum(input)); // 303115
  }
  
  public static long hangulToNum(String input)  {
    long result = 0;  // ์ตœ์ข… ๋ณ€ํ™˜๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜
    long tmpResult = 0; // ์‹ญ๋ฐฑ์ฒœ ๋‹จ์œ„์˜ ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ž„์‹œ๋ณ€์ˆ˜
    long num = 0;
    
    final String NUMBER = "์˜์ผ๋ฆฌ์‚ผ์‚ฌ์˜ค์œก์น ํŒ”๊ตฌ";
    final String UNIT = "์‹ญ๋ฐฑ์ฒœ๋งŒ์–ต์กฐ";
    final long[] UNIT_NUM = {10,100,1000,10000,(long)1e8,(long)1e12};
    
    StringTokenizer st = new StringTokenizer(input, UNIT, true);
    
    while(st.hasMoreTokens()) {
      String token = st.nextToken();
      int check = NUMBER.indexOf(token);  // ์ˆซ์ž์ธ์ง€, ๋‹จ์œ„(UNIT)์ธ์ง€ ํ™•์ธ
      
      if(check == -1) {
        if("๋งŒ์–ต์กฐ".indexOf(token) == -1) {
          tmpResult += ( num!=0 ? num : 1) * UNIT_NUM[UNIT.indexOf(token)];
        }else {
          tmpResult += num;
          result += (tmpResult!=0 ? tmpResult : 1)
           * UNIT_NUM[UNIT.indexOf(token)];
          tmpResult = 0;
        }
        num = 0;
      }else {
        num = check;
      }
    }
    return result + tmpResult + num;
  }
}