Java - YunByungKwan/Fundamental GitHub Wiki

Java ์ปดํŒŒ์ผ ๊ณผ์ •์— ๋Œ€ํ•ด ์„ค๋ช…

์ปดํŒŒ์ผ ๊ณผ์ •
๋จผ์ € ์ž๋ฐ” ์ฝ”๋“œ(.java)๋ฅผ ๋นŒ๋“œํ•˜๊ฒŒ ๋˜๋ฉด ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด์„œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ(.class)๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„ ๊ณผ์ •
์ดํ›„ JVM์˜ ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ๋ณ€ํ™˜๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์˜ฌ๋ ค๋†“์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ํด๋ž˜์Šค ๋กœ๋”๋Š” ํ•„์š”ํ•œ ๋‹ค๋ฅธ ํด๋ž˜์Šค ํŒŒ์ผ๋“ค๋„ ํ•จ๊ป˜ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
์ดํ›„ Byte Code Verifier๊ฐ€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.
์ดํ›„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ํ•œ์ค„ ํ•œ์ค„ ์ฝ์–ด์„œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
image

GC(Garbage Collection)์— ๋Œ€ํ•ด ์„ค๋ช…

GC๋Š” JVM์˜ Heap ์˜์—ญ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
GC๋Š” Mark and Sweep ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • Mark๋Š” GC Root๋กœ๋ถ€ํ„ฐ ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ์Šค์บ”ํ•˜๋ฉด์„œ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋งˆํ‚นํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
    ์ด๋•Œ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” reachableํ•œ ๊ฐ์ฒด์™€ ์ฐธ์กฐ๋˜๊ณ  ์žˆ์ง€ ์•Š์€ unreachableํ•œ ๊ฐ์ฒด๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.
  • Sweep์€ ์ด Unreachableํ•œ ๊ฐ์ฒด๋“ค์„ Heap์—์„œ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์ ์œผ๋กœ Compact ๊ณผ์ •์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. Compact๋Š” Sweep ์ดํ›„ ๋ถ„์‚ฐ๋œ ๊ฐ์ฒด๋“ค์„ Heap์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋กœ ๋ชจ์•„์„œ ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”๋ฅผ ๋ง‰์•„์ค๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  GC๋Š” minor GC์™€ major GC๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • minor GC๋Š” Eden์˜์—ญ์ด ๊ฝ‰ ์ฐผ์„๋•Œ ๋ฐœ์ƒํ•˜๋Š” GC๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. Minor GC ํ›„ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์€ Eden์—์„œ Survivor์˜์—ญ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    survivor1๊ณผ 2๋Š” ๋‘˜ ์ค‘์— ํ•˜๋‚˜๋งŒ ์จ์•ผ ํ•˜๊ณ , survivor1์— ์žˆ๋˜ ๊ฐ์ฒด๋“ค์€ ๋‹ค์Œ GC๋•Œ survivor2๋กœ ์ด๋™ํ•˜๊ณ  age๊ฐ€ ํ•˜๋‚˜ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • major GC๋Š” Old generation์˜์—ญ์ด ๊ฝ‰ ์ฐผ์„๋•Œ ๋ฐœ์ƒํ•˜๋Š” GC๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. Survivor์˜์—ญ์—์„œ age๊ฐ€ ์ž„๊ณ„์น˜์— ๋„๋‹ฌํ•œ ๊ฐ์ฒด๋“ค์ด Old generation์˜์—ญ์œผ๋กœ ๋„˜์–ด์˜ค๊ณ , ์ด ๊ฐ์ฒด๋“ค์ด ์ œ๊ฑฐ๋˜๋Š” ๊ณผ์ •์„ major GC๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

GC์˜ ์ข…๋ฅ˜๋กœ๋Š” 5๊ฐ€์ง€ ์ •๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Serial GC: ์‹ฑ๊ธ€์“ฐ๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” GC์ด๊ณ  ๋‹ค๋ฅธ GC์— ๋น„ํ•ด stop-the-world ์‹œ๊ฐ„์ด ๊น๋‹ˆ๋‹ค.(Mark Sweep, Compact์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ)
  • Parallel GC: Java 8์˜ ๊ธฐ๋ณธ GC. Young์˜์—ญ์˜ GC๋ฅผ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ๋กœ ์ˆ˜ํ–‰.
  • Parallel Old GC: Old์˜์—ญ์—์„œ๋„ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ๋กœ GC ์ˆ˜ํ–‰. Mark-Summary-Compact ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ.
    • sweep: ๋‹จ์ผ์“ฐ๋ ˆ๋“œ๊ฐ€ old์˜์—ญ ์ „์ฒด๋ฅผ ํ›‘๋Š”๋‹ค.
    • summary: ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ๊ฐ€ old์˜์—ญ์„ ๋ถ„๋ฆฌํ•ด์„œ ํ›‘๋Š”๋‹ค.
  • CMS GC(Concurrent Mark Sweep): stop-the-world์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • G1 GC(Garbage First): Java 9์ด์ƒ์˜ ๊ธฐ๋ณธ GC. Heap์„ ์ผ์ •ํ•œ ํฌ๊ธฐ์˜ Region์œผ๋กœ ๋‚˜๋ˆ”. Region๋‹จ์œ„๋กœ ํƒ์ƒ‰. Compact ์ง„ํ–‰

Reference>


JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์„ค๋ช…

image

JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ Method Area, Heap Area, Stack Area, PC Register, Native method stack ์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.(๋ฉ”ํž™์Šคํ”ผ๋„ค)
์ด๋“ค ์ค‘์—์„œ Heap Area๋Š” ๋‹ค์‹œ young generation๊ณผ old generation์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.
young generation์—๋Š” Eden, survivor1, survivor2 ์˜์—ญ์ด ์žˆ๊ณ , old generation์—๋Š” old, permanent ์˜์—ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
Young Generation์€ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋“ค์ด ํ• ๋‹น๋˜๋Š” ์˜์—ญ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Eden๊ณผ Survivor0, Survivor1 ์˜์—ญ์œผ๋กœ ๋‹ค์‹œ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

  • Eden: ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋˜๋Š” ์˜์—ญ. Eden์ด ๊ฝ‰์ฐจ๋ฉด Minor GC ๋ฐœ์ƒ
  • Survivor0/1: Eden์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์ด ์—ฌ๊ธฐ๋กœ ์ด๋™ํ•จ. Survivor0๊ณผ 1์„ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉด์„œ ์ด๋™ํ•œ๋‹ค.

Old Generation์€ young generation์—์„œ ์˜ค๋žซ๋™์•ˆ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์ด ์กด์žฌํ•˜๋Š” ์˜์—ญ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

๋™์ผ์„ฑ(identity)๊ณผ ๋™๋“ฑ์„ฑ(equality)

  • ๋™์ผ์„ฑ(identity)์€ ๋‘ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์ด ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ๋™๋“ฑ์„ฑ(equality)์€ ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ’์ด ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

equals()์™€ hashCode() ํ•จ์ˆ˜

public class Object {
    // equals ํ•จ์ˆ˜
    public boolean equals(Object obj) {
        return (this == obj);
    }

    // hashCode ํ•จ์ˆ˜
    public native int hashCode();
}

cf ) ์ž๋ฐ”์˜ ํ•ญ๋“ฑ ์—ฐ์‚ฐ์ž(โ€œ==โ€)๋Š” ์›์‹œ ํƒ€์ž…(Primitive Type)์˜ ๊ฒฝ์šฐ ๊ฐ’์„ ๋น„๊ตํ•˜๊ณ , ์ฐธ์กฐ ํƒ€์ž…(Reference Type)์˜ ๊ฒฝ์šฐ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.

equals() ํ•จ์ˆ˜

equals() ํ•จ์ˆ˜๋Š” Object ํด๋ž˜์Šค์— ์žˆ๋Š” ํ•จ์ˆ˜์ด๊ณ  ๋‘ ๊ฐ์ฒด์˜ ๋‚ด์šฉ์ด ๊ฐ™์€์ง€ ๋™๋“ฑ์„ฑ(equality)์„ ๋น„๊ตํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Object์˜ equals() ํ•จ์ˆ˜๋Š” ==์—ฐ์‚ฐ์ž๋กœ ๋‘ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋‘ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์ด ์•„๋‹Œ ๋‚ด์šฉ์„ ๋น„๊ตํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ์žฌ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ด๋•Œ equals()ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ–ˆ๋‹ค๋ฉด hashCode()ํ•จ์ˆ˜๋„ ์žฌ์ •์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

hashCode() ํ•จ์ˆ˜

hashCode()ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ณ€ํ™˜ํ•˜์—ฌ ์ƒ์„ฑํ•œ ์ •์ˆ˜๊ฐ’์ž…๋‹ˆ๋‹ค.
hashCode()ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด์ธ์ง€, ๋™์ผ์„ฑ(identity)์„ ๋น„๊ตํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
Hash์™€ ๊ด€๋ จ๋œ Collection์˜ ๊ฒฝ์šฐ, ๊ฐ์ฒด์˜ ์˜๋ฏธ์ƒ์˜ ๋™๋“ฑ์„ฑ ๋น„๊ต๋ฅผ ์œ„ํ•ด์„œ hashCode()๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

hashCode() ๊ด€๋ จ ๊ทœ์•ฝ

  1. equals()๊ฐ€ true์ผ ๊ฒฝ์šฐ, hashCode() ๊ฐ’๋„ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
  2. equals()๊ฐ€ false์ผ ๊ฒฝ์šฐ, hashCode() ๊ฐ’์€ ๋‹ค๋ฅผ์ˆ˜๋„, ๊ฐ™์„์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„ฑ๋Šฅ์„ ์œ„ํ•ด์„œ๋Š” hashCode() ๊ฐ’์ด ๋‹ค๋ฅธ๊ฒƒ์ด ๋‚ซ๋‹ค. ๊ทธ๋ž˜์•ผ ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ Set ์— ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์•„๋‹Œ์ง€ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. hashCode()๊ฐ’์ด ๊ฐ™๋‹ค๊ณ  ํ•ด์„œ eqauls()๊ฐ€ true๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด์˜ ๋ฌธ์ œ๋กœ, ๊ฐ™์€ ํ•ด์‹œ๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

String, StringBuilder, StringBuffer์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…

String vs StringBuilder/StringBuffer์˜ ์ฐจ์ด์ ์€ String์€ ๋ถˆ๋ณ€(immutable)์ด๊ณ , StringBuilder/StringBuffer๋Š” ๊ฐ€๋ณ€(mutable)์ด๋ผ๋Š” ์ ์ด๋‹ค.
String์€ ๋ถˆ๋ณ€์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๋‹ค.(Thread-safe)
StringBuilder vs StringBuffer์˜ ์ฐจ์ด์ ์€ synchronizeed ํ‚ค์›Œ๋“œ์˜ ์œ ๋ฌด์ด๋‹ค.
StringBuffer ํด๋ž˜์Šค์˜ ๊ฑฐ์˜ ๋ชจ๋“  ํ•จ์ˆ˜์—๋Š” synchronized ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์–ด ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ StringBuffer๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜์ง€๋งŒ(Thread-safe), StringBuilder๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.
๊ทธ ๋Œ€์‹ , ์„ฑ๋Šฅ์€ StringBuilder๊ฐ€ StringBuffer๋ณด๋‹ค ๋” ์ข‹๋‹ค.

์ž๋ฐ”์˜ synchronized ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ ์„ค๋ช…

์ž๋ฐ”์˜ synchronized ํ‚ค์›Œ๋“œ๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ
์Šค๋ ˆ๋“œ ๋™๊ธฐํ™” ์‹œ์ผœ์„œ ๊ณต์œ ๋˜๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด Thread-safeํ•˜๋„๋ก ๋ณด์žฅํ•ด์ค๋‹ˆ๋‹ค.

์ž๋ฐ”์˜ final ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ ์„ค๋ช…

์ž๋ฐ”์˜ final ํ‚ค์›Œ๋“œ๋Š” ๋ถˆ๋ณ€ ์ƒํƒœ์ž„์„ ๋ณด์žฅํ•˜๋Š” ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.

  1. final ํ‚ค์›Œ๋“œ๋ฅผ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  2. final ํ‚ค์›Œ๋“œ๋ฅผ ๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” override๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  3. final ํ‚ค์›Œ๋“œ๋ฅผ ํด๋ž˜์Šค์— ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ์ƒ์†ํ•  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์˜ volatile[๋ฐœ-๋ฆฌ๋ฅผ] ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ ์„ค๋ช…

volatile ํ‚ค์›Œ๋“œ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
์š”์ฆ˜์˜ ํ”„๋กœ์„ธ์„œ๋“ค์€ ์ž๋™์ ์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š”๋ฐ
๊ทธ ์ค‘์— ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‹œ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ๋ณ€๊ฒฝํ•˜๊ณ  ์ด๊ฑธ ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ค์‹œ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
CPU์˜ ๋ ˆ์ง€์Šคํ„ฐ๋‚˜ ์บ์‹œ์— ์ €์žฅ์„ ํ•œ ๋’ค์— ๋ฉ”๋ชจ๋ฆฌ์— ์”๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” CPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ RAM๋ณด๋‹ค ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ณต์œ  ๋ณ€์ˆ˜์— ๋Œ€ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๊ณต์œ  ๋ณ€์ˆ˜๋ฅผ volatile๋กœ ์„ ์–ธํ•˜๋ฉด ๋ถˆ์ผ์น˜๋ฅผ ์–ด๋А ์ •๋„ ๋ง‰์„ ์ˆ˜ ์žˆ๊ณ ์š”.
ํ•œ๊ณ„์ ์€ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๋ณ€๊ฒฝ์„ ์‹œ๋„ํ•  ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ๋ฐ์ดํ„ฐ ์ผ์น˜๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์“ฐ๋ ˆ๋“œํ’€(Thread Pool)์— ๋Œ€ํ•ด ์„ค๋ช…

์“ฐ๋ ˆ๋“œํ’€์€ ์“ฐ๋ ˆ๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด ๋†“์€ ์“ฐ๋ ˆ๋“œ ์ง‘ํ•ฉ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
์“ฐ๋ ˆ๋“œํ’€์˜ ๋™์ž‘ ์›๋ฆฌ๋Š” ์‚ฌ์šฉ์ž์˜ ์ž‘์—… ์š”์ฒญ(Runnable ๋˜๋Š” Callable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด)์„
์ž‘์—… ํ(BlockingQueue)์— ๋„ฃ๊ณ  ํ์—์„œ ์ž‘์—…์„ ๊บผ๋‚ด์„œ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด ๋†“์€ ์“ฐ๋ ˆ๋“œ๋“ค์—๊ฒŒ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
(ExecutorService ์‚ฌ์šฉ์‹œ ํ•ด์ œ๋„ ํ•ด์•ผ ํ•จ-> ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ)
์“ฐ๋ ˆ๋“œํ’€์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฐ˜๋ณต์ ์œผ๋กœ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑ/์ˆ˜๊ฑฐํ•˜๋Š” ๋ฐ ๋“œ๋Š” ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
(์ƒ์„ฑ ์‹œ ์Šคํƒ ์˜์—ญ์— ํ• ๋‹นํ•ด์•ผ ํ•˜๋Š” ๋น„์šฉ)
๊ทธ๋ฆฌ๊ณ  ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ฏธ๋ฆฌ ์ค€๋น„๋˜์–ด ์žˆ์–ด์„œ ๋”œ๋ ˆ์ด ๋ฐœ์ƒ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ ์œผ๋กœ๋Š” ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ ์ค‘์— ์งง์€ ํƒœ์Šคํฌ๋ฅผ ํ• ๋‹น๋ฐ›์€ ์“ฐ๋ ˆ๋“œ๋Š” ์ž‘์—…์„ ๋งˆ์น˜๊ณ  ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ผํ•˜๋Š” ๋™์•ˆ ๋†€๊ฒŒ ๋˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ForkJoinPool์— ๋Œ€ํ•ด ์„ค๋ช…

๊ธฐ์กด ์“ฐ๋ ˆ๋“œํ’€์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์“ฐ๋ ˆ๋“œํ’€์ž…๋‹ˆ๋‹ค.
๊ธฐ์กด ์“ฐ๋ ˆ๋“œํ’€์˜ ๋ฌธ์ œ์ ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ์“ฐ๋ ˆ๋“œํ’€์— 3๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์žˆ๊ณ  ๊ฐ๊ฐ ์ž‘์—…์„ ํ• ๋‹น ๋ฐ›์•˜์„ ๋•Œ
1๋ฒˆ ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ• ๋‹น ๋ฐ›์€ ์ž‘์—…์ด ๋นจ๋ฆฌ ๋๋‚ฌ๊ณ  ์ดํ›„ ์ž‘์—…์ด ์—†๋‹ค๋ฉด 1๋ฒˆ ์“ฐ๋ ˆ๋“œ๋Š” ๋†€๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ForkJoinPool์€ ์•ž์„  ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์“ฐ๋ ˆ๋“œํ’€์— 3๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ ๋จผ์ € 1๋ฒˆ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ๊ฐ€์ ธ๊ฐ€์„œ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ๋†€๊ณ  ์žˆ๋˜ 2๋ฒˆ ์“ฐ๋ ˆ๋“œ๊ฐ€ 1๋ฒˆ ์“ฐ๋ ˆ๋“œ์˜ ๋ถ„ํ• ๋œ ์ž‘์—…์„ ๊ฐ€์ ธ๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๊ธฐ์กด ์“ฐ๋ ˆ๋“œํ’€๋ณด๋‹ค ๋‚ญ๋น„๋˜๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๋ฐ” ์Šค๋ ˆ๋“œ ๊ด€๋ จ

  • ExecutorService๋Š” ํƒœ์Šคํฌ๋ฅผ ์Šค์ผ€์ค„๋งํ•˜๊ณ  ํ•ด๋‹น ํ…Œ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์Šค๋ ˆ๋“œ๋ฅผ ์„ ํƒํ•ด ์‹คํ–‰ํ•œ๋‹ค. (ํƒœ์Šคํฌ๋ฅผ ์Šค๋ ˆ๋“œ์— ๋งคํ•‘ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํƒœ์Šคํฌ์˜ ๊ฒฐ๊ณผ, ์˜ˆ์™ธ, ์ทจ์†Œ๊นŒ์ง€ ์ฒ˜๋ฆฌํ•จ)
  • Executorsํด๋ž˜์Šค์—๋Š” ์Šค์ผ€์ค„๋ง ์ •์ฑ…์ด ์„œ๋กœ ๋‹ค๋ฅธ executorService๋ฅผ ๋งŒ๋“œ๋Š” ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด executor = Executors.newCachedThreadPool();
  • Runnable์€ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ฆฌํ„ด๊ฐ’์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ Callable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • Callableํƒœ์Šคํฌ๋ฅผ ์ œ์ถœํ•˜๋ฉด ํ“จ์ฒ˜(future)๋ฅผ ์–ป๋Š”๋‹ค.
    ExecutorService executor = Executors.newFixedThreadPool();
    Callable<V> task = ...;
    Future<V> result = executor.submit(task);
  • Future์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ CompletableFuture ํด๋ž˜์Šค๋Š” ๋ธ”๋กœํ‚น ์—†์ด ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ์ฆ‰์‹œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

staticํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…

staticํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋Š” ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•ด์„œ ๋ฉ”์†Œ๋“œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ ์žฌํ• ๋•Œ ํ•จ๊ป˜ ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํด๋ž˜์Šค ๋กœ๋”ฉ์ด ๋๋‚˜๋Š” ์ฆ‰์‹œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

static ๋ณ€์ˆ˜์™€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋Š” ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€

static ๋ณ€์ˆ˜๋Š” static์˜์—ญ์— ์ €์žฅ๋˜๋ฉฐ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๊ณ , GC๊ฐ€ ๊ด€์—ฌ๋ฅผ ์•ˆํ•ฉ๋‹ˆ๋‹ค.
์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋Š” heap์˜์—ญ์— ํ• ๋‹น๋˜๋ฉฐ GC๊ฐ€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์–ธ์ œ staticํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ๋˜๋‚˜์š”

ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ค‘ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด static ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ, ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด static์„ ๋ถ™์ด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

staticํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ์˜ ์–ด๋””์— ์œ„์น˜ํ•˜๊ฒŒ ๋˜๋‚˜์š”

Method Area์— ์œ„์น˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Error์™€ Exception์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…

Error๋Š” ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์ด๋‚˜ ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ์™€ ๊ฐ™์ด ๋ฐœ์ƒํ•˜๋ฉด ๋ณต๊ตฌํ•  ์ˆ˜ ์—†๋Š” ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜๋ฅผ ๋งํ•˜๊ณ , Exception์€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์ˆ˜์Šตํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๊ต์  ๋œ ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.
Error์˜ ์ƒํ™ฉ์„ ๋ฏธ๋ฆฌ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ Exception ์ƒํ™ฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž๋ฐ”์—์„œ๋Š” try-catch๋ฌธ์œผ๋กœ Exception handling์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Unchecked Exception, Checked Exception ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…

Checked Exception์€ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์ˆ˜์ด๋ฉฐ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์˜ˆ์‹œ๋กœ๋Š” IOException, SQLException ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
Unchecked Exception์€ ์ปดํŒŒ์ผ ๋•Œ ์ฒดํฌ๋˜์ง€ ์•Š๊ณ , ๋Ÿฐํƒ€์ž„์— ๋ฐœ์ƒํ•˜๋Š” Exception์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ์‹œ๋กœ๋Š” NullPointerException ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Exception handling์˜ ๋ฐฉ๋ฒ•์€ ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ๋‚˜์š”

Try-catch๋ฌธ์„ ํ†ตํ•ด์„œ ์ง์ ‘ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ฐฉ์‹๊ณผ
throws exception์„ ์ด์šฉํ•ด์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ์˜ ์ฑ…์ž„์„ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์œผ๋กœ ๋„˜๊ธฐ๋Š” ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.


์•”๊ธฐํ•  ์šฉ์–ด

  • stop-the-world: GC๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์“ฐ๋ ˆ๋“œ ์™ธ์˜ ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ์ค‘๋‹จํ•˜๋Š” ํ˜„์ƒ

Kotlin์˜ sort()ํ•จ์ˆ˜

  • java์˜ sort()ํ•จ์ˆ˜์ด๊ณ , mergesort๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(NlogN)์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ input ์›์†Œ๋“ค์ด ๋Œ€๋žต์ ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ์—๋Š” O(N)์ž…๋‹ˆ๋‹ค.

HashSet

  • HashSet์€ ๋‚ด๋ถ€์ ์œผ๋กœ HashMap์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • HashSet์˜ contains()ํ•จ์ˆ˜๋„ HashMap์˜ containsKey()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

HashMap

  • Java์˜ HashMap์€ key, value๊ฐ’์— null๊ฐ’์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

    HashMap<String, String> map = new HashMap<>();
    map.put(null, null); // ๊ฐ€๋Šฅํ•จ

    ์ฝ”ํ‹€๋ฆฐ์€ ์•ˆ๋˜๊ณ  ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด HashMap์˜ ๋ฐ์ดํ„ฐํƒ€์ž…์ด nullableํƒ€์ž…์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    val map1 = HashMap<String, String>() // ์—ฌ๊ธฐ๋Š” ๋ถˆ๊ฐ€๋Šฅ
    val map2 = HashMap<String?, String?>() // ์—ฌ๊ธฐ๋Š” ๊ฐ€๋Šฅ
  • ๋™๊ธฐํ™” ์ง€์›์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์›์†Œ๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•ด์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์›์†Œ๊ฐ€ ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅํ•˜์ง€ ์•Š์Œ)

  • get() ํ•จ์ˆ˜: O(1), put() ํ•จ์ˆ˜: O(1), containsKey() ํ•จ์ˆ˜: O(1)

  • ์ฐธ๊ณ : https://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html

TreeMap

  • Red-Black Tree๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๋ฐ”์˜ == ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด์„œ ์„ค๋ช…

์ž๋ฐ”์˜ == ์—ฐ์‚ฐ์ž๋Š” ์›์‹œ ํƒ€์ž…์˜ ๊ฒฝ์šฐ ๊ฐ’์„ ๋น„๊ตํ•˜๊ณ , ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฒฝ์šฐ์—๋Š” ๋‘ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.

์ž๋ฐ”์—์„œ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…

2๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ๋Š” Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ณ  ๋‘๋ฒˆ์งธ๋Š” Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
// ๋ฐ‘์—๋Š” ์ฐธ๊ณ 
Runnable ์ธํ„ฐํŽ˜์ด์Šค๋Š” run() ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋งŒ ๊ฐ–๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

  1. Thread ํด๋ž˜์Šค ์ƒ์†
public class MyThread extends Thread {
    @Override
    public void run() {
        // ...
    }
}

// ๋ฉ”์ธ
MyThread thread1 = new MyThread();
thread1.start();
  1. Runnable ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // ...
    }
}
// ๋ฉ”์ธ
MyRunnable runnable = new MyRunnable();
Thread thread= new Thread(runnable);
thread.start();

๋ฆฌํ”Œ๋ ‰์…˜(Reflection)์— ๋Œ€ํ•ด ์„ค๋ช…

๋ฆฌํ”Œ๋ ‰์…˜์€ ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค ํƒ€์ž…์„ ์•Œ์ง€ ๋ชปํ•ด๋„ ๊ทธ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ, ํƒ€์ž…, ๋ณ€์ˆ˜ ๋“ฑ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” API๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

new String()๊ณผ โ€œโ€์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…

new String()์œผ๋กœ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ ๋ฌธ์ž์—ด์€ heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด์— ""(String literal)์˜ ๊ฒฝ์šฐ Heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ์ค‘ String Constant Pool์— ์ƒ์„ฑ๋˜๋ฉฐ,
๊ฐ™์€ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ ๊ฐ™์€ ๊ณณ์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ž๋ฐ” ์›์‹œํƒ€์ž…๊ณผ ๋ž˜ํผํด๋ž˜์Šค์— ๋Œ€ํ•ด ์„ค๋ช…

์ž๋ฐ”์˜ ์›์‹œํƒ€์ž…์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„๋กœ 8๊ฐœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์›์‹œํƒ€์ž…์ด ์•„๋‹Œ ๋ชจ๋“  ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง„ ์ฐธ์กฐ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ž˜ํผํด๋ž˜์Šค๋Š” ์›์‹œํƒ€์ž…์„ ๊ฐ์ฒดํ™”์‹œ์ผœ ์ฃผ๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

๋ฐ•์‹ฑ(Boxing)๊ณผ ์–ธ๋ฐ•์‹ฑ(UnBoxing)์— ๋Œ€ํ•ด ์„ค๋ช…

๋ฐ•์‹ฑ(Boxing)์€ ์›์‹œํƒ€์ž…์˜ ๋ณ€์ˆ˜๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
์–ธ๋ฐ•์‹ฑ(UnBoxing)์€ ๋ž˜ํผ ํด๋ž˜์Šค์— ์žˆ๋Š” ๊ฐ’์„ ๋‹ค์‹œ ์›์‹œํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

Integer num = new Integer(17); // ๋ฐ•์‹ฑ
int n = num.intValue(); // ์–ธ๋ฐ•์‹ฑ

Java์˜ ์ ‘๊ทผ ์ œํ•œ์ž์— ๋Œ€ํ•ด ์„ค๋ช…

์ž๋ฐ”์˜ ์ ‘๊ทผ ์ œํ•œ์ž๋Š” ํฌ๊ฒŒ 4๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  • private: ๋ชจ๋“  ์™ธ๋ถ€ ํด๋ž˜์Šค๋Š” private ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • package-private: ๊ฐ™์€ ํŒจํ‚ค์ง€์— ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.
  • protected: ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ์ ‘๊ทผํ•˜๋ ค๋ฉด ์ƒ์†์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • public: ๋ชจ๋“  ๊ณณ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฒ„๋กœ๋”ฉ(overloading)๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ(overriding)์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…

  • ์˜ค๋ฒ„๋กœ๋”ฉ์€ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด๋‚˜ ๊ฐœ์ˆ˜๋ฅผ ๋‹ฌ๋ฆฌํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์—…์บ์ŠคํŒ…(Upcasting)๊ณผ ๋‹ค์šด์บ์ŠคํŒ…(Downcasting)์— ๋Œ€ํ•ด ์„ค๋ช…

์—…์บ์ŠคํŒ…์€ ์„œ๋ธŒ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ์Šˆํผ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

Ex) Person person = student; // Person์ด ๋ถ€๋ชจ ํด๋ž˜์Šค, Student๊ฐ€ ์ž์‹ ํด๋ž˜์Šค

๋‹ค์šด์บ์ŠคํŒ…์€ ์—…์บ์ŠคํŒ…๋œ ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๋ณต๊ตฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์šด์บ์ŠคํŒ…์€ ๋ช…์‹œ์ ์ธ ํ˜•๋ณ€ํ™˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Ex) Person person = new Student();
Student student = (Student) person;

ํด๋ž˜์Šค ๋ณ€์ˆ˜, ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜, ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ, ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…

  • ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋Š” ํด๋ž˜์Šค ์˜์—ญ์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋กœ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๊ณ ์œ ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•  ๊ฒฝ์šฐ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค ๋ณ€์ˆ˜๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— staticํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณตํ†ต๋œ ๊ฐ’์„ ๊ณต์œ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋ณ€์ˆ˜๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐˆ๋•Œ ๊ฐ™์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. (๋ฉ”๋ชจ๋ฆฌ์— ๋”ฑ ํ•œ๋ฒˆ ์˜ฌ๋ผ๊ฐ)
  • ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›์œผ๋ฉฐ, ๋ฉ”์„œ๋“œ๊ฐ€ ๋๋‚˜๋ฉด ์†Œ๋ฉธ๋ฉ๋‹ˆ๋‹ค.
  • ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑํ•ด์•ผ๋งŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ(static)์€ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์—†์ด ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
public class Test {
    int var1; // ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜
    static int var2; // ํด๋ž˜์Šค ๋ณ€์ˆ˜
    
    public void func1() {
        int var3; // ์ง€์—ญ ๋ณ€์ˆ˜
    }
}

์ธํ„ฐํŽ˜์ด์Šค(interface)์™€ ์ถ”์ƒํด๋ž˜์Šค(abstract class)์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š”์ง€

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธฐ๋ณธ ์„ค๊ณ„๋„๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์ด ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋“ค์„ ์ •์˜ํ•˜๋ฉฐ, ์ž๋ฐ”8๋ถ€ํ„ฐ๋Š” defaultํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์ถ”์ƒํด๋ž˜์Šค๋Š” ๋ฏธ์™„์„ฑ ์„ค๊ณ„๋„๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. abstractํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋“ค์ด ๊ณตํ†ต๋œ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๊ณ  ๊ฐ๊ฐ ํด๋ž˜์Šค์— ๋งž๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ถ”์ƒํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์—ญ์‹œ ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ์„ ๊ฐ–๋Š”๋‹ค๋ฉด ์ถ”์ƒํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋‘๊ฐœ๋ฅผ ๋‚˜๋ˆ  ๋†“์€ ์ด์œ ๋Š” ์ž๋ฐ”๊ฐ€ ๋‹ค์ค‘ ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ƒํด๋ž˜์Šค๋งŒ์œผ๋กœ ๋ฌถ์„ ์ˆ˜ ์—†๋Š” ๋‹ค๋ฅธ ๊ณตํ†ต ๊ธฐ๋Šฅ๋“ค์„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ ๋ฌถ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

synchronized ํ‚ค์›Œ๋“œ

synchronized๋Š” ๋™๊ธฐํ™”ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.
synchronized ๋ธ”๋ก์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ์— ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•˜๋ฉฐ
์ด๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ํ•œ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์žฅํ•ด์ค๋‹ˆ๋‹ค.

synchronized(obj) {
    // ์ž„๊ณ„ ์˜์—ญ
}
// ๋‘˜ ๋‹ค ๊ฐ™์€ ์ฝ”๋“œ
obj.intrinsicLock.lock();
try {
    // ์ž„๊ณ„ ์˜์—ญ
} finally {
    obj.intrinsicLock.unlock();
}
  • ๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค

    public synchronized void method() {
        // ...
    }
    // ๋‘˜ ๋‹ค ๊ฐ™์€ ์ฝ”๋“œ
    public void method() {
        this.intrinsicLock.lock();
        try {
            // ...
        } finally {
            this.intrinsicLock.unlock();
        }
    }
โš ๏ธ **GitHub.com Fallback** โš ๏ธ