JVM์ด๋ž€?

์ž๋ฐ”๋ฅผ ๊ฐ€์ง€๊ณ  ์ฝ”๋”ฉ์„ ํ•˜๋Š” ์‚ฌ๋žŒ์€ ํ•œ๋ฒˆ ์ฏค JVM ์ด๋ž€ ๋‹จ์–ด๋ฅผ ๋“ค์–ด์™”์„ ๊ฒƒ์ด๋‹ค.

์ด JVM์€ ์ปดํ“จํ„ฐ์™€์˜ ์†Œํ†ต์„ ๋„์™€์ฃผ๋Š”๋ฐ, ์–ด๋–ค ์‹์œผ๋กœ ์†Œํ†ต์„ ๋„์™€์ฃผ๋Š” ์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณด์ž

 

๋จผ์ € ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋”ฉ์„ ํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด์„œ ์ปดํŒŒ์ผํ•˜๋ฉด .class ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

 

ํ˜„์žฌ ์ด ํด๋ž˜์Šค ํŒŒ์ผ์€ ๊ธฐ๊ณ„์–ด๊ฐ€ ์•„๋‹Œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋˜์–ด์žˆ๋‹ค.

 

๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ž€ ๋ฌด์—‡์ผ๊นŒ?

JVM์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋กœ ๋ณ€ํ™˜๋œ ์ž๋ฐ” ์†Œ์Šค์ฝ”๋“œ์ด๋‹ค.

 

์–ธ์ œ ์–ด๋””์„œ๋“  ์šด์˜์ฒด์ œ์— ๊ด€๊ณ„์—†์ด JVM ์œ„์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š”

 

System.out.println("Hello World");

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค.

 

// class version 61.0 (61)
// access flags 0x21
public class Main {

  // compiled from: Main.java

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 8 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this LMain; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x9
  public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 10 L0
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    LDC "hello world"
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L1
    LINENUMBER 11 L1
    RETURN
   L2
    LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
    MAXSTACK = 2
    MAXLOCALS = 1
}

 

์ด๋ ‡๊ฒŒ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ ๋œ ํด๋ž˜์Šค ํŒŒ์ผ์„ JVM์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

 

 

JVM์€ ์ด ํ˜•์‹์˜ ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญ์„ ํ•ด์„œ ์ œ๊ณตํ•œ๋‹ค.

์ฆ‰ JVM์€ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์ปดํ“จํ„ฐ ์‚ฌ์ด์— ํ†ต์—ญ๊ฐ€ ๊ฐ™์€ ์—ญํ• ์„ ํ•ด์ค€๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

 

๊ธฐ์กด c,c++ ์ปดํŒŒ์ผ๋Ÿฌ์™€๋Š” ๋ญ๊ฐ€ ๋‹ค๋ฅผ๊นŒ?

๊ทผ๋ฐ ํ•˜๋‚˜ ์˜๋ฌธ์ ์ด ์ƒ๊ฒผ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด๋“ค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฌธ์žฅ์œผ๋กœ ์ฝ”๋”ฉ์„ ํ•˜๋Š”๋ฐ ์™œ ์ž๋ฐ”๋งŒ JVM์ด๋ž€ ๊ฒƒ์„ ์‚ฌ์šฉํ• ๊นŒ?

 

printf("Hello World");

 

๋ถ„๋ช… c์–ธ์–ด๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋”ฉ์„ ํ•˜๋Š”๋ฐ c์–ธ์–ด๋„ JVM ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ• ๊นŒ?

 

๊ฒฐ๋ก ์€ “์•„๋‹ˆ๋‹ค”

์ด๋Š” ์–ธ์–ด๊ฐ€ ์ถ”๊ตฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์ปดํŒŒ์ผ ๋ฐฉ์‹์˜ ์ฐจ์ด ๋•Œ๋ฌธ์ด๋‹ค.

 

 

c๋‚˜ c++ ๊ฐ™์€ ์–ธ์–ด๋“ค์€ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„๊ฐ€ ๋ฐ”๋กœ ์•Œ์•„๋“ค์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ ๋ฒˆ์—ญํ•ด์ค€๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ํ•˜๋‚˜ ์žˆ๋Š”๋ฐ ๋ชจ๋“  ์ปดํ“จํ„ฐ ์šด์˜์ฒด์ œ๋“ค์ด ๊ฐ™์€ ์–ธ์–ด๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ž€ ๊ฑฐ๋‹ค.

์ด๋กœ ์ธํ•ด ๋งฅ์—์„œ ์ปดํŒŒ์ผํ•œ ํŒŒ์ผ์ด ์œˆ๋„์šฐ๋‚˜ ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ์•ˆ ๋Œ์•„๊ฐ€๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

 

์™œ๋ƒํ•˜๋ฉด c๋‚˜ c++์€ ๊ฐ ๋จธ์‹ ์— ๋งž๋Š” ๊ธฐ๊ณ„์–ด๋กœ ๋ฐ”๋กœ ์ปดํŒŒ์ผ์„ ํ•ด์ค€๋‹ค.

์†๋„ ๋ฉด์—์„œ๋Š” ๋น ๋ฅผ ์ง€ ๋ชฐ๋ผ๋„ ๋‹ค๋ฅธ ํ™˜๊ฒฝ๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๋–จ์–ด์ง„๋‹ค.

ํ•˜์ง€๋งŒ JVM์€ WORA ๋ผ๋Š” ์ฒ ํ•™์— ๊ธฐ๋ฐ˜์„ ๋‘๊ณ  ๋งŒ๋“ค์–ด์กŒ๋‹ค.

 

*WORA

Write Once Run Anywhere

ํ•œ๋ฒˆ ์“ฐ๊ณ  ์–ด๋””๋“  ๋Œ์•„๊ฐ„๋‹ค.

์ด๋Ÿฐ ํŠน์ง• ๋•๋ถ„์— ์ž๋ฐ”๋Š” ์šด์˜์ฒด์ œ ๊ด€๊ณ„์—†์ด ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

JRE , JDK ์™€์˜ ๊ด€๊ณ„

JVM๊ณผ ์ด๋ฆ„์ด ๋น„์Šทํ•œ JRE,JDK๋Š” ์–ด๋–ค ๊ด€๊ณ„์ผ๊นŒ?

๊ฒฐ๋ก  ์ ์œผ๋กœ ๋งํ•˜๋ฉด JVM์ด ์ œ์ผ ์ž‘๊ณ  ์„œ๋กœ ํฌํ•จ๋˜๋Š” ๊ด€๊ณ„์ด๋‹ค.

 

์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด์ž

 

 

JVM์€ ์œ„์—์„œ ์„ค๋ช…ํ•œ๋Œ€๋กœ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

JRE๋Š” ๋Ÿฐํƒ€์ž„์— ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ , ํŒŒ์ผ๋“ค์„ ํฌํ•จํ•œ๋‹ค.

JDK๋Š” ๊ทธ ์™ธ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋””๋ฒ„๊น… , ์ปดํŒŒ์ผ ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค.

 

JVM ํŠน์ง• ์ •๋ฆฌ

 

  • ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ๊ฐ€์ƒ ๋จธ์‹ ์ด๋‹ค.
  • ์‹ฌ๋ณผ๋ฆญ ๋ ˆํผ๋Ÿฐ์Šค
    • ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ, ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐํ•œ๋‹ค.

 

  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜
    • ๋” ์ด์ƒ ํ• ๋‹น๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์ค€๋‹ค.

 

  • ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜์—ฌ ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ ๋ณด์žฅ
    • ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜์—ฌ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.

 

  • ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์˜ค๋”
    • ๋น… ์—”๋””์•ˆ ๋ฐ”์ดํŠธ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ†ต์‹ ์„ ํ•œ๋‹ค.

 

๋น… ์—”๋””์•ˆ ํ‘œ๊ธฐ๋ฒ•์ด๋ž€?

0x12 0x34 0x56 0x78 ๊ณผ ๊ฐ™์ด ๋‚ฎ์€ ์ฃผ์†Œ๋ถ€ํ„ฐ ๋†’์€ ์ฃผ์†Œ ์ˆœ์œผ๋กœ ํ‘œ๊ธฐํ•˜๋Š” ๋ฐฉ์‹

 

JVM ๋ช…์„ธ

JVM ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์™€์žˆ๋‹ค.

To implement the Java Virtual Machine correctly, you need only be able to

read the class file format and correctly perform the operations specified therein. Implementation details that are not part of the Java Virtual Machine's specification would unnecessarily constrain the creativity of implementors.

 

 

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

ํ”ํžˆ ํ–‰๋™๋งŒ ์ถ”์ƒํ™” ํ•ด๋‘๊ณ  ๊ตฌํ˜„ ์ฑ…์ž„์€ ๋ฒค๋”์‚ฌ๋“ค์—๊ฒŒ ๋งก๊ธด ๊ฑฐ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ ๊ฒฐ๊ณผ ๋ฌด์ˆ˜ํ•œ JVM ๋ฒค๋”์‚ฌ๋“ค์ด ๊ตฌํ˜„์„ ์‹œ์ž‘ํ•˜์˜€๊ณ  ํ˜„์žฌ๋„ ๋งŽ์€ JVM์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

ex) Oracle ์˜ ํ•ซ์ŠคํŒŸ , IBM์˜ Open J9 ๋“ฑ๋“ฑ ..

 

JVM ๋™์ž‘๊ณผ์ •

์•ž์„œ JVM์ด ๋Œ€๋žต ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด์•˜์œผ๋ฉด ์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” ๊ตฌ์ฒด์ ์ธ ๋™์ž‘๊ณผ์ •์„ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

 

JVM ๊ตฌ์กฐ

 

์ „์ฒด์ ์ธ ๋™์ž‘ ๋ฐฉ์‹

JVM์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ƒ์„ธํ•œ ๋ฐฉ์‹์€ ์‚ด์ง ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ „๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

  1. ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค.
  2. ์ปดํŒŒ์ผ ๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ํด๋ž˜์Šค ๋กœ๋”์— ์ „๋‹ฌํ•œ๋‹ค.
  3. ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•  ๋•Œ ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ „๋‹ฌํ•œ๋‹ค.
  4. ์‹คํ–‰ ์—”์ง„์ด ํ•ด๋‹น ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ ์‹œํ‚จ๋‹ค.

ํด๋ž˜์Šค ๋กœ๋”

ํด๋ž˜์Šค ๋กœ๋”์˜ ๊ตฌ์กฐ

  • ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํด๋ž˜์Šค ๋กœ๋”
    • JVM์„ ๊ตฌ๋™์‹œํ‚ค๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ํƒ‘์žฌํ•˜๊ณ  ์žˆ๋‹ค.
    • ๊ฐ€์žฅ ์ดˆ๊ธฐ์— ์‹คํ–‰๋˜๋ฉฐ , ์šด์˜์ฒด์ œ์— ๋งž๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์“ฐ์—ฌ์žˆ๋‹ค.

 

  • ์ต์Šคํ…์…˜ ํด๋ž˜์Šค ๋กœ๋”
    • ์ž๋ฐ” ํด๋ž˜์Šค์˜ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ํƒ‘์žฌํ•œ๋‹ค.

 

  • ์‹œ์Šคํ…œ ํด๋ž˜์Šค ๋กœ๋”(Application ClassLoader)
    • ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž‘์„ฑํ•œ ํด๋ž˜์Šค ํŒŒ์ผ๋“ค์„ ํƒ‘์žฌํ•œ๋‹ค.
    • ์ด๊ฒƒ์„ ์ƒ์†ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ ๋ชจ๋“  ํด๋ž˜์Šค ๋กœ๋”์— ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์—†์„ ์‹œ ,

ClassNotFoundException ์˜ˆ์™ธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ณผ์ •

 

 

ํด๋ž˜์Šค ์–ด๋–ป๊ฒŒ ์–ด๋–ป๊ฒŒ ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•˜๋Š” ์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž

  • ๋กœ๋“œ
    • ํด๋ž˜์Šค๋ฅผ ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์™€์„œ JVM ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹นํ•œ๋‹ค.

 

  • ๋งํฌ
    • ๊ฒ€์ฆ(Verifying)
      • ํด๋ž˜์Šค ํŒŒ์ผ์ด ์œ ํšจํ•œ์ง€๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค.
      • ์ž๋ฐ” ๋ช…์„ธ , JVM ๋ช…์„ธ๋ฅผ ์ž˜ ์ง€์ผฐ๋Š” ์ง€ ํ™•์ธํ•˜๋ฉฐ ๋งŒ์•ฝ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ ๋ชปํ•˜์˜€์„ ์‹œ์— VerifyError๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
    • ์ค€๋น„(Preparing)
      • ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค์— ํ•„์š”ํ•œ static field์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์ด๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.
    • ๋ถ„์„(Resolving):
      • constant pool ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  **์‹ฌ๋ณผ๋ฆญ ์ฐธ์กฐ ๊ฐ’๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ(๋‹ค์ด๋ ‰ํŠธ)**๋กœ ๋ณ€ํ™˜์‹œํ‚จ๋‹ค.

 

  • ์ดˆ๊ธฐํ™”
    • ์ค€๋น„๊ณผ์ •์—์„œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์คฌ๋˜ static filed๋“ค์„ ์ฝ”๋“œ์— ์ž‘์„ฑํ•ด์คฌ๋˜ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

์ด ๊ณผ์ •๊นŒ์ง€ ๋งˆ์ณค์œผ๋ฉด JVM์—์„œ ํด๋ž˜์Šค ํŒŒ์ผ์„ ๊ตฌ๋™์‹œํ‚ฌ ์ค€๋น„๊ฐ€ ๋๋‚˜๊ฒŒ ๋œ๋‹ค.

 

ํด๋ž˜์Šค ๋กœ๋”์˜ ํŠน์ง•

  • ์œ„์ž„ ๋ชจ๋ธ
    • ํด๋ž˜์Šค ๋กœ๋”๋Š” ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํด๋ž˜์Šค ๋กœ๋”๋ผ๋ฆฌ ๋กœ๋“œ๋ฅผ ์œ„์ž„ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋™์ž‘ํ•œ๋‹ค.
    • ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ƒ์œ„ ํด๋ž˜์Šค๋กœ ์š”์ฒญ์„ ์œ„์ž„ํ•ด๊ฐ€๋ฉด์„œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ฐพ๋Š”๋ฐ, ๋ชจ๋“  ํด๋ž˜์Šค ๋กœ๋”์— ์—†์œผ๋ฉด ํด๋ž˜์Šค ํŒจ์Šค์—์„œ ์ฐพ์•„๋ณด๊ณ  ๊ฑฐ๊ธฐ์—๋„ ์—†์œผ๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ํด๋ž˜์Šค ๋กœ๋”๋ผ๋ฆฌ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ฅผ ์ด๋ฃจ์–ด ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค ๋กœ๋”๋Š” ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํด๋ž˜์Šค ๋กœ๋”์ด๋‹ค.

 

  • ๊ฐ€์‹œ์„ฑ(visibility) ์ œํ•œ
    • ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค ๋กœ๋”๋Š” ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋กœ๋”์˜ ํด๋ž˜์Šค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ , ๊ทธ ๋ฐ˜๋Œ€๋Š” ์•ˆ๋œ๋‹ค. (๊ณ„์ธต ๊ตฌ์กฐ)
    • ํ•˜์œ„ ํด๋ž˜์Šค ๋กœ๋”๋Š” ์ƒ์œ„ ํด๋ž˜์Šค ๋กœ๋”์˜ ํด๋ž˜์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒ์œ„ ํด๋ž˜์Šค ๋กœ๋”๋Š” ํ•˜์œ„ ํด๋ž˜์Šค ๋กœ๋”์˜ ํด๋ž˜์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.

 

  • ์–ธ๋กœ๋“œ ๋ถˆ๊ฐ€
    • ํด๋ž˜์Šค ๋กœ๋”๋Š” ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์–ธ๋กœ๋“œํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์–ธ๋กœ๋“œ ๋Œ€์‹ , ํ˜„์žฌ ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์•„์˜ˆ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  • ์œ ์ผ์„ฑ
    • ํ•˜์œ„ ํด๋ž˜์Šค ๋กœ๋”๋Š” ์ƒ์œ„ ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ๋กœ๋”ฉํ•œ ํด๋ž˜์Šค๋ฅผ ๋‹ค์‹œ ๋กœ๋”ฉํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ํšจ์œจ์ ์œผ๋กœ ๋กœ๋”ฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

 

๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ

 

 

๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์€ JVM์ด OS ํ• ๋‹น ๋ฐ›๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค.

ํฌ๊ฒŒ 6๊ฐ€์ง€์˜ ์˜์—ญ์ด ์žˆ๋Š”๋ฐ , ๊ณตํ†ต์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ ํ•œ๊ฒƒ๊ณผ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ตฌ๋ถ„ ์ง€์–ด ์•Œ์•„๋ณด์ž

 

๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ

 

์“ฐ๋ ˆ๋“œ ๋‚ด์— ์žˆ๋Š” ๊ฒƒ๋“ค์€ ์„œ๋กœ ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†๋‹ค.

  1. JVM ์Šคํƒ
    • ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋‚˜์”ฉ ์ˆ˜ํ–‰๋  ๋•Œ๋งˆ๋‹ค ์Šคํƒ ํ”„๋ ˆ์ž„์ด ํ•˜๋‚˜์”ฉ ์Œ“์ด๊ฒŒ ๋œ๋‹ค.
    • ์Šคํƒ ํ”„๋ ˆ์ž„์—๋Š” ์ง€์—ญ ๋ณ€์ˆ˜ ๋ฐฐ์—ด์ด๋‚˜ ํ”ผ์—ฐ์‚ฐ์ž ์Šคํƒ ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ์ง€์—ญ ๋ณ€์ˆ˜ ๋ฐฐ์—ด๊ณผ ์Šคํƒ ๊ธฐ๋ฐ˜ ์—ฐ์‚ฐ์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š” ์ง€ ์•Œ์•„๋ณด์ž
int num = 1; // ์Šคํƒ ํ”„๋ ˆ์ž„์— ์Œ“์ž„ 
int sum = num + 5; // ์Šคํƒ ํ”„๋ ˆ์ž„์— ์Œ“์ž„

 

์ด๋Ÿฐ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ JVM ์Šคํƒ ๋‚ด์—์„œ๋Š” ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ๊นŒ?

์ผ๋‹จ ์œ„์—์„œ ๋งํ•œ ๋Œ€๋กœ ์Šคํƒ ํ”„๋ ˆ์ž„์— ๋ฉ”์†Œ๋“œ๊ฐ€ ์Œ“์ด๊ฒŒ ๋  ๊ฒƒ ์ด๋‹ค.

 

๊ทธ ๋‹ค์Œ ์ง€์—ญ ๋ณ€์ˆ˜ ๋ฐฐ์—ด์— ํŒŒ๋ผ๋ฏธํ„ฐ , ๋ณ€์ˆ˜๋“ค์ด ์ €์žฅ์ด ๋˜๋Š” ๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅ๋œ๋‹ค.

๋‹ค์‹œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ณด์ž

L0
    LINENUMBER 15 L0
    ICONST_1 // ์Šคํƒ์— ์ •์ˆ˜๊ฐ’ 1์„ ์˜ฌ๋ฆฐ๋‹ค.
    ISTORE 1 // ์Šคํƒ์— ์žˆ๋Š” ์ •์ˆ˜๊ฐ’์„ ๊บผ๋‚ด์„œ 1๋ฒˆ ์ธ๋ฑ์Šค์— ์ €์žฅ
   L1
    LINENUMBER 16 L1
    ILOAD 1 // 1๋ฒˆ ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ์Šคํƒ์— ์˜ฌ๋ ค๋ผ
    ICONST_5 // ์Šคํƒ์— ์ •์ˆ˜๊ฐ’ 5๋ฅผ ์˜ฌ๋ฆฐ๋‹ค.
    IADD // ์Šคํƒ ์ƒ๋‹จ ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๋”ํ•œ๋‹ค.
    ISTORE 2 // 2๋ฒˆ ์ธ๋ฑ์Šค์— ์ €์žฅํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด์„œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์—ฐ์‚ฐ์„ ๋งˆ์น˜๊ฒŒ ๋œ๋‹ค.

 

 

2.PC ๋ ˆ์ง€์Šคํ„ฐ

  • ํ˜„์žฌ JVM ๋ช…๋ น์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๋Š” ์“ฐ๋ ˆ๋“œ ๊ณต์œ ์˜ ๋ ˆ์ง€์Šคํ„ฐ์ด๋‹ค.
  • ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค.

3.๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ

  • JNI ๋ผ๋Š” ๊ฒƒ์€ ํ†ตํ•ด ์ž๋ฐ”๊ฐ€ ์•„๋‹Œ c๋‚˜ c++์„ ํ†ตํ•ด ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜์˜€์„ ์‹œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์Šคํƒ์ด๋‹ค.

๊ณต์œ ํ•˜๋Š” ๊ฒƒ

  1. ํž™
    • ์ธ์Šคํ„ด์Šค ํ˜น์€ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ๋‹ค.
    • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ์ž‘์—…์ด ์ฃผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
  2. ๋ฉ”์„œ๋“œ ์˜์—ญ
    • ํด๋ž˜์Šค ๋กœ๋”๋กœ ๋ถ€ํ„ฐ ๋ถˆ๋Ÿฌ์˜จ ํด๋ž˜์Šค์˜ ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ •๋ณด๋“ค์„ ์ €์žฅํ•œ๋‹ค.

์‹คํ–‰ ์—”์ง„

์‹คํ–‰ ์—”์ง„์—์„œ ๋น„๋กœ์†Œ ๊ธฐ๊ณ„์–ด๋กœ์˜ ๋ฒˆ์—ญ์„ ์‹œ์ž‘ํ•œ๋‹ค.

์ด๋•Œ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์“ฐ์ด๋Š” ๋ฐ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์™€ JIT ๋ฐฉ์‹์ด๋‹ค.

 

์ธํ„ฐํ”„๋ฆฌํ„ฐ

  • ๋ฐ”์ดํŠธ ์ฝ”๋“œ ๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜์”ฉ ์ฝ์–ด์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ํ•ด์„์€ ๋น ๋ฅด์ง€๋งŒ ์‹คํ–‰์€ ๋А๋ฆฌ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
  • ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋กœ ๋™์ž‘ํ•œ๋‹ค.

 

JIT(Just-In-Time)

  • ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ฒˆ์—ญํ•œ๋‹ค.
  • ์ดํ›„ ์ธํ„ฐํ”„๋ฆฌํŒ…์„ ํ•˜์ง€ ์•Š๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์ง์ ‘ ์‹คํ–‰ํ•˜๋ฉฐ ํ•œ๋ฒˆ ์ปดํŒŒ์ผ ๋œ ์ฝ”๋“œ๋Š” ์บ์‹œ์— ์ €์žฅ๋œ๋‹ค.
  • ํ•˜์ง€๋งŒ ์ฒ˜์Œ ์ปดํŒŒ์ผ ๊ณผ์ •์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฏ€๋กœ ํ•œ๋ฒˆ๋งŒ ์“ฐ๋Š” ๋ฉ”์†Œ๋“œ๋Š” JIT ์‚ฌ์šฉ์ด ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

JVM์— ๊ด€ํ•˜์—ฌ - Part 2, ClassLoader

 

JVM์— ๊ด€ํ•˜์—ฌ - Part 2, ClassLoader

Java ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š” ๊ฑธ๊นŒ? ํ•ด๋‹น ๋ฌผ์Œ์— ๋‹ต์„ ์ฐพ๊ธฐ ์œ„ํ•œ JVM ์‹œ๋ฆฌ์ฆˆ 2ํŽธ, JVM ์˜ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ClassLoader ์— ๊ด€ํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ClassLoader…

tecoble.techcourse.co.kr

JVM. ํด๋ž˜์Šค๋กœ๋” ์„œ๋ธŒ์‹œ์Šคํ…œ(Class Loader Subsystem)

 

JVM. ํด๋ž˜์Šค๋กœ๋” ์„œ๋ธŒ์‹œ์Šคํ…œ(Class Loader Subsystem)

JVM์€ RAM์— ์œ„์น˜ํ•˜๋ฉฐ, ์‹คํ–‰ ์ค‘์— ํด๋ž˜์Šค๋กœ๋” ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ์ด์šฉํ•˜์—ฌ ํด๋ž˜์Šค ํŒŒ์ผ์„ RAM์œผ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ž๋ฐ”์˜ ๋™์  ํด๋ž˜์Šค ๋กœ๋”ฉ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ์ปดํŒŒ์ผ ํƒ€์ž„์ด ์•„๋‹ˆ๋ผ ๋Ÿฐํƒ€

blog.hexabrain.net

https://www.youtube.com/watch?v=6reapO0gLPs&t=399s

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐฑ์—”๋“œ ๋ฐ๋ธŒ์ฝ”์Šค์—์„œ ์ง„ํ–‰ํ•œ Tech Log ํ™œ๋™ ๋ชฉ์ ์œผ๋กœ ์ œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

1. String ํด๋ž˜์Šค์˜ equals & hashcode

์†Œํ”„ํŠธ์›จ์–ด ์„ธ๊ณ„์—์„œ๋Š” ๋ฌธ์ž์—ด๋„ ์ด์ƒํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

๋ฐ”๋กœ ๋™๋“ฑ์„ฑ์„ ๋ณด์žฅํ•ด์ฃผ๊ธฐ ์œ„ํ•จ์ธ๋ฐ,

์ด๋•Œ ์•ž์—์„œ ๋งํ•œ equals ๋ฉ”์†Œ๋“œ์™€ HashCode ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ด๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ equals ์™€ HashCode ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

๋ณธ๋ฌธ์—์„œ๋Š” String์„ ๋ชจ๋ฐฉํ•œ String_test ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋ณผ๊ฒƒ์ด๋ฉฐ , ๊ฐ๊ฐ์˜ ๊ฒฐ๊ณผ๊ฐ’๋“ค์„ ๋งž์ถฐ๋‚˜๊ฐˆ ๊ฒƒ์ด๋‹ค.

equals ๋น„๊ต

๋จผ์ € ๊ฐ์ฒด์˜ ๋™๋“ฑ์„ฑ์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด equals์˜ ๊ฐ’์„ ๋น„๊ตํ•ด๋ณด์ž

String string1 = new String("hi");
String string2 = new String("hi");

System.out.println("String ๊ฐ์ฒด hashcode ๋น„๊ต ๊ฒฐ๊ณผ : "+(string1.equals(string2)));

String_test string1_test = new String_test("hi");
String_test string2_test = new String_test("hi");

System.out.println("String ๊ฐ์ฒด hashcode ๋น„๊ต ๊ฒฐ๊ณผ : "+(string1_test.equals(string2_test)));

 

๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š”  ํด๋ž˜์Šค๋ผ๋ฆฌ ๋น„๊ตํ•˜์˜€์ง€๋งŒ

String ๊ฐ์ฒด๋Š” equals ์˜ true์ด๊ณ  ,

String_test๋Š” equals ์˜ ๊ฐ’์ด false ๊ฐ€ ๋‚˜์™”๋‹ค.

hashcode ๋น„๊ต

๋‹ค์Œ์€ ๊ฐ์ฒด์˜ hashcode ๊ฐ’์„ ๋น„๊ตํ•ด๋ณด์ž

String string1 = new String("hi");
String string2 = new String("hi");

System.out.println("String ๊ฐ์ฒด hashcode ๋น„๊ต ๊ฒฐ๊ณผ : "+(string1.hashCode() == string2.hashCode()));

String_test string1_test = new String_test("hi");
String_test string2_test = new String_test("hi");

System.out.println("String_test ๊ฐ์ฒด hashcode ๋น„๊ต ๊ฒฐ๊ณผ : "+(string1_test.hashCode() == string2_test.hashCode()));

ํ•ด์‰ฌ์ฝ”๋“œ ๋น„๊ต ๊ฒฐ๊ณผ๊ฐ’๋„ String ๊ฐ์ฒด์™€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿง ์™œ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”์„๊นŒ?

 

์ •๋‹ต์€ equals ์™€ hashcode ์˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์— ์žˆ๋‹ค.

 

์ด ๋‘˜์„ ์žฌ์ •์˜ ํ•˜๊ธฐ ์ „์— ๊ฐ๊ฐ ์›๋ž˜ ๋ฌด์Šจ ์—ญํ• ์„ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ธ์ง€ ๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž

2. equals ๋ž€ ?

equals ๋ฉ”์†Œ๋“œ๋Š” 2๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ๋™๋“ฑํ•œ ์ง€ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด,

String string1 = new String("hi");
String string2 = new String("hi");

System.out.println(string1 == string2); // false
System.out.println(string1.equals(string2)); // true

๋‹ค์Œ๊ณผ ๊ฐ™์ด String ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋น„๊ตํ•˜๋Š” ๊ฒฝ์šฐ "==" ๋Š” ๋™์ผ์„ฑ์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— false ๋ฅผ ์ถœ๋ ฅํ•˜์ง€๋งŒ , equals ๋ฉ”์†Œ๋“œ๋Š” ๋™๋“ฑ์„ฑ์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— true๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

*๋™๋“ฑ์„ฑ๊ณผ ๋™์ผ์„ฑ์˜ ์ฐจ์ด๋Š” ๋ญ˜๊นŒ?

๋™๋“ฑ์„ฑ์€ ๋Œ€์ƒ์˜ ๋Œ€์ƒ์˜ ๋‚ด์šฉ์„ ๋น„๊ตํ•˜๊ณ 

๋™์ผ์„ฑ์€ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ๊ฐ™์€ ๊ฐ์ฒด์ธ ์ง€๋ฅผ ๋น„๊ตํ•œ๋‹ค.

 

Object ํด๋ž˜์Šค์˜ equals ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž

public boolean equals(Object obj) {
			return this == obj;
    }

๊ทผ๋ฐ ์ •์ž‘ Object์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋™๋“ฑ์„ฑ์„ ๋น„๊ตํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค .(์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.)

๊ทธ๋Ÿฐ๋ฐ ์™œ String ์—์„œ๋Š” ๋ฌธ์ž์—ด์˜ ๋™๋“ฑ์„ฑ์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑธ๊นŒ?

 

์ž๋ฐ” ๊ณต์‹๋ฌธ์„œ์— ๋ณด๋ฉด String์˜ equals ๋ฉ”์†Œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด equals ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•œ๋‹ค๊ณ  ๋‚˜์™€์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ์šฐ๋ฆฌ๋Š” equals ๋ฉ”์†Œ๋“œ๋ฅผ ๋™๋“ฑ์„ฑ ๋น„๊ต์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค !

 

๊ทธ๋Ÿฌ๋ฉด String_test ๋ฉ”์†Œ๋“œ์—๋„ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ equals๋ฅผ ์žฌ์ •์˜ ํ•˜๋ฉด ๋™๋“ฑ์„ฑ ๋น„๊ต๊ฐ€ ๋˜์ง€ ์•Š์„๊นŒ ?

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  Spring_test ํด๋ž˜์Šค์—๋„ equals ๋ฅผ ์žฌ์ •์˜ ํ•ด์ฃผ์—ˆ๋‹ค.

 

class String_test {
    String string;

    public String_test(String string) {
        this.string = string;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        String_test that = (String_test) o;
        return Objects.equals(string, that.string);
    }
}

๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๊ฐ’๋„ ์˜๋„ํ•œ ๋Œ€๋กœ true ๊ฐ€ ๋‚˜์™”๋‹ค !

3. hashCode๋ž€ ?

hashCode ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด์˜ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

 

*๊ฐ์ฒด์˜ ํ•ด์‹œ์ฝ”๋“œ๋ž€?

๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ณ€ํ™˜ํ•˜์—ฌ ์ƒ์„ฑํ•œ ๊ณ ์œ ์˜ ํ•ด์‹œ๊ฐ’์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ๊ธฐ์กด ๋ฐฉ์‹์œผ๋กœ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์ด๋ผ๋„ ๋‹ค๋ฅธ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ›์„ ๊ฒƒ์ด๋‹ค.

→ ์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ๋™๋“ฑ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค !

 

๋”ฐ๋ผ์„œ String ํด๋ž˜์Šค๋Š” hashCode ์—ญ์‹œ ์žฌ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ž๋ฐ” ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด ๋ฌธ์ž์—ด์˜ ๋ฌธ์ž๋“ค์„ ํ•œ ๊ธ€์ž์”ฉ ๊ฐ€์ ธ์™€์„œ ๋ณ€ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ์— ๋‹ค๋ฅธ ์ฃผ์†Œ๊ฐ’์˜ ๊ฐ์ฒด๋ผ๋„ ๋ฌธ์ž์—ด์ด ๊ฐ™์œผ๋ฉด ๊ฐ™์€ hashcode ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  Spring_test ํด๋ž˜์Šค๋„ hashCode ๋ฅผ ์žฌ์ •์˜ ํ•ด๋ณด์•˜๋‹ค.

 

class String_test {
    String string;

    public String_test(String string) {
        this.string = string;
    }

    @Override
    public int hashCode() {
        return Objects.hash(string);
    }
}

String ๊ฐ์ฒด์ฒ˜๋Ÿผ Spring_test ๊ฐ์ฒด๋„ ๊ฐ™์€ ๊ฐ’์ด ๋‚˜์˜ด์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

Hash ์™€ Hash ํ…Œ์ด๋ธ”์˜ ๊ด€๊ณ„

hashCode ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด์‹œ์ฝ”๋“œ ๊ฐ’์„ ๋ฐ›๋Š” ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์–ป๊ฒŒ ๋œ ํ•ด์‹œ์ฝ”๋“œ๋Š” ์–ด๋””์— ์‚ฌ์šฉ๋˜๋Š” ๊ฑธ๊นŒ?

 

hashCode ์™€ equals ์˜ ๊ด€๊ณ„๋ฅผ ์•Œ๊ธฐ ์ „ ์šฐ๋ฆฌ๋Š” ํ•ด์‹œํ…Œ์ด๋ธ”์ด๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

 

๐Ÿง ์ž๋ฃŒ๊ตฌ์กฐ? ๊ทธ๊ฒŒ ๋ญ”๊ฐ€์š”?

 

๋„์„œ๊ด€์—๋Š” ์ •๋ง ๋งŽ์€ ์ฑ…๋“ค์ด ์žˆ๋‹ค.

 

๋งŒ์•ฝ ์ž๊ธฐ๊ฐ€ ์‚ฌ์„œ ๊ด€๋ฆฌ๋ฅผ ๋งก์•˜๋Š” ๋ฐ ์ด ๋งŽ์€ ์ฑ…๋“ค ์ค‘์—์„œ ํŠน์ • ์ฑ…์„ ์ฐพ๊ฑฐ๋‚˜ ์ •๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์—ฌ๊ฐ„ ๋ง‰๋ง‰ํ•œ ์ผ์ด ์•„๋‹ ๊ฒƒ์ด๋‹ค.

 

๋‹คํ–‰ํžˆ ์ด๋Ÿฐ ์ผ๋“ค์„ ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜์Œ ๊ฒช์€ ๊ฒŒ ์•„๋‹ˆ๊ณ  ์˜›๋‚ ๋ถ€ํ„ฐ ๋งŽ์€ ๊ธฐ์ˆ ์ž๋“ค์ด ๊ณ ์•ˆํ•œ ๋์— ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ๊ณ  ๊บผ๋‚ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ทœ์น™๊ณผ ํ‹€์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘์—ˆ๋‹ค.

 

์ด๊ฒƒ๋“ค ์ค‘์— ํ•˜๋‚˜๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ์•„๋ณผ ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด๋‹ค.

 

ํ•ด์‹œํ…Œ์ด๋ธ”์ด๋ž€?

๋ฐ์ดํ„ฐ๋ฅผ key , value ๋กœ ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ๋งํ•œ๋‹ค.

๋ณดํ†ต ๋„์„œ๊ด€์—์„œ๋Š” ๋„์„œ ๊ด€๋ฆฌ ๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•˜๊ณ  , ๊ทธ ๋ฒˆํ˜ธ๋ฅผ ์ฐพ์•„๋ณด๋ฉด ํ•ด๋‹น ์ฑ…์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒƒ๋„ ํ˜„์‹ค ์„ธ๊ณ„์—์„œ์˜ key , value ํ˜•ํƒœ๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์›๋ฆฌ

๋‹ค์‹œ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๋Œ์•„์™€์„œ ์ด๋Ÿฌํ•œ ํ˜•ํƒœ์˜ ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š” ์ง€ ์•Œ์•„๋ณด์ž

๋„์„œ๊ด€์˜ ์ฑ…๋“ค์„ key , value ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

 

์ด๋•Œ key๋Š” ์ฑ… ์ด๋ฆ„ , value๋Š” ๊ฐ€๊ฒฉ์œผ๋กœ ํ•ด์ฃผ์—ˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ, ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” Bucket์—๋Š” ํ•ด์‰ฌ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋‚˜์˜จ ์ธ๋ฑ์Šค์™€ value(์ฑ… ๊ฐ€๊ฒฉ) ์ด ๋‹ด๊ธด๋‹ค.

 

์ด๋Ÿฐ์‹์œผ๋กœ ์ €์žฅ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ Hash ์—ฐ์‚ฐ์„ ํ•œ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

→ ์ด๋Ÿฐ ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1) ์ด ๋œ๋‹ค !

 

๐Ÿง ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์„œ๋กœ ๋‹ค๋ฅธ ์ฑ…๋“ค๋ผ๋ฆฌ ๊ฐ™์€ ํ•ด์‰ฌ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์„œ ๊ฐ™์€ ์ธ๋ฑ์Šค์— ์ €์žฅ๋œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ ?

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ• ๋‘๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

Separate Chaining ๊ธฐ๋ฒ•

ํ•ด์‰ฌํ…Œ์ด๋ธ”์—์„œ๋Š” ํ•˜๋‚˜์˜ ์ธ๋ฑ์Šค์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฒ„ํ‚ท์„ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์‹œ ๊ทธ๋ฆผ์„ ๋ณด์ž

๋ถ„๋ช… ๋‹ค๋ฅธ ์ฑ…์ธ๋ฐ, ๊ฐ™์€ ์ธ๋ฑ์Šค์— ์ €์žฅ์ด ๋˜์—ˆ๋‹ค.

์ฆ‰ ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋‹ˆ๊นŒ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๊ธฐ์กด ๊ฐ’๊ณผ ์—ฐ๊ฒฐ์‹œํ‚จ ๊ฑฐ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฒ„ํ‚ท์— ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ํšจ์œจ์ด ์•ˆ์ข‹์•„์ง„๋‹ค.

๊ธฐ์กด์—” ํ•ด์‹œ ํ•จ์ˆ˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ํ•ด๋‹น ์ธ๋ฑ์Šค๋งŒ ์ฐพ์•„๊ฐ€๋ฉด ๋์—ˆ๋Š”๋ฐ , ์ด์ œ๋Š” ๊ทธ ์•ˆ์—์„œ ํ•œ๋ฒˆ ๋” ํƒ์ƒ‰์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋’ค์ ธ๋ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

→ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ํ‰๊ท ์ ์œผ๋กœ O(n/m) ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n) ์„ ๊ฐ€์ง€๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค.

(ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์ €์žฅ์†Œ(Bucket)์˜ ๊ธธ์ด๋ฅผ ‘m’, ํ‚ค(key)์˜ ์ˆ˜๋ฅผ ‘n’)

 

์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”8 ์ด์ƒ๋ถ€ํ„ฐ๋Š” ํ•˜๋‚˜์˜ ํ•ด์‹œ ๋ฒ„ํ‚ท์— ํ• ๋‹น ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ 8๊ฐœ ์ด์ƒ์ด ๋˜๋ฉด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ํŠธ๋ฆฌ๋กœ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

→ ์ด๋Ÿด ๊ฒฝ์šฐ ํ‰๊ท  ์ ์ธ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(log(n/m)) ์ด ๋œ๋‹ค.

 

Open addressing ๊ธฐ๋ฒ• (๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•)

๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•์€ ํ•ด์‹œ๊ฐ’์˜ ์ธ๋ฑ์Šค์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ์‹œ์— ๋‹ค๋ฅธ ์ธ๋ฑ์Šค๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๊ฐ™์€ ์ธ๋ฑ์Šค์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ๋Š” ์ƒ๋ฐ˜๋œ ๋ฐฉ๋ฒ•์ด๋‹ค !

 

ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒ ํ–ˆ์„ ์‹œ์— ์–ด๋А ์ธ๋ฑ์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

์„ ํ˜• ํƒ์ƒ‰ (linear probing)

์ถฉ๋Œ์ด ์ผ์–ด๋‚ฌ์„ ๋•Œ, ํ•œ์นธ ๋˜๋Š” n์นธ์”ฉ ๋‹ค์Œ ์ธ๋ฑ์Šค๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณธ๋‹ค.

์ œ๊ณฑ ํƒ์ƒ‰ (quadratic probing)

1์˜ ์ œ๊ณฑ , 2์˜ ์ œ๊ณฑ … ๋งŒํผ ์ธ๋ฑ์Šค๋ฅผ ์ด๋™ํ•ด๊ฐ€๋ฉด์„œ ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณธ๋‹ค.

์ด์ค‘ ํ•ด์‹œ (Double Hash)

์œ„์— ๋‘ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด์„œ ์–ด๋А ์ •๋„ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•  ์ˆœ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ํ•ด์‰ฌ๊ฐ’์ด ๊ฐ™์„ ๊ฒฝ์šฐ ๋นˆ ์Šฌ๋กฏ์„ ์ฐพ์•„ ์ ‘๊ทผํ•˜๋Š” ์œ„์น˜๊ฐ€ ๋™์ผํ•˜๋ฏ€๋กœ

์ ‘๊ทผ ์Šฌ๋กฏ์„ ์ค‘์‹ฌ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ ๊ณณ์— ์ง‘์ค‘๋˜์–ด ์žˆ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด ์ƒํ™ฉ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๋ฐฉ๋ฒ•์ด ์ด์ค‘ ํ•ด์‹œ์ด๋‹ค.

๋ง ๊ทธ๋Œ€๋กœ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ๋‘ ๋ฒˆ ๋Œ๋ฆฐ ๊ฒƒ์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด,

1์ฐจ ํ•ด์‹œ๋Š” ํ‚ค๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ํ•ด์‹œ ์ธ๋ฑ์Šค๋ฅผ ์ •ํ•œ๋‹ค.

2์ฐจ ํ•ด์‹œ๋Š” ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์˜€์„ ์‹œ์— ๋ช‡ ์นธ ๋’ค๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ด๋™ํ•  ์ง€ ์ •ํ•œ๋‹ค.

์ด์ฒ˜๋Ÿผ ์ด์ค‘ ํ•ด์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 1์ฐจ ํ•ด์‹œ๊ฐ’์ด ๊ฐ™๋”๋ผ๋„ 2์ฐจ ํ•ด์‹œ๊ฐ’์€ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ,

๋ฐ์ดํ„ฐ์˜ ๊ตฐ์ง‘ ๋ฌธ์ œ๋ฅผ ์–ด๋А์ •๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•์˜ ๊ฒฝ์šฐ์—๋„ ํ•ด๋‹น ์ธ๋ฑ์Šค์— ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ์—ˆ๋‹ค๋ฉด ๋‹ค์Œ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•„๊ฐ€๋ฉด์„œ ํƒ์ƒ‰์„ ํ•ด์•ผํ•˜๋ฏ€๋กœ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n) ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿง ๊ทผ๋ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์  ๋งŽ์•„์ง„๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ ?

์•„๋งˆ ํ•ด์‰ฌ ์ถฉ๋Œ์€ ๋นˆ๋ฒˆํ•ด์ง€๋ฉฐ ํšจ์œจ์€ ๋”์šฑ ๋‚˜๋น ์งˆ ๊ฒƒ์ด๋‹ค.

(์ฐธ๊ณ ๋กœ ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ๋ฒ„ํ‚ท ์‚ฌ์ด์ฆˆ๋Š” 16์ด๋‹ค)

์ด ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋ฌ˜์‚ฌํ•œ ์žฌ๋ฐŒ๋Š” ์ด๋ก ์ด ์žˆ๋‹ค.

 

๋น„๋‘˜๊ธฐ ์ง‘ ์›๋ฆฌ

๋งŒ์•ฝ 9๊ฐœ์˜ ๋น„๋‘˜๊ธฐ ์ง‘์ด ์žˆ๋Š” ๋ฐ 10๋งˆ๋ฆฌ ์ด์ƒ์˜ ๋น„๋‘˜๊ธฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค๋ฉด?

์–ด์ฉ” ์ˆ˜ ์—†์ด 2๋งˆ๋ฆฌ ์ด์ƒ์˜ ๋น„๋‘˜๊ธฐ๊ฐ€ ํ•จ๊ป˜ ์ง€๋‚ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

์ด ์ƒํ™ฉ์€ ๋ฌดํ•œํ•œ(๋น„๋‘˜๊ธฐ) ์ž…๋ ฅ์— ๋Œ€ํ•ด ์œ ํ•œํ•œ(๋น„๋‘˜๊ธฐ ์ง‘) ์ถœ๋ ฅ๋งŒ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜ํƒ€๋‚œ ํ˜„์ƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์†Œํ”„ํŠธ์›จ์–ด์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.

key๊ฐ’์€ ๋ฌดํ•œํ•˜์ง€๋งŒ ๋ฒ„ํ‚ท ๊ณผ ํ•ด์‰ฌ๊ฐ’ ์€ ์œ ํ•œํ•˜๋‹ค.

์ด ๊ฒฝ์šฐ ํ•ด์‰ฌํ…Œ์ด๋ธ”์€ Dynamic Resizing ์„ ํ†ตํ•ด์„œ ๋ฒ„ํ‚ท์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๋‘ ๋ฐฐ์”ฉ ๋Š˜๋ ค์ค€๋‹ค.

 

์ด๋•Œ ๋Š˜๋ฆด ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ธธ์ด๋Š” 2^30 ์ด๋‹ค !

์ด์ œ HashCode์˜ ์—ญํ• ๊ณผ ํ•ด์‹œ ๊ฐ’์„ ์ด์šฉํ•œ ํ•ด์‹œ ํ…Œ์ด๋ธ”๋„ ์•Œ์•„๋ณด์•˜์œผ๋‹ˆ

์ด์ฏค์—์„œ equals and hashcode์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

4. equals ์™€ hashcode ์„ ์™œ ๊ฐ™์ด ์žฌ์ •์˜ ํ•ด์ค˜์•ผํ• ๊นŒ ?

์œ„์—์„œ ๋ณด์•˜๋“ฏ์ด ์ผ๋ฐ˜์ ์œผ๋กœ equals ์™€ hashcode ๋Š” ๊ฐ™์ด ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด์ฃผ๊ณ  ์žˆ๋‹ค.

๋งŒ์•ฝ equals๋งŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด์ค€๋‹ค๋ฉด ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ , ๋Œ€ํ‘œ์ ์œผ๋กœ ํ•ด์‰ฌ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์ด๋‹ค.

์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” set๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด์ž

๊ฐ™์€ ๊ฐ’์˜ ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์ค€๋‹ค๋ฉด ํ•˜๋‚˜๋งŒ ๋“ค์–ด๊ฐ€์•ผ ์ •์ƒ์ผ ๊ฒƒ์ด๋‹ค.

equals๋งŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์˜€์„ ๊ฒฝ์šฐ

class Test {
    String key;

		public Test(String key) {
        this.key = key;
    }
		
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Test test = (Test) o;
        return Objects.equals(key, test.key);
    }    
}
Set<Test> set = new HashSet<>();
        
set.add(new Test("hi"));
set.add(new Test("hi"));

System.out.println(set.size()); // ๊ฒฐ๊ณผ 2

๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์คฌ๋Š”๋ฐ ๋‘๊ฐœ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค.

์ด๋Š” Hash ํ…Œ์ด๋ธ”์—์„œ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง์—๋„ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ธ์‹ํ•˜์˜€๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

hashCode ๋งŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์˜€์„ ๊ฒฝ์šฐ

class Test {
    String key;

    public Test(String key) {
        this.key = key;
    }

    @Override
    public int hashCode() {
        return Objects.hash(key);
    }
}
Set<Test> set = new HashSet<>();
        
set.add(new Test("hi"));
set.add(new Test("hi"));

System.out.println(set.size()); // ๊ฒฐ๊ณผ 2

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์คฌ๋Š”๋ฐ ๋‘๊ฐœ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค.

์ด ๊ฒฝ์šฐ๋„ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง์—๋„ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ธ์‹ํ•˜์˜€๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

๐Ÿง ์™œ Equals์™€ HashCode ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์žฌ์ •์˜ ํ•˜์˜€์„ ์‹œ์— ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฑธ๊นŒ ?

์ด ์ด์œ ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด ํ•ด์‰ฌ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์•Œ์•„๋ณด์ž

ํ•ด์‰ฌ ๋งต์˜ ๋™์ž‘ ๊ตฌ์กฐ

ํ•ด์‰ฌ ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ๊ฐ์ฒด๊ฐ€ ๋™๋“ฑํ•œ ์ง€๋ฅผ ๋น„๊ตํ•  ๋• ๋‹ค์Œ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

  1. ํ•ด์‰ฌ์ฝ”๋“œ์˜ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.
  2. ํ•ด์‰ฌ์ฝ”๋“œ์˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด equals์˜ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.
  3. ์œ„ ๋‘๊ฐœ์˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ๋™๋“ฑ ๊ฐ์ฒด๋ผ๊ณ  ํŒ๋‹จํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ,

equals๋งŒ ์žฌ์ •์˜ ํ•˜์˜€์„ ๊ฒฝ์šฐ ํ•ด์‰ฌ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์™”๊ธฐ ๋•Œ๋ฌธ์ด๊ณ 

hashCode ๋งŒ ์žฌ์ •์˜ ํ•˜์˜€์„ ๊ฒฝ์šฐ equals์˜ ๋ฐ˜ํ™˜๊ฐ’์ด false ์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋ณด์•˜๋˜ ๊ฒƒ์ด๋‹ค.

 

์ด์ฒ˜๋Ÿผ ๋‘˜์„ ๋™์‹œ์— ์žฌ์ •์˜ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด, Hash ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ถˆ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

4. equals & hashCode ๊ทœ์•ฝ

  1. equals() ๋น„๊ต์— ์‚ฌ์šฉ๋˜๋Š” ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๊ทธ ๊ฐ์ฒด์˜ hashcode()๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค.
  2. equals()๋กœ ๋น„๊ตํ–ˆ์„ ๋•Œ ๊ฐ™๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค๋ฉด, ๋‘ ๊ฐ์ฒด์˜ hashCode๋Š” ๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
  3. equals()๊ฐ€ ๋‘ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅด๋‹ค๊ณ  ํŒ๋‹จํ•œ ๊ฒฝ์šฐ ๊ผญ hashCode๊ฐ€ ๋‹ค๋ฅผ ํ•„์š”๋Š” ์—†๋‹ค.
  4. ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.

5. ๊ฒฐ๋ก 

ํ•ด์‹œ์ฝ”๋“œ์™€ equals์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  , ์ด ๋‘˜์„ ์™œ ๊ฐ™์ด ์žฌ์ •์˜ ํ•ด์ค˜์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„๋ณด์•˜๋‹ค.

๋งŒ์•ฝ ์ด ๋‘˜์„ ๊ฐ™์ด ์žฌ์ •์˜ ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์œ„์ฒ˜๋Ÿผ ํ•ด์‰ฌ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•  ๋•Œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

๋™๋“ฑ์„ฑ์„ ๋ณด์žฅํ•ด์ฃผ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ธ์‹์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ equals์™€ hashCode ๋ฅผ ๊ฐ™์ด ์žฌ์ •์˜ ํ•˜๋„๋ก ํ•˜์ž !

6.์ฐธ๊ณ  ์ž๋ฃŒ

Java HashMap์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€?

equals์™€ hashCode๋Š” ์™œ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์•ผ ํ• ๊นŒ?

 

equals์™€ hashCode๋Š” ์™œ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์•ผ ํ• ๊นŒ?

equals์™€ hashCode๋Š” ๊ฐ™์ด ์žฌ์ •์˜ํ•˜๋ผ๋Š” ๋ง์„ ๋‹ค๋“ค ํ•œ ๋ฒˆ์ฏค ๋“ค์–ด๋ดค์„ ๊ฒƒ์ด๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ IDE Generate ๊ธฐ๋Šฅ์—์„œ๋„ equals์™€ hashCode๋ฅผ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์ฃผ๋ฉฐ lombok์—์„œ๋„ EqualsAndHashCode…

tecoble.techcourse.co.kr

Hashtable์˜ ์ดํ•ด์™€ ๊ตฌํ˜„ #1

 

Hashtable์˜ ์ดํ•ด์™€ ๊ตฌํ˜„ #1

ํ•ด์‰ฌ ํ…Œ์ด๋ธ”์˜ ์ดํ•ด์™€ ๊ตฌํ˜„ (Hashtable) ์กฐ๋Œ€ํ˜‘ (http://bcho.tistory.com) ๊ธฐ๋ณธ์ ์ธ ํ•ด์‰ฌ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ดํ•ด ํ•ด์‰ฌ ํ…Œ์ด๋ธ”์€ Key์— Value๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํƒ€ ๊ตฌ์กฐ๋กœ, value := get(key)์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์ด ๋งค์šฐ๋งค์šฐ ๋น 

bcho.tistory.com

equals์™€ hashCode๋Š” ์™œ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์•ผ ํ• ๊นŒ?

 

equals์™€ hashCode๋Š” ์™œ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์•ผ ํ• ๊นŒ?

equals์™€ hashCode๋Š” ๊ฐ™์ด ์žฌ์ •์˜ํ•˜๋ผ๋Š” ๋ง์„ ๋‹ค๋“ค ํ•œ ๋ฒˆ์ฏค ๋“ค์–ด๋ดค์„ ๊ฒƒ์ด๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ IDE Generate ๊ธฐ๋Šฅ์—์„œ๋„ equals์™€ hashCode๋ฅผ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์ฃผ๋ฉฐ lombok์—์„œ๋„ EqualsAndHashCode…

tecoble.techcourse.co.kr

[๋ฐ์ดํ„ฐ ๊ตฌ์กฐ] Hashtable ์ถฉ๋Œ(collisoion)์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. (open addressing, separate chaining) +์„ค๋ช…์˜์ƒ

 

[๋ฐ์ดํ„ฐ ๊ตฌ์กฐ] Hashtable ์ถฉ๋Œ(collisoion)์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. (open addressing, se

Hashtable์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด์‹œํ…Œ์ด๋ธ”์€ ์•„๋ž˜ ์‹œ๊ฐ„๋ณต์žก๋„, ๊ณต๊ฐ„๋ณต์žก๋„๋ฅผ...

blog.naver.com

 

'ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐฑ์—”๋“œ ๋ฐ๋ธŒ์ฝ”์Šค' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Gradle ์ด๋ž€?  (0) 2023.09.03
JVM ๋‚ด๋ถ€๋กœ  (0) 2023.09.03

ํŠธ๋žœ์žญ์…˜์ด๋ž€ ?

 

์†Œํ”„ํŠธ์›จ์–ด ์„ธ๊ณ„์—์„œ์˜ ํŠธ๋žœ์žญ์…˜์„ ์‚ดํŽด๋ณด๊ธฐ ์•ž์„œ์„œ ์‹ค์ƒํ™œ์—์„œ ํ”ํžˆ ์žˆ๋Š” ์ด์•ผ๊ธฐ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๋งŒ์•ฝ ์นœ๊ตฌ๊ฐ€ ๋‹น์‹ ์—๊ฒŒ ์ž์‹ ์˜ ๊ณ„์ขŒ์— 20๋งŒ์›์„ ๋ณด๋‚ด์ฃผ๋ ค๊ณ  ํ•œ๋‹ค.

 

 

์ด ๊ฒฝ์šฐ ์ž‘์—…์˜ ๋‹จ์œ„๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

์ž์„ธํžˆ ํŒŒํ•ด์น˜๋ฉด ๋” ๋งŽ์€ ๋‹จ์œ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

1. ์นœ๊ตฌ A์˜ ๊ณ„์ขŒ์—์„œ 20๋งŒ์›์„ ๋บ€๋‹ค.

2. ์นœ๊ตฌ B์˜ ๊ณ„์ขŒ์— 20๋งŒ์›์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

์ด ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋“ค์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ๋Œ€ํ‘œ์ ์œผ๋กœ 4๊ฐ€์ง€๋งŒ ์•Œ์•„๋ณด์ž

 

๋งŒ์•ฝ, ์†ก๊ธˆ ๋„์ค‘ A์˜ ๊ณ„์ขŒ์—๋Š” ๋ˆ์ด ๋น ์กŒ๋Š”๋ฐ B์˜ ๊ณ„์ขŒ์— ๋ˆ์ด ๊ทธ๋Œ€๋กœ๋ผ๋ฉด?

๋งŒ์•ฝ, A์˜ ๊ณ„์ขŒ์— ๋ˆ์ด ๋ถ€์กฑํ•œ ์ƒํƒœ์ธ๋ฐ ์†ก๊ธˆ์ด ๋˜์—ˆ๋‹ค๋ฉด?

๋งŒ์•ฝ, ์†ก๊ธˆ ๋„์ค‘ ์นœ๊ตฌC๊ฐ€ ์†ก๊ธˆ์„ ๋ณด๋‚ด์„œ ์„œ๋กœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์—‡๊ฐˆ๋ฆฐ๋‹ค๋ฉด?

๋งŒ์•ฝ, ์†ก๊ธˆ์„ ์ž˜ ๋งˆ์ณค์Œ์—๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚ ์•„๊ฐ€ ๋ฒ„๋ฆฐ๋‹ค๋ฉด..?

 

๊ทธ๋ ‡๋‹ค๋ฉด ์นœ๊ตฌ๊ฐ€ ๋ณด๋‚ด์ค€๋‹ค๊ณ  ํ–ˆ๋˜ 20๋งŒ์›์€ ์ฆ๋ฐœํ•ด๋ฒ„๋ฆฐ ๊ฒƒ์ด๊ณ  ์ด๋Š” ๊ณง ๋Œ€ํ˜• ์‚ฌ๊ณ ๋กœ ์ด์–ด์ง„๋‹ค.

์ด๋Ÿฐ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํŠธ๋žœ์žญ์…˜์ด๋‹ค.

 

ํŠธ๋žœ์žญ์…˜์€ ์œ„์—์„œ ๋งํ•œ ์ž‘์—… ๋‹จ์œ„๋“ค์„ ๋ฌถ์Œ์œผ๋กœ ์ธํ•ด ์ผ๋ถ€๋งŒ ์„ฑ๊ณตํ•ด์„œ DB์— ๋ฐ˜์˜๋˜๋Š” ์ผ์ด ์—†๋„๋ก ๋„์™€์ค€๋‹ค.

์ฆ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๊ธฐ ํ•ด์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—…์˜ ๋‹จ์œ„์ด๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ํŠธ๋žœ์žญ์…˜์˜ ์„ฑ์งˆ์ด ์œ„์—์„œ ๋งํ•œ ์—ฌ๋Ÿฌ ๋ฌธ์ œ์ƒํ™ฉ๋“ค์„ ๋ฐฉ์ง€ํ•ด์ค€๋‹ค.

 

ํŠธ๋žœ์žญ์…˜์˜ ์„ฑ์งˆ

์œ„์—์„œ ๋งํ•œ 4๊ฐ€์ง€ ๋ฌธ์ œ๋“ค์€ ํŠธ๋žœ์žญ์…˜์˜ ์„ฑ์งˆ์— ์ •์˜๋˜์–ด ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ์„ฑ์งˆ๋“ค์„ ACID ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

A : Atomicity (์›์ž์„ฑ)

C : Consistency (์ผ๊ด€์„ฑ)

I : Isolation (๋…๋ฆฝ์„ฑ)

D : Durability (์ง€์†์„ฑ)

 

์•ž์„  ์‚ฌ๋ก€๋“ค์„ ํ•˜๋‚˜์”ฉ ๋ณด๋ฉด์„œ ๊ฐ๊ฐ ์–ด๋–ค ์„ฑ์งˆ๊ณผ ๋Œ€๋น„๋˜๋Š” ์ง€ ์‚ดํŽด๋ณด์ž !

 

๋งŒ์•ฝ, ์†ก๊ธˆ ๋„์ค‘ A์˜ ๊ณ„์ขŒ์—๋Š” ๋ˆ์ด ๋น ์กŒ๋Š”๋ฐ B์˜ ๊ณ„์ขŒ์— ๋ˆ์ด ๊ทธ๋Œ€๋กœ๋ผ๋ฉด?

์ด ์˜ˆ์‹œ๋Š” ์›์ž์„ฑ(Atomicity)์„ ์ง€ํ‚ค์ง€ ๋ชปํ•œ ๊ฒƒ์ด๋‹ค.

 

ํ•˜๋‚˜์˜ ์ž‘์—…์ด ์„ฑ๊ณตํ•˜๊ณ  ํ•˜๋‚˜์˜ ์ž‘์—…์ด ์‹คํŒจํ–ˆ๋Š”๋ฐ ๊ฒฐ๊ณผ๊ฐ€ DB์—๏ฟผ ๋ฐ˜์˜๋œ ๊ฒƒ์ด๋‹ค.

์›์ž์„ฑ์€ ์ง€ํ‚จ๋‹ค๋Š” ๊ฒƒ์€ ๋ชจ๋“  ์ž‘์—…์ด ๋ชจ๋‘ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ๋ชจ๋‘ ์‹คํŒจํ•ด์•ผํ•œ๋‹ค.

 

๋งŒ์•ฝ, A์˜ ๊ณ„์ขŒ์— ๋ˆ์ด ๋ถ€์กฑํ•œ ์ƒํƒœ์ธ๋ฐ ์†ก๊ธˆ์ด ๋˜์—ˆ๋‹ค๋ฉด?

์ด ์˜ˆ์‹œ๋Š” ์ผ๊ด€์„ฑ(Consistency)์„ ์ง€ํ‚ค์ง€ ๋ชปํ•œ ๊ฒƒ์ด๋‹ค.

 

DB์—๋Š” ์ž”์•ก์€ ๋งˆ์ด๋„ˆ์Šค๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค๋Š” ์ œ์•ฝ์ด ์žˆ์Œ์—๋„ ์ด๋ฅผ ์–ด๊ธด ์ฑ„ ์†ก๊ธˆ์„ ์ง„ํ–‰ํ•œ ๊ฒƒ์ด๋‹ค.

์ผ๊ด€์„ฑ์„ ์ง€ํ‚จ๋‹ค๋Š” ๊ฒƒ์€ ํŠธ๋žœ์žญ์…˜ ์ด์ „,์ดํ›„์—๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ œ์•ฝ์ด๋‚˜ ๊ทœ์น™์„ ๋งŒ์กฑํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

๋งŒ์•ฝ, ์†ก๊ธˆ ๋„์ค‘ ์นœ๊ตฌC๊ฐ€ ์†ก๊ธˆ์„ ๋ณด๋‚ด์„œ ์„œ๋กœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์—‡๊ฐˆ๋ฆฐ๋‹ค๋ฉด?

 

์ด ์˜ˆ์‹œ๋Š” ๋…๋ฆฝ์„ฑ(Isolation)์„ ์ง€ํ‚ค์ง€ ๋ชปํ•œ ๊ฒƒ์ด๋‹ค.

 

์นœ๊ตฌC์™€์˜ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋จ์œผ๋กœ์จ ์˜ํ–ฅ์„ ๋ฏธ์นœ๊ฒƒ์ด๋‹ค.

(์นœ๊ตฌC๊ฐ€ ๋ณด๋‚ธ ๋ˆ์— ๋”ํ•ด์ง€์ง€ ์•Š๊ณ  ๊ธฐ์กด ๊ธˆ์•ก์— ๋”ํ•ด์ง์œผ๋กœ์จ ์ž”์•ก์ด ๊ทธ๋Œ€๋กœ)

๋…๋ฆฝ์„ฑ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŠธ๋žœ์žญ์…˜๋“ค์ด ๋™์‹œ์— ์‹คํ–‰๋  ๋•Œ์—๋„ ํ˜ผ์ž ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ด์•ผํ•œ๋‹ค.

 

๋งŒ์•ฝ, ์†ก๊ธˆ์„ ์ž˜ ๋งˆ์ณค์Œ์—๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚ ์•„๊ฐ€ ๋ฒ„๋ฆฐ๋‹ค๋ฉด..?

์ด ์˜ˆ์‹œ๋Š” ์ง€์†์„ฑ(Durability)์„ ์ง€ํ‚ค์ง€ ๋ชปํ•œ๊ฒƒ์ด๋‹ค.

 

๋‹น์—ฐํ•œ ๋ง์ด์ง€๋งŒ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ์˜๊ตฌ์ ์œผ๋กœ DB์— ๋‚จ์•„์žˆ์–ด์•ผํ•œ๋‹ค.

์˜๊ตฌ์„ฑ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” DB์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์ปค๋ฐ‹๋œ ํŠธ๋žœ์žญ์…˜์ด DB์— ๋‚จ์•„์žˆ์–ด์•ผํ•œ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ํŠธ๋žœ์žญ์…˜์˜ ACID ์„ฑ์งˆ์ด๋‹ค.

 

์ด๋ ‡๋“ฏ์ด ํŠธ๋žœ์žญ์…˜์€ ACID ์„ฑ์งˆ์„ ์œ ์ง€ํ•ด์คŒ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ์ง€์ผœ์ค€๋‹ค.

 

๐Ÿง ์ •ํ•ฉ์„ฑ์ด ๋ญ์ง€?

๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋กœ ๋ชจ์ˆœ ์—†์ด ์ผ๊ด€๋˜๊ฒŒ ์ผ์น˜ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค !

๋ฏฟ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•ด์„  ์ •ํ•ฉ์„ฑ์ด ๋ณด์žฅ๋˜์–ด์•ผํ•œ๋‹ค.

 

์ง€๊ธˆ๊นŒ์ง€ ํŠธ๋žœ์žญ์…˜์˜ ์—ญํ• ๊ณผ ACID ์„ฑ์งˆ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค !

์ด์ œ ํŠธ๋žœ์žญ์…˜์ด ๋ญ”์ง€ ๊ฐ์ด ์˜ค๋Š”๊ฐ€?

ํŠธ๋žœ์žญ์…˜์€ ์•Œ๊ฒ ๋Š”๋ฐ ... ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ ๋ญ์ง€?

ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ์ง€์ผœ์ค„ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์žฅ์น˜์ด๋‹ค.

ํ•˜์ง€๋งŒ ํŠธ๋žœ์žญ์…˜๋ผ๋ฆฌ ์ ‘์ด‰ํ•˜๋‹ค ๋ณด๋ฉด ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋Œ€ํ‘œ์ ์œผ๋กœ ํฌ๊ฒŒ 3๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ

 

1. dirty read

2. non repeatable read

3. phantom read

 

ํ•˜๋‚˜ํ•˜๋‚˜ ์•Œ์•„๋ณด์ž !

๊ณ ๋ คํ•ด๋ด์•ผ ํ•  ๋ฌธ์ œ์ ๋“ค

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ 3๊ฐ€์ง€์˜ ์ด์ƒ ํ˜„์ƒ๋“ค์„ ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณด๋ฉด์„œ ๊ฒฉ๋ฆฌ๋ ˆ๋ฒจ์ด ์™œ ํ•„์š”ํ•œ ์ง€ ์ƒ๊ฐํ•ด๋ณด์ž !

์•„๋ž˜์—์„œ ์„ค๋ช…ํ•˜๋Š” ์ƒํ™ฉ๋“ค์€ ๋ชจ๋‘ ํŠธ๋žœ์žญ์…˜ A,B๊ฐ€ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

dirty read

์‰ฝ๊ฒŒ ๋งํ•ด์„œ , ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ณ€ํ™”๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด๋‹ค.

ํŠธ๋žœ์žญ์…˜ A์™€ B๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณด์ž

ํŠธ๋žœ์žญ์…˜ A๋Š” x๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๊ณ  , ํŠธ๋žœ์žญ์…˜ B๋Š” y๋ฅผ ๋ณ€ํ™”์‹œํ‚จ๋‹ค.

์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ?

๋ญ”๊ฐ€ ์ด์ƒํ•˜์ง€ ์•Š์€๊ฐ€?

x์— ๋”ํ•œ y์˜ ๊ฐ’ 10์€ ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’์ด๋‹ค.

์ฆ‰, ์œ„์—์„œ ๋งํ–ˆ๋‹ค์‹œํ”ผ ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ณ€ํ™”๋ฅผ ์ฝ์–ด์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๊ฒƒ์ด๋‹ค.

non repeatable read

๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ–ˆ์„ ๋•Œ ๊ฐ’์ด ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค.

ํŠธ๋žœ์žญ์…˜ A๊ฐ€ x์˜ ๊ฐ’์„ ์ฒ˜์Œ ์ฝ์—ˆ์„ ๋•Œ๋Š” 50์ด์—ˆ๋‹ค.

๊ทธ ์‚ฌ์ด์— ํŠธ๋žœ์žญ์…˜ B๊ฐ€ x์˜ ๊ฐ’์„ 10์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๊ณ  , ๋‹ค์‹œ ํŠธ๋žœ์žญ์…˜ A๊ฐ€ x๋ฅผ ์ฝ์—ˆ์„ ๋•Œ๋Š” x์˜ ๊ฐ’์€ 10์ด ๋‚˜์˜จ๋‹ค.

๊ฐ’์€ x๋ผ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์„ ์กฐํšŒํ–ˆ์ง€๋งŒ ์กฐํšŒํ• ๋•Œ๋งˆ๋‹ค ๊ฐ’์ด ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Š” ๊ณง isolation ๊ด€์ ์—์„œ ๋ฐ”๋žŒ์งํ•˜์ง€ ๋ชปํ•˜๋‹ค.

 

๐Ÿงisolation ์œ„์—์„œ ๋ฐฐ์› ๋Š”๋ฐ .. !

์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜๋“ค์ด ๋™์‹œ์— ์ˆ˜ํ–‰๋  ๋•Œ, ๊ฐ ํŠธ๋žœ์ ์…˜์€ ๊ณ ๋ฆฝ(๊ฒฉ๋ฆฌ)๋˜์–ด ์žˆ์–ด ์—ฐ์†์œผ๋กœ ์‹คํ–‰๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

phantom read

์—†๋˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค.

์ด ์ƒํ™ฉ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋˜‘๊ฐ™์€ ์กฐ๊ฑด์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ๋Š” ๋ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜จ๋‹ค.

์ด ์—ญ์‹œ isolation ์›์น™์— ์œ„๋ฐฐ๋œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ์†Œ๊ฐœํ•œ 3๊ฐ€์ง€๊ฐ€ ๋Œ€ํ‘œ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ œ์ ๋“ค์ด๋‹ค.

 

๐Ÿง ์•„ ๊ทธ๋Ÿผ ํ•ด๊ฒฐ์ฑ…์€ ๊ฐ„๋‹จํ•˜๋„ค์š” ! ๋‹ค ๋ง‰์•„๋ฒ„๋ฆฌ๋ฉด ๋˜๋Š” ๊ฑฐ์ฃ ?

 

๋ฌผ๋ก  ๊ทน๋„์˜ ์•ˆ์ •์ ์ธ ํ™˜๊ฒฝ์„ ์œ„ํ•ด์„œ๋ผ๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ด๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค.

์ฝ”๋กœ๋‚˜ ๊ฑฐ๋ฆฌ๋‘๊ธฐ ๋‹จ๊ณ„๋ฅผ ๋– ์˜ฌ๋ ค๋ณด์ž

 

์‚ฌ์‹ค ์ฝ”๋กœ๋‚˜ ํ™•์ง„์ž๊ฐ€ ์•ˆ๋‚˜์˜ค๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์–ด๋–ป๊ฒŒ ๋ณด๋ฉด ๋งค์šฐ ๊ฐ„๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒํ•˜๋ฉด ์ฝ”๋กœ๋‚˜ ํ™•์ง„์ž๋Š” ์•ˆ๋‚˜์™”์„ ๊ฒƒ์ด๋‹ค.

 

 

๊ทผ๋ฐ ํ˜„์‹ค์€ ๋‹ค๋ฅด๋‹ค.

๊ฑฐ๋ฆฌ๋‘๊ธฐ ๋‹จ๊ณ„์— ๋”ฐ๋ผ์„œ ํ—ˆ์šฉ๋˜๋Š” ๊ฒƒ์ด ์žˆ๊ณ  ๊ธˆ์ง€๋˜๋Š” ๊ฒƒ๋“ค์„ ์ •ํ•ด๋†“์•˜๋‹ค.

 

์™œ์ผ๊นŒ?

๋„ˆ๋ฌด๋‚˜ ๋‹น์—ฐํ•œ ์–˜๊ธฐ์ด์ง€๋งŒ, ๋ชจ๋“  ๊ฒƒ์„ ๊ธˆ์ง€์‹œ์ผœ ๋ฒ„๋ฆฌ๋ฉด ์‚ฌํšŒ๋Š” ๋Œ์•„๊ฐ€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ž˜์„œ ๋‹จ๊ณ„์— ๋”ฐ๋ผ ์ค€์ˆ˜์‚ฌํ•ญ๋“ค์„ ์กฐ์ •ํ•จ์œผ๋กœ์จ ๊ด€๋ฆฌํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค.

 

ํŠธ๋žœ์žญ์…˜์—๋„ ๋น„์Šทํ•œ ๊ฐœ๋…์ด ์ ์šฉ๋œ๋‹ค.

๊ฒฉ๋ฆฌ๋ ˆ๋ฒจ์ด ์˜ฌ๋ผ๊ฐˆ ์ˆ˜๋ก ์•ˆ์ •์„ฑ์€ ๋†’์•„์ง€์ง€๋งŒ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์ €ํ•˜๋œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ •ํ•ด๋†“์€ ํ‘œ์ค€ SQL ๊ธฐ์ค€์„ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

SQL ํ‘œ์ค€ ๊ฒฉ๋ฆฌ ๋ ˆ๋ฒจ

SQL ํ‘œ์ค€์—์„œ๋Š” ์œ„์—์„œ ๋งํ•œ ๋ฌธ์ œ๋“ค์„ ์–ด๋””๊นŒ์ง€ ํ—ˆ์šฉํ•  ์ง€ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒฉ๋ฆฌ๋ ˆ๋ฒจ์„ ์ง€์ •ํ•˜์˜€๋‹ค.

 

Read uncommitted

Read uncommitted ๋ ˆ๋ฒจ์€ ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ณ€ํ™”๋„ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž, ํŠธ๋žœ์žญ์…˜1์ด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ์ปค๋ฐ‹์„ ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์ด์ง€๋งŒ ํŠธ๋žœ์žญ์…˜2๋Š” ์ด๊ฒƒ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์‹ค์ƒ ๊ฒฉ๋ฆฌ๊ฐ€ ์•„์˜ˆ ์—†๋Š” ๊ฑฐ๋‚˜ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋ฏ€๋กœ ์ตœ์†Œํ•œ Read committed ์ด์ƒ ๋ ˆ๋ฒจ์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.

 

Read uncommitted ๋ ˆ๋ฒจ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ 

- ์ด ๋ ˆ๋ฒจ์—์„œ๋Š” ๋งŽ์€ ๋ฌธ์ œ๋“ค์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋Œ€ํ‘œ์ ์œผ๋กœ Dirty Read ์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

์œ„์—์„œ dirty read๋Š” ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ณ€ํ™”๋ฅผ ์ฝ์Œ์œผ๋กœ์จ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ œ๋ผ๊ณ  ํ•˜์˜€๋Š”๋ฐ Read uncommitted ์—์„œ ๊ทธ ๋ฌธ์ œ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ฐœ์ƒํ•œ๋‹ค.

 

 

ํŠธ๋žœ์žญ์…˜ B๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ถ€ํ„ฐ Y๋ฅผ ์ฝ๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

ํ•˜์ง€๋งŒ B๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๋„์ค‘ ํŠธ๋žœ์žญ์…˜A๊ฐ€ Y์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์˜€๊ณ  B๋Š” ๊ฒฉ๋ฆฌ๋ ˆ๋ฒจ ํŠน์„ฑ์ƒ ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

 

ํ•˜์ง€๋งŒ A๊ฐ€ ๋ณ€๊ฒฝํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ปค๋ฐ‹๋˜์ง€ ์•Š๊ณ  ๋กค๋ฐฑ๋œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

ํŠธ๋žœ์žญ์…˜B๊ฐ€ ์ฝ์€ Y์˜ ๋ฐ์ดํ„ฐ๋Š” ๋” ์ด์ƒ ์œ ํšจํ•œ ๊ฐ’์ด ์•„๋‹ˆ๊ฒŒ ๋œ๋‹ค.

์ด ํ˜„์ƒ์„ dirty read ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์ฆ‰, ํŠธ๋žœ์žญ์…˜์—์„œ ์ฒ˜๋ฆฌํ•œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ํ˜„์ƒ์ด๋‹ค.

 

Read committed

Read committed ๋‹จ๊ณ„์—์„œ๋Š” ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ๊ธฐ ๋•Œ๋ฌธ์— dirty read ์™€ ๊ฐ™์€ ํ˜„์ƒ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

์–ด๋–ป๊ฒŒ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์„๊นŒ?

 

๋ฐ”๋กœ undo ์˜์—ญ์„ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์คŒ์œผ๋กœ์จ ๋ฐฑ์—…๋œ ๋ฐ์ดํ„ฐ๋งŒ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฐ‘์— ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ํŠธ๋žœ์žญ์…˜1์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ํ…Œ์ด๋ธ”์„ ๋ฐฑ์—…ํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ํ…Œ์ด๋ธ”์— ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜์˜๋œ๋‹ค.

ํŠธ๋žœ์žญ์…˜2์—์„œ๋Š” undo ์˜์—ญ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์— ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค !

 

 

Read committed ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ 

- ์ด ๋ ˆ๋ฒจ์—์„œ๋Š” non repeatable read ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๋ฌด์—‡์ด ๋ฌธ์ œ์ผ๊นŒ? ๋‹ค์‹œ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž

 

ํŠธ๋žœ์žญ์…˜B๊ฐ€ Y๋ฅผ ๋‘๋ฒˆ ์กฐํšŒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž

์ฒซ๋ฒˆ์งธ๋กœ ์กฐํšŒํ–ˆ์„ ๋•Œ๋Š” Y๊ฐ€ 50์ด ๋‚˜์™”์ง€๋งŒ ๋‘๋ฒˆ์งธ๋กœ ์กฐํšŒํ–ˆ์„ ๋• 70์ด ๋‚˜์™”๋‹ค.

์–ผํ• ์ƒ๊ฐํ•˜๋ฉด ํฌ๊ฒŒ ๋ฌธ์ œ๋ ๊ฒŒ ์—†์–ด๋ณด์ด๋Š” ๋ฐ , ์ด๋Š” ACID ์†์„ฑ ์ค‘ ๋…๋ฆฝ์„ฑ์— ์–ด๊ธ‹๋‚œ๋‹ค.

 

๐Ÿง ๋…๋ฆฝ์„ฑ ๋ฒŒ์จ ๋ช‡๋ฒˆ์งธ์•ผ ..

๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜๋“ค์ด ์ˆ˜ํ–‰๋  ๋•Œ, ๊ฐ ํŠธ๋žœ์ ์…˜์€ ๊ณ ๋ฆฝ(๊ฒฉ๋ฆฌ)๋˜์–ด ์žˆ์–ด ์—ฐ์†์œผ๋กœ ์‹คํ–‰๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

Repeatable read

์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ํŠน์ • ํ–‰์„ ์กฐํšŒํ•  ๋•Œ ๋งˆ๋‹ค ํ•ญ์ƒ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜์˜ค๋„๋ก ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

Repeatable read ์—์„œ๋Š” ์ด๋ฅผ ํŠธ๋žœ์žญ์…˜ ID ๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋ถ€์—ฌ๋œ ํŠธ๋žœ์žญ์…˜ ID๋ณด๋‹ค ์ž‘์€ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ์—์„œ ๋ณ€๊ฒฝํ•œ ๊ฒƒ๋งŒ ์ฝ๊ฒŒ ๋œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  undo ๋กœ๊ทธ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— DB์—”์ง„์—์„œ๋Š” ๋ถˆํ•„์š”ํ•œ undo ๋กœ๊ทธ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‚ญ์ œํ•œ๋‹ค.

 

Repeable read์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ 

- ์ด ๋ ˆ๋ฒจ์—์„œ๋Š” phantom read ๋ผ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž

 

๋งจ์ฒ˜์Œ ๋ฐ์ดํ„ฐํ–‰์„ ์กฐํšŒํ–ˆ์„ ๋•Œ 1๊ฐœ๊ฐ€ ๋‚˜์™”์ง€๋งŒ ๋‚˜์ค‘์— ํ•œ๋ฒˆ ๋” ์กฐํšŒํ–ˆ์„ ๋•Œ ํ•˜๋‚˜๊ฐ€ ์ถ”๊ฐ€๋œ 2๊ฐ€ ๋‚˜์™”๋‹ค.

 

์ด๋Š” undo ํ…Œ์ด๋ธ”์— ์“ฐ๊ธฐ ์ž ๊ธˆ์„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š”๋ฐ ๊ฒฐ๊ตญ ํ˜„์žฌ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค.

(innoDB์—์„œ๋Š” ํŒฌํ…€ ๋ฆฌ๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค!)

 

Serializable

ํŠน์ • ํŠธ๋žœ์žญ์…˜์ด ์‚ฌ์šฉ์ค‘์ด๋ฉด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์€ ์ผ์ฒด ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

๋ฐ์ดํ„ฐ์˜ ์•ˆ์ •์„ฑ(์ •ํ•ฉ์„ฑ)์€ ๋†’์œผ๋‚˜ ์ฒ˜๋ฆฌ๋Ÿ‰์€ ๋–จ์–ด์ง„๋‹ค.

 

๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ 

- ์—†์Œ

 

๋‹ค์‹œ ํ‘œ๋กœ ์ •๋ฆฌํ•ด๋ณด์ž

์ด์ฒ˜๋Ÿผ ๊ฒฉ๋ฆฌ ๋‹จ๊ณ„์— ๋”ฐ๋ผ ํ—ˆ์šฉํ•˜๋Š” ์˜ค๋ฅ˜๋“ค์ด ์ •ํ•ด์ ธ์žˆ๋‹ค.

๊ฐ๊ฐ์˜ ์šฉ๋„์— ๋งž๊ฒŒ ์ ์ ˆํ•˜๊ฒŒ ๊ฒฉ๋ฆฌ ๋ ˆ๋ฒจ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

 

๊ฒฐ๋ก 

๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ ํŠธ๋žœ์žญ์…˜๋ผ๋ฆฌ ๋™์‹œ์— ์‹คํ–‰๋˜๋‹ค ๋ณด๋ฉด ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋“ค์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฐ

SQL ํ‘œ์ค€์—์„œ ์ด๋ฅผ ์–ด๋””๊นŒ์ง€ ํ—ˆ์šฉํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๊ฒฉ๋ฆฌ ๋‹จ๊ณ„๋ฅผ ์ง€์ •ํ•ด๋†“์•˜๋‹ค.

 

๊ฐ์ž ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๊ฒฉ๋ฆฌ ๋‹จ๊ณ„๋ฅผ ์„ ํƒํ•ด์•ผํ•œ๋‹ค.

 

์ฐธ๊ณ  ์ž๋ฃŒ

[MySQL] - ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation level)

 

[MySQL] - ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation level)

๐Ÿ“Ž ๊ธ€๋˜ 6๊ธฐ ํฌ์ŠคํŒ… 1. ๋ฏธ์น˜๋„๋ก ๋”์› ๋˜ 7์›”์˜ ํšŒ๊ณ  2. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•  ๋•Œ์˜ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ 3. Spring AOP - (1) ํ”„๋ก์‹œ ํŒจํ„ด, ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด 4. [MySQL] - ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation level) 5

zzang9ha.tistory.com

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

 

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

Transaction Isolation Level ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœ ์ค‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋„์ž…ํ•˜๋ฉด ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค. ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ACID ์„ฑ์งˆ ์ค‘ Isolation…

tecoble.techcourse.co.kr

[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค] ํŠธ๋žœ์žญ์…˜์˜ ACID ์„ฑ์งˆ - ํ•˜๋‚˜๋ชฌ

 

[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค] ํŠธ๋žœ์žญ์…˜์˜ ACID ์„ฑ์งˆ - ํ•˜๋‚˜๋ชฌ

ํŠธ๋žœ์žญ์…˜์ด๋ž€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์—…์„ ํ•˜๋‚˜๋กœ ๋ฌถ์€ ์‹คํ–‰ ์œ ๋‹›์„ ๋งํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜์€ ACID๋ผ๋Š” ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ACID๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์—์„œ ์ผ์–ด๋‚˜๋Š” ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜(transaction)์˜ ์•ˆ

hanamon.kr

ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(isolation Level)์ด๋ž€?

 

ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(isolation Level)์ด๋ž€?

 

nesoy.github.io

https://www.youtube.com/watch?v=bLLarZTrebU&t=397s

https://www.youtube.com/watch?v=sLJ8ypeHGlM&t=144s

 

์ฃผ์š” ๋””์ž์ธ ํŒจํ„ด 13๊ฐ€์ง€

1. ์ƒ์„ฑ ํŒจํ„ด

- ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

- ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด

- ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด

 

2. ํ–‰๋™ ํŒจํ„ด

- ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด

- ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

- ์ƒํƒœ ํŒจํ„ด 

- ๋ฐ˜๋ณต์ž ํŒจํ„ด

- ์ „๋žต ํŒจํ„ด

- ์˜ต์ €๋ฒ„ ํŒจํ„ด

 

3. ๊ตฌ์กฐ ํŒจํ„ด

- ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด

- ํ”„๋ก์‹œ ํŒจํ„ด

- ์ปดํฌ์ง€ํŠธ ํŒจํ„ด

- ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด

- ํผ์‚ฌ๋“œ ํŒจํ„ด

 


 

1. ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด๋ž€?

- ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๊ตฌ์ƒ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ์ฒด๋“ค์˜ ์กฐํ•ฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด

- ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค๋Š” ์„œ๋กœ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ์ด๋‹ค.

 

*์„œ๋กœ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ด€๊ณ„์˜ ์˜ˆ์‹œ 

- ์ปดํ“จํ„ฐ ๋ธŒ๋žœ๋“œ : ์‚ผ์„ฑ , LG

- ์šด์˜์ฒด์ œ์— ๋”ฐ๋ฅธ GUI : ๋งฅ , ๋ฆฌ๋ˆ…์Šค , ์œˆ๋„์šฐ

 

์‚ผ์„ฑ ์ปดํ“จํ„ฐ ๋ธŒ๋žœ๋“œ ๊ณต์žฅ์—์„œ๋Š” ์‚ผ์„ฑ ์ปดํ“จํ„ฐ ๋ถ€ํ’ˆ์„ ์ฐ์–ด๋‚ด๊ณ ,

๋งฅ ํ™˜๊ฒฝ์—์„œ๋Š” ๋งฅ GUI์—์„œ ๋งฅ ํ™˜๊ฒฝ์—์„œ์˜ GUI๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

 

์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ๋ธŒ๋žœ๋“œ , ์šด์˜์ฒด์ œ์˜ ์ข…๋ฅ˜์— ์ƒ๊ด€์—†์ด ๊ทธ๊ฒƒ์˜ ๊ธฐ๋Šฅ์€ ๋ชจ๋‘ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

ํ–ฅํ›„ ์ด "๊ธฐ๋Šฅ"์€ ์ถ”์ƒํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฌถ์–ด์ง„๋‹ค.

 

2. ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด?

 

๋จ„์•ฝ ์œˆ๋„์šฐ ํ™˜๊ฒฝ์—์„œ GUI ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž

 

ํด๋ฆญ๊ณผ ์Šคํฌ๋กค ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณผ๊ฒƒ์ด๋‹ค.

 

Click click = WinGui.runClick();
Scroll scroll = WinGui.runScroll();
// ์œˆ๋„์šฐ ํด๋ฆญ , ์Šคํฌ๋กค ๊ตฌํ˜„์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
click.click();
scroll.scroll();
// ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ ์‹คํ–‰

 

ํ•˜์ง€๋งŒ ์ด์ œ ์œˆ๋„์šฐ๊ฐ€ ์•„๋‹Œ ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋Šฅ๊นŒ์ง€ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ?

 

Click click = LinuxGui.runClick();
Scroll scroll = LinuxGui.runScroll();
// ์œˆ๋„์šฐ ํด๋ฆญ , ์Šคํฌ๋กค ๊ตฌํ˜„์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
click.click();
scroll.scroll();
// ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ ์‹คํ–‰

 

์ด์ฒ˜๋Ÿผ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ˆ˜์ •ํ•˜์—ฌ์„œ ์ฝ”๋“œ์— ๋ฐ˜์˜ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

 

์ฆ‰, ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ์ฝ”๋“œ์— ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ด๊ฒƒ์„ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฐ”๊ฟ”๋ณผ๋ ค๊ณ  ํ•œ๋‹ค.

GuiFactory gui = new WinGuiFac();
Click click = gui.runClick();
Scroll scroll = gui.runScroll();    

click.click();
scroll.scroll();

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŒฉํ† ๋ฆฌ ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ›์•„์„œ ํ•ด๋‹น ํŒฉํ† ๋ฆฌ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜์˜€๋‹ค.

 

๊ทธ๋Ÿผ ๋‹ค์‹œ ์œˆ๋„์šฐ ๊ธฐ๋Šฅ์„ ์“ฐ๋ ค๋ฉด?

 

GuiFactory gui = new WinGuiFac();
// ์—ฌ๊ธฐ๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋จ
Click click = gui.runClick();
Scroll scroll = gui.runScroll();    

click.click();
scroll.scroll();

 

ํŒฉํ† ๋ฆฌ ํ•˜๋‚˜๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค !

 

๊ธฐ์กด ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜๋˜ ๊ฒƒ์— ๋น„ํ•˜๋ฉด ํ›จ์”ฌ ๊ฐœ์„ ๋˜์—ˆ๋‹ค.

 

3. ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

 

์œ„์—์„œ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๊ฐ€ ์–ด๋–ค ๊ฒƒ์ด ๋Œ€๋žต ์•Œ์•˜๋‹ค๋ฉด , ์ด์ œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ ?

 

์ถœ์ฒ˜ :&nbsp;https://gmlwjd9405.github.io/2018/08/08/abstract-factory-pattern.html

 

๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

AbstractFactory : ๋ชจ๋“  ํŒฉํ† ๋ฆฌ ๊ตฌํ˜„์ฒด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค (ํ˜น์€ ์ถ”์ƒ ํด๋ž˜์Šค)์ด๋‹ค.

 

ConcreteFactory : AbstractFactory์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•จ์œผ๋กœ์จ ์ œํ’ˆ/๊ธฐ๋Šฅ์„ ์ƒ์‚ฐํ•œ๋‹ค.  

                              ์—ฌ๊ธฐ์„œ ์‚ผ์„ฑ/LG , ๋ฆฌ๋ˆ…์Šค/์œˆ๋„์šฐ ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ํƒ€์ž…์œผ๋กœ ๋‚˜๋‰จ

 

ConcreteProduct : ํŒฉํ† ๋ฆฌ์—์„œ ์ƒ์„ฑ๋˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ œํ’ˆ/๊ธฐ๋Šฅ์ด๋‹ค.

                               AbstractProduct๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ๋‹ค.

 

AbstractProduct : ConcereteProduct์˜ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. 

 

๊ตฌ์ฒด์ ์ธ ์ฝ”๋“œ๋“ค์„ ์‚ดํŽด๋ณด์ž

 

AbstractFactory

public interface GuiFactory {
    public Click runClick();
    public Scroll runScroll();
}

ConcreteFactory 

public class WindowGuiFac implements GuiFactory {
    @Override
    public Click runClick() {
        return new WindowClick();
    }

    @Override
    public Scroll runScroll() {
        return new WindowScroll();
    }
}

 

AbstractProduct 

public class WindowClick implements Click {
    @Override
    public void click() {
        System.out.println("์œˆ๋„์šฐ ํ™˜๊ฒฝ์—์„œ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.");
    }
}
public class WindowScroll implements Scroll {
    @Override
    public void scroll() {
        System.out.println("์œˆ๋„์šฐ ํ™˜๊ฒฝ์—์„œ ์Šคํฌ๋กคํ•ฉ๋‹ˆ๋‹ค.");
    }
}

ConcreteProduct

public class WindowGuiFac implements GuiFactory {
    @Override
    public Click runClick() {
        return new WindowClick();
    }

    @Override
    public Scroll runScroll() {
        return new WindowScroll();
    }
}

 

๊ตฌํ˜„์€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š” 

 

public class main {
    public static void main(String[] args) {
        GuiFactory gui = new LinuxGuiFac();
        Click click = gui.runClick();
        Scroll scroll = gui.runScroll();

        click.click();
        scroll.scroll();
    }
}

์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•ด์ง„๋‹ค.

 

์š”์•ฝ์„ ํ•˜์ž๋ฉด

 

ํด๋ผ์ด์–ธํŠธ์—์„œ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ(Abstract Factory)์— ํŒฉํ† ๋ฆฌ(Concrete Factory) ์ฃผ์ž…

-> ํŒฉํ† ๋ฆฌ์—์„œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ (Concrete Product)

-> ์ถ”์ƒ ๊ธฐ๋Šฅ ์ธํ„ฐํŽ˜์ด์Šค(Abstract Product)๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•œ ๊ตฌํ˜„ ํด๋ž˜์Šค(Concrete Product)์—์„œ ๊ธฐ๋Šฅ ๋ฐ˜ํ™˜ ์ˆœ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

 

4. ์ถ”์ƒ ํŒฉํ† ๋ฆฌ์˜ ์žฅ๋‹จ์   

 

์žฅ์  : 

1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.

- ํŒฉํ† ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •๊ณผ ์ฑ…์ž„์„ ์บก์Аํ™” ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

2. ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝ ์‹œ์— ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ ๋‹ค.

 

๋‹จ์  :

1. ์ฝ”๋“œ๊ฐ€ ํ•„์š” ์ด์ƒ์œผ๋กœ ๋ณต์žกํ•ด ์งˆ ์ˆ˜ ์žˆ๋‹ค.

2. ์ƒˆ๋กœ์šด ๋ฉ”์†Œ๋“œ(๊ธฐ๋Šฅ,์ œํ’ˆ ๋“ฑ) ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒŒ ์–ด๋ ต๋‹ค.

     - ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด Abstract Product๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š”๋ฐ ์ด๋Ÿฌ๋ฉด ๋ชจ๋“  ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•œ๋‹ค.

 

5. ๊ฒฐ๋ก 

 

์—ฌ๋Ÿฌ ์ œํ’ˆ์ด๋‚˜ ๊ธฐ๋Šฅ๊ตฐ์ด ์žˆ๊ณ  ๊ทธ๋“ค๋ผ๋ฆฌ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅด๊ฑฐ๋‚˜ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๋ณต์žกํ•ด์ง€๊ฑฐ๋‚˜ ๋‚˜์ค‘์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค.

 

์ฐธ๊ณ ์ž๋ฃŒ

 

https://www.youtube.com/watch?v=qXcxySA-Qes&t=370s 

https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%EC%B6%94%EC%83%81-%ED%8C%A9%ED%86%A0%EB%A6%ACAbstract-Factory-%ED%8C%A8%ED%84%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EC%9E%90

 

๐Ÿ’  ์ถ”์ƒ ํŒฉํ† ๋ฆฌ(Abstract Factory) ํŒจํ„ด - ์™„๋ฒฝ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ

Abstract Factory Pattern ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ์—ฐ๊ด€์„ฑ์ด ์žˆ๋Š” ๊ฐ์ฒด ๊ตฐ์ด ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์„ ๊ฒฝ์šฐ ์ด๋“ค์„ ๋ฌถ์–ด ์ถ”์ƒํ™”ํ•˜๊ณ , ์–ด๋–ค ๊ตฌ์ฒด์ ์ธ ์ƒํ™ฉ์ด ์ฃผ์–ด์ง€๋ฉด ํŒฉํ† ๋ฆฌ ๊ฐ์ฒด์—์„œ ์ง‘ํ•ฉ์œผ๋กœ ๋ฌถ์€ ๊ฐ์ฒด ๊ตฐ์„ ๊ตฌํ˜„ํ™”

inpa.tistory.com

https://gmlwjd9405.github.io/2018/08/08/abstract-factory-pattern.html

 

[Design Pattern] ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด๋ž€ - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

https://refactoring.guru/ko/design-patterns/abstract-factory

 

์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด

/ ๋””์ž์ธ ํŒจํ„ด๋“ค / ์ƒ์„ฑ ํŒจํ„ด ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด ๋‹ค์Œ ์ด๋ฆ„์œผ๋กœ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค: Abstract Factory ์˜๋„ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋Š” ๊ด€๋ จ ๊ฐ์ฒด๋“ค์˜ ๊ตฌ์ƒ ํด๋ž˜์Šค๋“ค์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ๊ด€๋ จ ๊ฐ์ฒด๋“ค์˜ ๋ชจ์Œ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ

refactoring.guru

 

0.์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ๊ฒƒ(stateless)์€ ์–ด๋–ค ์˜๋ฏธ์ผ๊นŒ?

 

๋„คํŠธ์›Œํฌ ๊ด€์ 

 

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์—์„œ  ์ƒํƒœ๋ฅผ ๊ฐ–์ง€ ์•Š๋Š” ๋นˆ.
๋ฌด์ƒํƒœ ์„ธ์…˜ ๋นˆ์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋Š” ๋™์ผํ•˜๋‹ค

 

์Šคํ”„๋ง ๋นˆ ๊ด€์ 

 

- ํŠน์ • ํด๋ผ์ด์–ธํŠธ์— ์˜์กด์ ์ธ ํ•„๋“œ๊ฐ€ ์—†๋‹ค.

- ํŠน์ • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๊ฐ€ ์—†๋‹ค.

- ํด๋ผ์ด์–ธํŠธ๋“ค๋ผ๋ฆฌ ๊ณต์œ ํ•˜๋Š” ํ•„๋“œ๊ฐ€ ์—†๋‹ค.

 

 

1. ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋Š” ๋นˆ๊ณผ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ๋นˆ์˜ ์ฐจ์ด

The non-singleton, prototype scope of bean deployment results in the creation of a new bean instance
every time a request for that specific bean is made. That is, the bean is injected into another bean
or you request it through a getBean() method call on the container. As a rule, use the prototype scope for all stateful beans and the singleton scope for stateless beans.

- ์Šคํ”„๋ง ๊ณต์‹ ๋ฌธ์„œ ๋ฐœ์ทŒ


stateless beans

 

ApplicationContext๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋Š” ๋™์•ˆ ์ƒ์„ฑํ•œ ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™”๋˜๋Š” ๋นˆ

์ผ๋ฐ˜์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค ๋นˆ์—์„œ ์‚ฌ์šฉ

 

stateful beans

 

์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋นˆ

์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ ๊ฐœ์ฒด๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ

 

 

2. ์‹ฑ๊ธ€ํ†ค ๋นˆ์€ thread - safety ํ•œ๊ฐ€?

 

์•„๋‹ˆ๋‹ค.

 

์‹ฑ๊ธ€ํ†ค ๋นˆ์€ ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ๊ธธ๊ธฐ ๋•Œ๋ฌธ์— , ๋งŽ์€ HTTP ์š”์ฒญ ์†์—์„œ ๊ณ„์† ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

๋•Œ๋ฌธ์— ํŠน์ • ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์˜์กด์ ์ด๊ฑฐ๋‚˜ ํด๋ผ์ด์–ธํŠธ๋“ค ๊ฐ„์˜ ๊ณต์œ ๋˜๋Š” ํ”ผ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3. ์™œ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋ฉด ์•ˆ๋˜๋Š”๊ฐ€? (์ฝ”๋“œ ์‹ค์Šต)

 

public class StatefulServiceTest {

@Test
void statefulServiceSingleton() {
ApplicationContext ac = new
AnnotationConfigApplicationContext(TestConfig.class);

StatefulService statefulService1 = ac.getBean("statefulService",
StatefulService.class);

StatefulService statefulService2 = ac.getBean("statefulService",
StatefulService.class);

//ThreadA: A์‚ฌ์šฉ์ž 10000์› ์ฃผ๋ฌธ
statefulService1.order("userA", 10000);

//ThreadB: B์‚ฌ์šฉ์ž 20000์› ์ฃผ๋ฌธ
statefulService2.order("userB", 20000);

//ThreadA: ์‚ฌ์šฉ์žA ์ฃผ๋ฌธ ๊ธˆ์•ก ์กฐํšŒ
int price = statefulService1.getPrice();

//ThreadA: ์‚ฌ์šฉ์žA๋Š” 10000์›์„ ๊ธฐ๋Œ€ํ–ˆ์ง€๋งŒ, ๊ธฐ๋Œ€์™€ ๋‹ค๋ฅด๊ฒŒ 20000์› ์ถœ๋ ฅ
System.out.println("price = " + price);

Assertions.assertThat(statefulService1.getPrice()).isEqualTo(20000);
}

static class TestConfig {

@Bean
public StatefulService statefulService() {

return new StatefulService();

}
}
}

 

5๊ฐ€์ง€ ๊ด€์ ์—์„œ์œผ๋กœ ๋ณด๋Š” stateless์˜ ์žฅ์ 

 

A. ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ

- Bean์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

B. ํ™•์žฅ์„ฑ
- Stateless Bean์€ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค ๊ฐ„์— ๋™๊ธฐํ™” ๋˜๋Š” ๋ณต์ œํ•ด์•ผ ํ•˜๋Š” ๊ณต์œ  ์ƒํƒœ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜ํ‰ ํ™•์žฅ์ด ๋” ์‰ฝ๋‹ค. 

 

C. ๋‹จ์ˆœ์„ฑ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ
- ์ƒํƒœ ๋น„์ €์žฅ ๋นˆ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ดํ•ด, ํ…Œ์ŠคํŠธ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋” ๊ฐ„๋‹จํ•˜๋‹ค.

 

D. ์žฌ์‚ฌ์šฉ์„ฑ
-  ์ƒํƒœ ๋น„์ €์žฅ ๋นˆ์€ ๋‹ค์–‘ํ•œ ์ปจํ…์ŠคํŠธ์™€ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ถฉ๋Œ์„ ์ผ์œผํ‚ค์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ์š”์†Œ์™€     ์Šค๋ ˆ๋“œ ๊ฐ„์—  ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.


E. ํŠธ๋žœ์žญ์…˜ ๋ฌด๊ฒฐ์„ฑ
- Spring์€ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ์ง€์›์„ ์ œ๊ณต. Bean์„ ์ƒํƒœ ๋น„์ €์žฅ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ฉด ์‹คํŒจ ๋˜๋Š” ๋กค๋ฐฑ ์‹œ ๋กค๋ฐฑ ๋˜๋Š” ์ƒํƒœ ์žฌ์„ค์ •์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๊ฐ€ ๋” ์‰ฌ์›Œ์ง„๋‹ค.

 

 

์ฐธ๊ณ ์ž๋ฃŒ

https://docs.spring.io/spring-framework/docs/3.0.0.M3/reference/html/ch04s04.html

 

4.4 Bean scopes

The other scopes, namely request, session, and global session are for use only in web-based applications (and can be used irrespective of which particular web application framework you are using, if indeed any). In the interest of keeping related concepts

docs.spring.io

https://www.javapedia.net/Spring-Beans/1040

 

Spring bean: difference between stateless and stateful beans.

stateless beans: beans that are singleton and are initialized only once. The only state they have is a shared state. These beans are created while the ApplicationContext is being initialized. The SAME bean instance will be returned/injected during the life

www.javapedia.net

https://d-memory.tistory.com/26

 

[์Šคํ”„๋ง] ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹์˜ ์ฃผ์˜์  - ์Šคํ”„๋ง ๋นˆ์€ ํ•ญ์ƒ ๋ฌด์ƒํƒœ(stateless)๋กœ ์„ค๊ณ„ํ•˜์ž

์Šคํ”„๋ง ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„์‹œ ์ฃผ์˜ํ•ด์•ผํ•  ์‚ฌํ•ญ์ด ์žˆ๋‹ค. ์Šคํ”„๋ง ๋นˆ์„ ํ•ญ์ƒ ๋ฌด์ƒํƒœ(Stateless)๋กœ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜๋Š” ํด๋ž˜์Šค๋Š” ๊ณต์œ ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์ „์—ญ ๋ณ€์ˆ˜

d-memory.tistory.com

https://alwayspr.tistory.com/11

 

์Šคํ”„๋ง ๋นˆ์€ Thread-safe ํ• ๊นŒ?

์ดˆ๊ธฐ์— ์Šคํ”„๋ง์„ ๊ณต๋ถ€ํ•  ๋•Œ ์Šคํ”„๋ง ๋นˆ์˜ ๊ธฐ๋ณธ Scope๋Š” ์‹ฑ๊ธ€ํ†ค์ด๊ณ , ์Šคํ”„๋ง ํ™˜๊ฒฝ์€ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ '์™œ ํ•˜๋‚˜์˜ ๊ณต์œ ์ž์›(์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด)์„ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ์—์„œ ๋‹ค๋ฃจ๋Š”๋ฐ ๋ฌธ

alwayspr.tistory.com

http://dolszewski.com/spring/spring-bean-thread-safety-guide/

 

Spring bean thread safety guide | Dev in Web

Are Spring singletons or controllers thread-safe? Which bean scope is safer? How to make any Spring bean thread-safe without affecting performance?

dolszewski.com

 

0. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ž€? or IOC Container

 

- DI ์„ ์ด์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ์—ฌ๋Ÿฌ ๋นˆ(Bean)๋“ค์˜ ์ƒ๋ช…์ฃผ๊ธฐ(Lifecycle)์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„œ๋น„์Šค ์‹คํ–‰ ๋“ฑ์„ ๊ด€๋ฆฌํ•˜๋ฉฐ

  ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋“ค์—๊ฒŒ ๊ธฐ๋Šฅ์„ ์ œ๊ณต

- Bean ์ƒ์„ฑ, ๊ด€๋ฆฌ, ์ œ๊ฑฐ ๋“ฑ์˜ ์—ญํ• ์„ ๋‹ด๋‹น

- BeanFactory์™€ ApplicationContext๋ผ๋Š” 2๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ œ์–ดํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.

 

1. Bean Factory๋ž€?

 

Bean Factory๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์ตœ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ  ๋นˆ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์กฐํšŒํ•œ๋‹ค.

getBean ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋นˆ์„ ์ธ์Šคํ„ด์Šคํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

์Šคํ”„๋ง์—์„œ ๋นˆ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค.

 

- ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์ตœ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค๋‹ค.
- ์Šคํ”„๋ง ๋นˆ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.
- getBean() ์„ ์ œ๊ณตํ•œ๋‹ค.
- IoC์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์— ์ดˆ์ 


2. Application Context ๋ž€?

 

Application Context๋Š” Bean Factory์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ ์ƒ์†ํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค.

 

- BeanFactory ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์ƒ์†๋ฐ›์•„์„œ ์ œ๊ณตํ•œ๋‹ค.
- ์—ฌ๋Ÿฌ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค.

- ๋นˆ์˜ ์ƒ์„ฑ, ๊ด€๊ณ„ ์„ค์ • ๋“ฑ์˜ ์ œ์–ด๋ฅผ ์ด๊ด„ํ•˜๋Š” ๊ฒƒ์— ์ดˆ์ 

 

3. ๊ณตํ†ต์ 

 

- ์ œ๊ณต๋œ Bean ์ •์˜ ๋ฐ ๊ตฌ์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Bean ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌ

- ๋นˆ์˜ ์ƒ์„ฑ , ์ดˆ๊ธฐํ™” ๋ฐ ์†Œ๋ฉธ์„ ํฌํ•จํ•˜์—ฌ ๋นˆ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ์ฒ˜๋ฆฌ

 

4. ์ฐจ์ด์ 


A. ๊ธฐ๋Šฅ์˜ ์ฐจ์ด

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ๋นˆ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๋ฌผ๋ก ์ด๊ณ , ์ˆ˜ ๋งŽ์€ ๋ถ€๊ฐ€๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค.

 

MessageSouce

- ๋ฉ”์‹œ์ง€์†Œ์Šค๋ฅผ ํ™œ์šฉํ•œ ๊ตญ์ œํ™” ๊ธฐ๋Šฅ

EnvinromentalCapable

- ๋กœ์ปฌ, ๊ฐœ๋ฐœ, ์šด์˜๋“ฑ์„ ๊ตฌ๋ถ„ํ•ด์„œ ์ฒ˜๋ฆฌ

ApplicationPublisher

- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฒคํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณต

ResouceLoader

- ํŽธ๋ฆฌํ•œ ๋ฆฌ์†Œ์Šค ์กฐํšŒ ๊ธฐ๋Šฅ ์ œ๊ณต

 

B. ๋นˆ ๋กœ๋”ฉ์‹œ์ ์˜ ์ฐจ์ด

Bean Factory : Lazy Loading 

- ํ•„์š” ์‹œ์— ๋นˆ์„ ๋กœ๋”ฉํ•œ๋‹ค.

 

Application Context : Eager Loading

- ๋Ÿฐํƒ€์ž„ ์‹คํ–‰ ์‹œ์— ๋ชจ๋“  ๋นˆ์„ ๋กœ๋”ฉํ•œ๋‹ค.

 

C. ๊ตฌ์„ฑ์˜ ์ฐจ์ด

BeanFactory๋Š” ์ฃผ๋กœ XML ์„ ํ†ตํ•ด ๊ตฌํ˜„๋œ๋‹ค.

Application Context๋Š” XML ์™ธ์—๋„ ์ž๋ฐ” ์ฝ”๋“œ๋‚˜ ์–ด๋…ธํ…Œ์ด์…˜ ๋“ฑ์œผ๋กœ ์„ค์ •์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

5. ๊ฒฐ๋ก 

 

Normally when building most applications in a J2EE-environment, the best option is to use the ApplicationContext
, since it offers all the features of the BeanFactory and adds on to it in terms of features, while also allowing a more declarative approach to use of some functionality, which is generally desirable. 

- ์Šคํ”„๋ง ๊ณต์‹ ๋ฌธ์„œ

 

ApplicationContext๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ApplicationContext๋Š” BeanFactory์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ๊ธฐ๋Šฅ ์ธก๋ฉด์—์„œ ์ถ”๊ฐ€ํ•˜๊ณ  ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋” ์„ ์–ธ์ ์ธ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ”๋žŒ์งํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. 

 

๋‹ค๋งŒ ApplicationContext์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ ์ธ ์ธก๋ฉด์ด ์ค‘์š”ํ•  ๋•Œ๋Š” Bean Factory๊ฐ€ ์„ ํ˜ธ๋  ์ˆ˜ ์žˆ๋‹ค.

 

์ฐธ๊ณ ์ž๋ฃŒ


https://velog.io/@sangwoo0727/BeanFactory%EC%99%80-Application-Context-%EB%B9%88-%EB%A1%9C%EB%94%A9%EC%8B%9C%EC%A0%90%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

BeanFactory์™€ Application Context ๋นˆ ๋กœ๋”ฉ์‹œ์ ์˜ ์ฐจ์ด

์‹œ์ž‘ํ•˜๋ฉฐ IoC ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ํ•˜๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” DI์˜ ๊ด€์ ์—์„œ๋Š” ๋นˆ ํŒฉํ† ๋ฆฌ๋ผ๊ณ ๋„ ํ•˜๊ณ , ์ด๋Ÿฐ ๋นˆ ํŒฉํ† ๋ฆฌ์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์Šค

velog.io

 

https://www.geeksforgeeks.org/spring-difference-between-beanfactory-and-applicationcontext/

 

Spring - Difference Between BeanFactory and ApplicationContext - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

https://docs.spring.io/spring-framework/docs/1.2.x/reference/beans.html

 

Chapter 3. Beans, BeanFactory and the ApplicationContext

Two of the most fundamental and important packages in Spring are the org.springframework.beans and org.springframework.context packages. Code in these packages provides the basis for Spring's Inversion of Control (alternately called Dependency Injection) f

docs.spring.io

 

์ฃผ์š” ๋””์ž์ธ ํŒจํ„ด 13๊ฐ€์ง€

1. ์ƒ์„ฑ ํŒจํ„ด

- ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

- ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด

- ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด

 

2. ํ–‰๋™ ํŒจํ„ด

- ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด

- ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

- ์ƒํƒœ ํŒจํ„ด 

- ๋ฐ˜๋ณต์ž ํŒจํ„ด

- ์ „๋žต ํŒจํ„ด

- ์˜ต์ €๋ฒ„ ํŒจํ„ด

 

3. ๊ตฌ์กฐ ํŒจํ„ด

- ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด

- ํ”„๋ก์‹œ ํŒจํ„ด

- ์ปดํฌ์ง€ํŠธ ํŒจํ„ด

- ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด

- ํผ์‚ฌ๋“œ ํŒจํ„ด

 


์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋ž€?

- ๊ฐ์ฒด๊ฐ€ ์˜ค์ง ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

 

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์‚ฌ๋ฌด์‹ค์— ํ”„๋ฆฐํŠธ๊ฐ€ ํ•œ ๋Œ€๋งŒ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

์ง์›๋“ค์€ ์ด ํ”„๋ฆฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ”„๋ฆฐํ„ฐ ํ•œ ๋Œ€๋ฅผ ๊ณต์œ ํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ง์›๋“ค์ด ํ”„๋ฆฐํ„ฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋งˆ๋‹ค ํ”„๋ฆฐํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฃผ๋ฌธํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์–ด๋–จ๊นŒ ? 

 

์ด๋Š” ๋งค์šฐ ๋น„ํšจ์œจ์ ์ผ ๊ฒƒ์ด๋‹ค.

 

ํ”„๋ฆฐํ„ฐ ํ•œ๋Œ€๋ฅผ ์ง์›๋“ค๋ผ๋ฆฌ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์„ '์‹ฑ๊ธ€ํ†ค'์œผ๋กœ ๋น„์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ด๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋„ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•œ๋ฐ, ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋‹จ ํ•œ๋ฒˆ๋งŒ ์ƒ์„ฑํ•ด์„œ ์—ฌ๋Ÿฌ ์ด์ ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜ ํ’€, ์Šค๋ ˆ๋“œ ํ’€ , ์บ์‹œ , ๋กœ๊ทธ ๊ธฐ๋ก ๊ฐ์ฒด์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

1. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝ ํ• ์ˆ˜ ์žˆ๋‹ค.

์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ํ•œ๋ฒˆ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ๋’ค๋กœ ๊ณ ์ •๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฆ‰, ํ•œ๋ฒˆ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•œ๋‹ค.

 

2. ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ „์—ญ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ธ์Šคํ„ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋“ค๋„ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ์กฐ์‹ฌํ•ด์•ผํ•œ๋‹ค.

 

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ์ ์šฉ ๋ฐฉ๋ฒ•

๊ตฌํ˜„์ฝ”๋“œ

public class Singleton {

    private static Singleton instance = new Singleton();
    
    private Singleton() {
        // ์ƒ์„ฑ์ž๋Š” ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœ๋ชปํ•˜๊ฒŒ private ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
    }

    public static Singleton getInstance() {
        return instance;
    }

    public void say() {
        System.out.println("hi, there");
    }
}

 

๋ฉ”์†Œ๋“œ์™€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋‘ static์œผ๋กœ ๋˜์–ด์žˆ๋‹ค.

๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜์™€ ๋ฉ”์†Œ๋“œ์˜ ์ ‘๊ทผ์„ ํ•ด์šฉํ•ด์•ผํ•œ๋‹ค.

 

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ๋‹จ์ 

1.  ๊ตฌํ˜„์˜ ๋ณต์žก์„ฑ

์‹ฑ๊ธ€ํ†ค ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์ ์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

 

์ƒ์„ฑ์ž ์™ธ์—๋„ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด syncronized ๊ฐ™์€ ํ‚ค์›Œ๋“œ๋ฅผ ๋”ฐ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

 

2. ํ…Œ์ŠคํŠธ์˜ ์–ด๋ ค์›€

ํ…Œ์ŠคํŠธ๋Š” ๊ฒฉ๋ฆฌ๋œ ์ƒํƒœ์—์„œ ์ง„ํ–‰๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ ์‹ฑ๊ธ€ํ†ค์€ ์ž์›์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ๋œ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ต๋‹ค.

์‹ฑ๊ธ€ํ†ค์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ ค๋ฉด ๋งค๋ฒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ฃผ์–ด์•ผํ•œ๋‹ค.

 

3. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌ์ฒด ํด๋ž˜์Šค์— ์˜์กด

์‹ฑ๊ธ€ํ†ค์„ ์œ„ํ•ด ํด๋ž˜์Šค ์•ˆ์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด๋Š” DIP๋ฅผ ์œ„๋ฐ˜ํ•œ๋‹ค.๋˜ํ•œ OCP ์›์น™๋„ ์œ„๋ฐ˜ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

 

์Šคํ”„๋ง์—์„œ์˜ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

- ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.(์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ)

- ์Šคํ”„๋ง์„ ํ†ตํ•ด์„œ ์‹ฑ๊ธ€ํ†ค์„ ์œ ์ง€ํ•˜๋ฉด ๊ธฐ์กด ์‹ฑ๊ธ€ํ†ค์˜ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1. ๊ธฐ์กด์˜ ์‹ฑ๊ธ€ํ†ค์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณต์žกํ•œ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ”์ง€๋งŒ ์Šคํ”„๋ง์—์„œ๋Š” ๋ณ„๋„์˜ ์ฝ”๋“œ๊ฐ€ ํ•„์š”์—†๋‹ค.

 

2. ํ…Œ์ŠคํŠธ, DIP , OCP , private ์ƒ์„ฑ์ž๋กœ๋ถ€ํ„ฐ ์ž์œ ๋กญ๊ฒŒ ์‹ฑ๊ธ€ํ†ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ตฌํ˜„์ฝ”๋“œ

void springContainer() {
ApplicationContext ac = new
AnnotationConfigApplicationContext(AppConfig.class);
//1. ์กฐํšŒ: ํ˜ธ์ถœํ•  ๋•Œ ๋งˆ๋‹ค ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
MemberService memberService1 = ac.getBean("memberService",
MemberService.class);
//2. ์กฐํšŒ: ํ˜ธ์ถœํ•  ๋•Œ ๋งˆ๋‹ค ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜MemberService memberService2 = ac.getBean("memberService",
MemberService.class);
//์ฐธ์กฐ๊ฐ’์ด ๊ฐ™์€ ๊ฒƒ์„ ํ™•์ธ
System.out.println("memberService1 = " + memberService1);
System.out.println("memberService2 = " + memberService2);
//memberService1 == memberService2
assertThat(memberService1).isSameAs(memberService2);
}

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์‹œ ์ฃผ์˜์‚ฌํ•ญ

์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋Š” ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ฒŒ(stateful) ์„ค๊ณ„ํ•˜์ง€ ๋ง์ž!

 

์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋Š” ๋ฌด์ƒํƒœ(stateless) ํ•ด์•ผํ•œ๋‹ค !

 

1. ํŠน์ • ํด๋ผ์ด์–ธํŠธ์— ์˜์กด์ ์ธ ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค.     

    - ํŠน์ • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋จ

 

2. ๊ฐ€๊ธ‰์  ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค.

 

3. ์ž๋ฐ”์—์„œ ๊ณต์œ ๋˜์ง€ ์•Š๋Š” ์ง€์—ญ๋ณ€์ˆ˜ , ํŒŒ๋ผ๋ฏธํ„ฐ , ThreadLocal ๋“ฑ์„ ์‚ฌ์šฉํ–์—ฌํ•œ๋‹ค.

์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด๋ž€?

 

๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค์˜ ์˜์กดํ•˜์ง€ ์•Š๊ณ ๋„ ์„œ๋กœ ์—ฐ๊ด€ ๋œ ๊ฐ์ฒด๋“ค์˜ ์กฐํ•ฉ์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ์–ด๋–ค GUI ํ™˜๊ฒฝ์—์„œ ํด๋ฆญ๊ณผ ์Šคํฌ๋กค ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž

 

์šด์˜์ฒด์ œ๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค (์œˆ๋„์šฐ , ๋งฅ , ๋ฆฌ๋ˆ…์Šค)

 

๊ทธ๋ฆฌ๊ณ  ์šด์˜์ฒด์ œ์˜ ์ข…๋ฅ˜์— ์ƒ๊ด€ ์—†์ด ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ์€ ๋™์ผํ•œ ์—ญํ• ์„ ํ•œ๋‹ค

 

์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋Š” ๋™์ผํ•œ OS์— ๋Œ€ํ•ด ์ผ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ค€๋‹ค.

 

 

 

์ถ”์ƒ ํŒฉํ† ๋ฆฌ์˜ ์š”์†Œ๋“ค์„ ๊ฐ๊ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.

 

AbstractFactory
- ์‹ค์ œ ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค์˜ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค

- GUI๋กœ ์น˜๋ฉด ๋ชจ๋“  OS ๋ฒ„์ „์„ ๋‹ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.


ConcreteFactory
- ๊ตฌ์ฒด์ ์ธ ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค๋กœ AbstractFactory ํด๋ž˜์Šค์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•จ์œผ๋กœ์จ ๊ตฌ์ฒด์ ์ธ ์ œํ’ˆ์„ ์ƒ์„ฑํ•œ๋‹ค.

- GUI๋กœ ์น˜๋ฉด OS์— ๋งž๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.


AbstractProduct
- ์ œํ’ˆ์˜ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค

- GUI๋กœ ์น˜๋ฉด ๊ณตํ†ต ๊ธฐ๋Šฅ(์ถ”์ƒ์ ์œผ๋กœ)์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. 


ConcreteProduct
- ๊ตฌ์ฒด์ ์ธ ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ๋˜๋Š” ๊ตฌ์ฒด์ ์ธ ๊ธฐ๋Šฅ

- ์—ฌ๊ธฐ์„œ ๊ฐ๊ฐ์˜ OS์— ๋งž๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์‚ฌ์šฉ์ž๋Š” GUI์— ์ ‘์†ํ•  ๋•Œ OS ์— ๋งž๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ตฌํ˜„ ์ฝ”๋“œ

์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์—๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

๋จผ์ € AbstractFactory ์™€ AbstractProduct ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž - ๊ธฐ๋Šฅ์€ ํด๋ฆญ๊ณผ ์Šคํฌ๋กค์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

 

GuiFac(AbstractFactory)

public interface GuiFactory {
    public Click runClick();
    public Scroll scroll();
}

 

Click(AbstractProduct)

public interface Click {
    public void click();
}

 

Scroll(AbstractProduct)

public interface Click {
    public void click();
}

 

๊ธฐ๋Šฅ ๋‘ ๊ฐœ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šคํ™” ํ•จ์œผ๋กœ์จ ๊ฐ๊ฐ์˜ OS๋Š” ์ด ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌ์ฒดํ™”ํ•˜๋ฉด ๋œ๋‹ค.

 

๋งŒ์•ฝ ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ํ•˜์ž

 

LinuxClick(ConcreteProduct)

public class LinuxClick implements Click{
    @Override
    public void click() {
        System.out.println("๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.");
    }
}

 

LinuxScroll(ConcreteProduct)

public class LinuxScroll implements Scroll {
    @Override
    public void scroll() {
        System.out.println("๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ ์Šคํฌ๋กคํ•ฉ๋‹ˆ๋‹ค.");
    }
}

 

์ด๋ ‡๊ฒŒ ๋‘ ๊ฐ€์ง€์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

๊ฐ๊ฐ ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด๋†“์€ Click , Scroll ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ฒดํ™”ํ•œ๋‹ค.

 

๊ตฌํ˜„๋œ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋ ค๋ฉด ConcreteFactory ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

LinuxGuiFac(ConcreteFactory)

public class LinuxGuiFac implements GuiFactory {

    @Override
    public Click runClick() {
        return new LinuxClick();
    }

    @Override
    public Scroll scroll() {
        return new LinuxScroll();
    }
}

 

์ด์ œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋๋‚ฌ๋‹ค

 

๋ฉ”์ธ์—์„œ ๊ธฐ๋Šฅ์„ ์‹คํ–‰์‹œ์ผœ๋ณด์ž

 

public class main {
    public static void main(String[] args) {
        GuiFactory gui = new LinuxGuiFac();
        Click click = gui.runClick();
        Scroll scroll = gui.scroll();

        click.click();
        scroll.scroll();
    }
}

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด,

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฆฌ๋ˆ…์Šค์—์„œ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ ๊ฐ’์ด ๋‚˜์˜จ๋‹ค.

 

๋งŒ์•ฝ ๋ฆฌ๋ˆ…์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ํ™˜๊ฒฝ(์œˆ๋„์šฐ , ๋งฅ) ์—์„œ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์œ„์—์„œ ํ–ˆ๋˜ ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๊ฒŒ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

(๊ณผ์ •์ƒ๋žต)

 

public class main {
    public static void main(String[] args) {
        GuiFactory gui = new WindowGuiFac();
        Click click = gui.runClick();
        Scroll scroll = gui.scroll();

        click.click();
        scroll.scroll();
    }
}

์œˆ๋„์šฐ๋กœ ๊ตฌํ˜„ ํŒฉํ† ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๊ตฌํ˜„ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์—†์ด ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์ฐธ๊ณ ํ•œ ์‚ฌ์ดํŠธ

https://www.youtube.com/watch?v=soV1C6j9kkg 

https://gmlwjd9405.github.io/2018/08/08/abstract-factory-pattern.html

 

[Design Pattern] ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด๋ž€ - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•  ๋•Œ ํ”ํžˆ StringBuilder ์™€ StringBuffer ๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

๊ทธ ๋™์•ˆ์€ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ์˜ ์ฐจ์ด๋ผ๊ณ ๋งŒ ์•Œ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์— ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ ์ง€ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์•˜๋‹ค.

 

StringBuilder VS StringBuffer

 

์ŠคํŠธ๋ง ๋ฒ„ํผ ๊ตฌํ˜„ ์ฝ”๋“œ
์ŠคํŠธ๋ง ๋นŒ๋” ๊ตฌํ˜„ ์ฝ”๋“œ

 

๊ธฐ๋ณธ์ ์œผ๋กœ ์ŠคํŠธ๋ง ๋ฒ„ํผ์™€ ์ŠคํŠธ๋ง ๋นŒ๋” ๋ชจ๋‘ AbstractStringBuilder ๋ผ๋Š” ์ถ”์ƒํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค.

 

 

๋Œ€ํ‘œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” append ํ•จ์ˆ˜์˜ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋‘˜๋‹ค super() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด AbstractStringBuilder ์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

๊ทผ๋ฐ ์ŠคํŠธ๋ง ๋ฒ„ํผ์—๋งŒ ์žˆ๋Š” ๊ฒƒ๋“ค์ด ๋ช‡๊ฐ€์ง€ ์žˆ๋‹ค.

 

1. synchronize 

2. toStringCache

 

๊ฐ๊ฐ์ด ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š” ์ง€ ์•Œ์•„๋ณด์ž

 

synchronize

- ์ด ํ‚ค์›Œ๋“œ๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ์˜ ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•œ๋‹ค.  

- ๊ณต์œ  ๋ฐ์ดํ„ฐ์— lock์„ ๊ฑธ์–ด ์ž‘์—…์ค‘์ด๋˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋งˆ์น ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์—๊ฒŒ ์ œ์–ด๊ถŒ์ด ๋„˜์–ด๊ฐ€์ง€ ์•Š๊ฒŒ ๋ณดํ˜ธํ•œ๋‹ค.

 

์ด ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์ŠคํŠธ๋ง ๋ฒ„ํผ๋ฅผ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์ง€์›ํ•ด์ค€๋‹ค.

 

toStringCache

- ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ toString() ํ•จ์ˆ˜์˜ ์บ์‹œ ๊ฐ™์€ ๋ณ€์ˆ˜์ด๋‹ค.

   toString() ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ์— ์ด value ๋ฐฐ์—ด์˜ ๋ณ€๊ฒฝ์ด ์—†๋‹ค๋ฉด,  toStringCache์„ ์ด์šฉํ•ด์„œ String์„ ๋งŒ๋“ ๋‹ค.

 

 

์ŠคํŠธ๋ง ๋ฒ„ํผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค toStringCache ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™” ํ•ด์ค€๋‹ค.

 

๊ทธ ์ƒํƒœ์—์„œ toString()์„ ํ˜ธ์ถœํ•˜๋ฉด toStringCache ๋Š” null ์ด๊ธฐ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด value ๊ฐ’์œผ๋กœ String ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค !

 

@HotSpotIntrinsicCandidate
    public synchronized String toString() {
        return this.toStringCache == null ? (this.toStringCache = this.isLatin1() ? StringLatin1.newString(this.value, 0, this.count) : StringUTF16.newString(this.value, 0, this.count)) : new String(this.toStringCache);
    }

 

์ด๋ฏธ ์ €์žฅ๋œ ๊ฐ’์ด ์žˆ์„ ๊ฒฝ์šฐ ๊ธฐ์กด ๊ฐ’์„ ์ด์šฉํ•ด String ์„ ๋งŒ๋“ ๋‹ค. 

๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ String ์„ ๋งŒ๋“ ๋‹ค.

 

๊ทผ๋ฐ ์™œ toStringCache ๋ณ€์ˆ˜๋Š” ์ŠคํŠธ๋ง ๋ฒ„ํผ์—๋งŒ ์žˆ์„๊นŒ ?

 

๊ทธ ์ด์œ ๋Š” ์ŠคํŠธ๋ง ๋นŒ๋”๋Š” ๋‹จ์ผ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์ด๊ฒŒ ๋ฌด์Šจ ์˜๋ฏธ๋ƒ๋ฉด, ์ŠคํŠธ๋ง ๋ฒ„ํผ๋Š” ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์—ฌ๋Ÿฌ๋ฒˆ ๋ถˆ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ

 

๋‹จ์ผ ์“ฐ๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์ŠคํŠธ๋ง ๋นŒ๋”๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์ด๋Ÿฐ ๊ฒฝ์šฐ๊ฐ€ ์ ๋‹ค.

 

๊ฒฐ๊ตญ ์ตœ์ ํ™”์˜ ์ฐจ์ด์ด๋‹ค.

 

๊ฒฐ๋ก 

 

๊ณตํ†ต์ 

 

์ŠคํŠธ๋ง ๋นŒ๋”์™€ ์ŠคํŠธ๋ง ๋ฒ„ํผ ๋ชจ๋‘ ๊ฐ™์€ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›๋Š”๋‹ค.

 

 

์ฐจ์ด์ 

 

์ŠคํŠธ๋ง ๋นŒ๋” : ๋‹จ์ผ ์Šค๋ ˆ๋“œ์ด๊ฑฐ๋‚˜ ๋™๊ธฐํ™”๋ฅผ ์‹ ๊ฒฝ ์“ฐ์ง€์•Š์•„๋„ ๋˜๋Š” ๊ณณ

์ŠคํŠธ๋ง ๋ฒ„ํผ : ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ

 

 

 

์ฐธ๊ณ ํ•œ ์‚ฌ์ดํŠธ

https://woooongs.tistory.com/98?category=798806 

 

StringBuilder ์™€ StringBuffer ๋น„๊ต

StringBuilder ์™€ StringBuffer ๋ชจ๋‘ AbstractStringBuilder ๋ฅผ ์ƒ์†๋ฐ›์•„ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค. ๋‘ ํด๋ž˜์Šค๋Š” ๋ชจ๋‘ String ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์ง€๋งŒ ์–ด๋–ค ์ฐจ์ด์ ์œผ๋กœ ์ธํ•ด ๊ตฌ๋ถ„๋˜์–ด์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•ด๋ณธ๋‹ค. appen

woooongs.tistory.com

https://stackoverflow.com/questions/46294579/why-stringbuffer-has-a-tostringcache-while-stringbuilder-not

 

Why StringBuffer has a toStringCache while StringBuilder not?

In JDK 8, StringBuffer class has a toStringCache, while StringBuilder doesn't. /** * A cache of the last value returned by toString. Cleared * whenever the StringBuffer is modified. */ private

stackoverflow.com

 

 

๋ฌธ์ œ

 

๋ถ„์„

์‚ฌ์‹ค ์ด ๋ฌธ์ œ๋ฅผ ๊ต‰์žฅํžˆ ๋‹จ์ˆœ ๋ฌด์‹ํ•˜๊ฒŒ ํ’€์—ˆ๋‹ค.

 

๋Œ€๋žต ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ์š”์•ฝํ•˜๋ฉด

 

1.  ์ค‘๊ฐ„์— ํŒŒํ‹ฐ์…˜(X)์ด ์กด์žฌํ•œ๋‹ค๋ฉด ๊ฑฐ๋ฆฌ ๋‘๊ธฐ๋ฅผ ์ง€ํ‚จ ๊ฒƒ์ด๋‹ค.

 

2. ํŒŒํ‹ฐ์…˜์„ ์‚ฌ์ด์— ๋‘๊ณ  ์•‰์€ ๊ฒฝ์šฐ๋„ ๊ฑฐ๋ฆฌ ๋‘๊ธฐ๋ฅผ ์ง€ํ‚จ๊ฒƒ์ด๋‹ค. (์˜†์— ๋นˆ ํ…Œ์ด๋ธ”์ด ์žˆ์œผ๋ฉด ์•ˆ๋จ)

 

์œผ๋กœ ์š”์•ฝ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ƒ๊ฐํ•ด๋ณด๋ฉด, 

 

1๋ฒˆ ์กฐ๊ฑด์€ ํŒŒํ‹ฐ์…˜์ด ๋‚˜์˜ค๋ฉด ํ•ด๋‹น ๋ผ์ธ์€ ๋” ์ด์ƒ ํƒ์ƒ‰ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๋‹ค.

 

2๋ฒˆ ์กฐ๊ฑด์—์„œ๋Š” P(์ฐธ๊ฐ€์ž) ์˜†์— ๊ณต์„(O)์ด ์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค. 

 

๋ผ๊ณ  ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด์ œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์งœ๋ณด์ž 

 

ํƒ์ƒ‰์„ ํ•  ๋•Œ๋Š” ์„ธ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

 

1. ํŒŒํ‹ฐ์…˜(X)์ด ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ 

     - ๋” ์ด์ƒ ๋ณผ ํ•„์š” ์—†์Œ skip

 

2. ์ฐธ๊ฐ€์ž(P)๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ

    - ๋ฌด์กฐ๊ฑด ์•ˆ๋จ

 

3. ๊ณต์„(O)์ด ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ

    - ์ด๊ฑด ์ข€ ๋” ํƒ์ƒ‰ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

      ์ฃผ๋ณ€์— ์ฐธ๊ฐ€์ž(P) ๊ฐ€ ์žˆ๋Š” ์ง€ ํ™•์ธํ•ด ๋ณด์ž

 

์ด๋Ÿฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ํ’€๋ฉด ๋ฌธ์ œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทผ๋ฐ ๋‚œ ์ƒํ•˜์ขŒ์šฐ ๋Œ€๊ฐ์„  ๊นŒ์ง€ ์ผ์ผ์ด ํƒ์ƒ‰ํ•ด์ฃผ์—ˆ๋‹ค ใ…Žใ…Ž...

 

์ฝ”๋“œ

import java.util.*;

class Solution {
    
    static int[] dx = {1,2,-1,-2,0,0,0,0,-1,-1,1,1};
    static int[] dy = {0,0,0,0,1,2,-1,-2,-1,1,-1,1};
    static List<Integer> answer_ = new ArrayList<>();
    public int[] solution(String[][] places) {
        int[] answer = new int[5];
        for(int i=0;i<5;i++){
            visit(places[i]);
            if(visit(places[i]) == true){
                answer_.add(1);
            }
            else {
                answer_.add(0);
            }
        }
        
        for(int i=0;i<5;i++){
            answer[i] = answer_.get(i);
        }
        
        return answer;
    }
    
    static boolean visit(String[] places){
        for(int j=0;j<5;j++){
                for(int k=0;k<5;k++){
                    if(places[j].charAt(k) == 'P'){
                        check(j,k,places);
                        if(check(j,k,places) == false){
                            return false;
                        }
                    }    
                }
            }    
        return true;
    }
    
    static boolean check(int y,int x,String[] places){
        for(int i=0;i<=7;i++){
            if(y+dy[i] < 0 || y+dy[i] > 4 || x+dx[i] < 0 || x+dx[i] > 4) break; 
            if(places[y+dy[i]].charAt(x+dx[i]) == 'X') break;
            if(places[y+dy[i]].charAt(x+dx[i]) == 'P') return false;
        }
        
        for(int i=2;i<=3;i++){
            if(y+dy[i] < 0 || y+dy[i] > 4 || x+dx[i] < 0 || x+dx[i] > 4) break;
            if(places[y+dy[i]].charAt(x+dx[i]) == 'X') break;
            if(places[y+dy[i]].charAt(x+dx[i]) == 'P') return false;
        }
        for(int i=4;i<=5;i++){
            if(y+dy[i] < 0 || y+dy[i] > 4 || x+dx[i] < 0 || x+dx[i] > 4) break;
            if(places[y+dy[i]].charAt(x+dx[i]) == 'X') break;
            if(places[y+dy[i]].charAt(x+dx[i]) == 'P') return false;
        }
        for(int i=6;i<=7;i++){
            if(y+dy[i] < 0 || y+dy[i] > 4 || x+dx[i] < 0 || x+dx[i] > 4) break;
            if(places[y+dy[i]].charAt(x+dx[i]) == 'X') break;
            if(places[y+dy[i]].charAt(x+dx[i]) == 'P') return false;
        }
        for(int i=8;i<=11;i++){
            if(y+dy[i] < 0 || y+dy[i] > 4 || x+dx[i] < 0 || x+dx[i] > 4) continue;
            if(places[y+dy[i]].charAt(x+dx[i]) == 'X' || places[y+dy[i]].charAt(x+dx[i]) == 'O') 
                continue;
            if(places[y+dy[i]].charAt(x+dx[i]) == 'P'){
                
                
              if(places[y+dy[i]].charAt(x) == 'X' && places[y].charAt(x+dx[i]) == 'X') {
                  continue;
                }
                else return false;
                }
            
            }  
        return true;
        }
        
    
    }

+ Recent posts