item 76 SeungminLee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

item 76

๊ฐ€๋Šฅํ•œ ํ•œ ์‹คํŒจ ์›์ž์ ์œผ๋กœ ๋งŒ๋“ค๋ผ

Database transaction A: Atomicity (์›์ž์„ฑ) C: Consistency (์ผ๊ด€์„ฑ) I: Isolation (๋…๋ฆฝ์„ฑ) D: Durability (์ง€์†์„ฑ)

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

ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํŒจํ•˜๋”๋ผ๋„ ํ•ด๋‹น ๊ฐ์ฒด๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค. (failure-atomic)

๋ฉ”์„œ๋“œ๋ฅผ ์‹คํŒจ ์›์ž์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

  1. ๋ถˆํŽธ ๊ฐ์ฒด๋กœ ์„ค๊ณ„ํ•œ๋‹ค. ๋ถˆํŽธ ๊ฐ์ฒด๋Š” ํƒœ์ƒ์ ์œผ๋กœ ์‹คํŒจ ์›์ž์ ์ด๋‹ค. ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š๋Š” ์ผ์ด ์žˆ์–ด๋„ ๊ธฐ์กด์— ์žˆ๋˜ ๊ฐ์ฒด๊ฐ€ ๋ถˆ์•ˆ์ •ํ•œ ์ƒํƒœ์— ๋น ์ง€์ง€ ์•Š๋Š”๋‹ค. (item 17)

    public final Class Complex {
    	private final double re;
    	private final double im;
    
    public Complex(double re, double im) {
    	this.re = re;
    	this.im = im;
    }
    
    public Complex plus (Complex c) {
    	return new Complex(re + c.re, im + c.im);
    }
    
    ...
    
  2. ์ž‘์—… ์ˆ˜ํ–‰ ์ „, ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•œ๋‹ค. ๊ฐ์ฒด ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ์ž ์žฌ์  ์˜ˆ์™ธ ๊ฐ€๋Šฅ์„ฑ์„ ๋Œ€๋ถ€๋ถ„ ๊ฑธ๋Ÿฌ๋‚ด๋ฉด์„œ๋„ ๊ฐ€์žฅ ์‰ฌ์šด ๊ตฌํ˜„๋ฒ•์ด๋‹ค.

    public Object pop() {
    	if (size == 0) 
    			throws new EmptyStackException();
    	Object result = elements[--size];
    	elements[size] null; // ์‚ฌ์šฉ์„ ๋งˆ์นœ ์ฐธ์กฐ ํ•ด์ œ
    	return result;
    
    // size๋ฅผ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์•„๋„ ์Šคํƒ์ด ๋น„์–ด์žˆ๋‹ค๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋‚˜, ์ด๋Š” ArrayIndexOutOfBoundsException์ด๋‹ค.
    // ์šฐ๋ฆฌ๊ฐ€ ์˜๋„ํ•˜๋Š” ์Šคํƒ์ด ๋น„์–ด์žˆ์–ด์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ์™€๋Š” ๋‹ค์†Œ ๋งž์ง€ ์•Š๋Š”๋‹ค. (์ถ”์ƒํ™” ์ˆ˜์ค€์ด ์ƒํ™ฉ์— ์–ด์šธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. item 73) 
    

    ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ชจ๋“  ์ฝ”๋ฅด๋ฅผ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ์ฝ”๋“œ๋ณด๋‹ค ์•ž์— ๋ฐฐ์น˜ํ•œ๋‹ค. ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด๋ณด๊ธฐ ์ „์—๋Š” ์ธ์ˆ˜์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ด๋ณผ ์ˆ˜ ์—†์„ ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

    ์˜ˆ์‹œ: TreeMap

    1. TreeMap์€ ์›์†Œ๋“ค์„ ์ •ํ•ด์ง„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
    2. TreeMap์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๊ทธ ์›์†Œ๋Š” TreeMap์˜ ๊ธฐ์ค€์— ๋”ฐ๋ผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์ด์–ด์•ผ ํ•œ๋‹ค.
    3. ๋งŒ์•ฝ ์—‰๋šฑํ•œ ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ํŠธ๋ฆฌ์— ์ถ”๊ฐ€๋˜๊ธฐ ์ „์— ์ถ”๊ฐ€๋  ์œ„์น˜๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์—์„œ ClassCastException์ด ๋ฐœ์ƒํ•œ๋‹ค.
  3. ๊ฐ์ฒด์˜ ์ž„์‹œ ๋ณต์‚ฌ๋ณธ์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ, ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด ์›๋ž˜์˜ ๊ฐ์ฒด์™€ ๊ต์ฒดํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅํ•ด ์ž‘์—…ํ•˜๋Š” ๊ฒŒ ๋” ๋น ๋ฅผ ๋•Œ ์ ์šฉํ•˜๊ธฐ ์ข‹์€ ๋ฐฉ์‹์ด๋‹ค. ์ •๋ ฌ ๋ฉ”์„œ๋“œ์—์„œ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์ „์— ์ž…๋ ฅ ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ๋“ค์„ ๋ฐฐ์—ด๋กœ ์˜ฎ๊ฒจ ๋‹ด๋Š”๋‹ค โ†’ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ฐ˜๋ณต๋ฌธ์—์„œ ์›์†Œ๋“ค์— ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. โ†’ ์„ฑ๋Šฅ์„ ์œ„ํ•œ ๊ตฌํ˜„์ด์ง€๋งŒ ํ˜น์‹œ ์ •๋ ฌ์— ์‹คํŒจํ•˜๋”๋ผ๋„ ์ž…๋ ฅ ๋ผ์ŠคํŠธ๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  4. ์ž‘์—… ๋„์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์‹คํŒจ๋ฅผ ๊ฐ€๋กœ์ฑ„๋Š” ๋ณต๊ตฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ž‘์—… ์ „ ์ƒํƒœ๋กœ ๋Œ๋ฆฐ๋‹ค. ์ฃผ๋กœ ๋””์Šคํฌ ์ง€์†์„ฑ์„ ๋ณด์žฅํ•ด์•ผํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ์ž์ฃผ ์“ฐ์ด๋Š”๋ฐ ์ž์ฃผ ์“ฐ์ด๋Š” ๋ฐฉ์‹์ด๋‹ค. (db์˜ ์ง€์†์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ transcation์—์„œ๋Š” ๋นˆ๋ฒˆํ•˜๊ฒŒ ์“ฐ์ธ๋‹ค).

์‹คํŒจ ์›์ž์„ฑ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ถŒ์žฅ๋˜๋Š” ๋•๋ชฉ์ด์ง€๋งŒ ํ•ญ์ƒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™๊ธฐํ™” ์—†์ด ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋™์‹œ์— ์ˆ˜์ •ํ•œ๋‹ค๋ฉด ๊ทธ ๊ฐ์ฒด์˜ ์ผ๊ด€์„ฑ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ConcurrentModificationException์„ ์žก์•„๋‚ด์ง€๋งŒ ๊ทธ ํ›„์— ๊ทธ ๊ฐ์ฒด๊ฐ€ ์—ฌ์ „ํžˆ ์“ธ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

ํ•œํŽธ, Error๋Š” ๋ณต๊ตฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์‹คํŒจ์›์ž์ ์œผ๋กœ ๋งŒ๋“ค๋ ค๋Š” ์‹œ๋„์กฐ์ฐจ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

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

โ†’ ๊ทธ๋ž˜๋„ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ๋‚˜๋ฉด ์‹คํŒจ ์›์ž์„ฑ์„ ๊ณต์œผ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค!

ํ•ต์‹ฌ์ •๋ฆฌ

๋ฉ”์„œ๋“œ ๋ช…์„ธ์— ๊ธฐ์ˆ ํ•œ ์˜ˆ์™ธ๋ผ๋ฉด ์„คํ˜น ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๊ฐ์ฒด์˜ ์ƒํƒœ๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „๊ณผ ๋˜‘๊ฐ™์ด ์œ ์ง€๋ผ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ ๊ทœ์น™์ด๋‹ค. ์ด ๊ทœ์น™์„ ์ง€ํ‚ค์ง€ ๋ชปํ•œ๋‹ค๋ฉด ์‹คํŒจ ์‹œ์˜ ๊ฐ์ฒด ์ƒํƒœ๋ฅผ API ์„ค๋ช…์— ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. (API ๋ฌธ์„œ ์ƒ๋‹น ๋ถ€๋ถ„์ด ์ž˜ ์ง€ํ‚ค์ง€ ์•Š๊ณ  ์žˆ๋‹ค).