item 76 SeungminLee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
item 76
๊ฐ๋ฅํ ํ ์คํจ ์์์ ์ผ๋ก ๋ง๋ค๋ผ
Database transaction A: Atomicity (์์์ฑ) C: Consistency (์ผ๊ด์ฑ) I: Isolation (๋ ๋ฆฝ์ฑ) D: Durability (์ง์์ฑ)
์คํจ๋ฅผ ์์์ ์ผ๋ก ๋ง๋ค๋ฉด ์์ ๋์ค ์์ธ๊ฐ ๋ฐ์ํด๋ ๊ทธ ๊ฐ์ฒด๋ ์ฌ์ ํ ์ ์์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ์ํ๊ฐ ๋๋ค. ๊ฒ์ฌ ์์ธ๋ฅผ ๋์ง๋ ์ํฉ์ด๋ผ๋ฉด ํธ์ถ์๊ฐ ์ค๋ฅ ์ํ๋ฅผ ๋ณต๊ตฌํ ์ ์์ผ๋ ๋ ์ ์ฉํ๋ค.
ํธ์ถ๋ ๋ฉ์๋๊ฐ ์คํจํ๋๋ผ๋ ํด๋น ๊ฐ์ฒด๋ ๋ฉ์๋ ํธ์ถ ์ ์ํ๋ฅผ ์ ์งํด์ผ ํ๋ค. (failure-atomic)
๋ฉ์๋๋ฅผ ์คํจ ์์์ ์ผ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ
-
๋ถํธ ๊ฐ์ฒด๋ก ์ค๊ณํ๋ค. ๋ถํธ ๊ฐ์ฒด๋ ํ์์ ์ผ๋ก ์คํจ ์์์ ์ด๋ค. ๋ฉ์๋๊ฐ ์คํจํ๋ฉด ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง์ง ์๋ ์ผ์ด ์์ด๋ ๊ธฐ์กด์ ์๋ ๊ฐ์ฒด๊ฐ ๋ถ์์ ํ ์ํ์ ๋น ์ง์ง ์๋๋ค. (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); } ...
-
์์ ์ํ ์ , ๋งค๊ฐ๋ณ์์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ๋ค. ๊ฐ์ฒด ๋ด๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ์ ์ฌ์ ์์ธ ๊ฐ๋ฅ์ฑ์ ๋๋ถ๋ถ ๊ฑธ๋ฌ๋ด๋ฉด์๋ ๊ฐ์ฅ ์ฌ์ด ๊ตฌํ๋ฒ์ด๋ค.
public Object pop() { if (size == 0) throws new EmptyStackException(); Object result = elements[--size]; elements[size] null; // ์ฌ์ฉ์ ๋ง์น ์ฐธ์กฐ ํด์ return result; // size๋ฅผ ๊ฒ์ฌํ์ง ์์๋ ์คํ์ด ๋น์ด์๋ค๋ฉด ์์ธ๋ฅผ ๋์ง๋, ์ด๋ ArrayIndexOutOfBoundsException์ด๋ค. // ์ฐ๋ฆฌ๊ฐ ์๋ํ๋ ์คํ์ด ๋น์ด์์ด์ ๋ฐ์ํ๋ ์์ธ์๋ ๋ค์ ๋ง์ง ์๋๋ค. (์ถ์ํ ์์ค์ด ์ํฉ์ ์ด์ธ๋ฆฌ์ง ์๋๋ค. item 73)
์คํจํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ชจ๋ ์ฝ๋ฅด๋ฅผ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ฐ๊พธ๋ ์ฝ๋๋ณด๋ค ์์ ๋ฐฐ์นํ๋ค. ๊ณ์ฐ์ ์ํํด๋ณด๊ธฐ ์ ์๋ ์ธ์์ ์ ํจ์ฑ์ ๊ฒ์ฌํด๋ณผ ์ ์์ ๋ ์ฌ์ฉํ๊ธฐ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.
์์: TreeMap
- TreeMap์ ์์๋ค์ ์ ํด์ง ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
- TreeMap์ ์์๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๊ทธ ์์๋ TreeMap์ ๊ธฐ์ค์ ๋ฐ๋ผ ๋น๊ตํ ์ ์๋ ํ์ ์ด์ด์ผ ํ๋ค.
- ๋ง์ฝ ์๋ฑํ ํ์ ์ ์ถ๊ฐํ๋ ค๋ฉด ํธ๋ฆฌ์ ์ถ๊ฐ๋๊ธฐ ์ ์ ์ถ๊ฐ๋ ์์น๋ฅผ ์ฐพ๋ ๊ณผ์ ์์ ClassCastException์ด ๋ฐ์ํ๋ค.
-
๊ฐ์ฒด์ ์์ ๋ณต์ฌ๋ณธ์์ ์์ ์ ์ํํ ๋ค์, ์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๋ฉด ์๋์ ๊ฐ์ฒด์ ๊ต์ฒดํ๋ค. ๋ฐ์ดํฐ๋ฅผ ์์ ์๋ฃ๊ตฌ์กฐ์ ์ ์ฅํด ์์ ํ๋ ๊ฒ ๋ ๋น ๋ฅผ ๋ ์ ์ฉํ๊ธฐ ์ข์ ๋ฐฉ์์ด๋ค. ์ ๋ ฌ ๋ฉ์๋์์ ์ ๋ ฌ์ ์ํํ์ง ์ ์ ์ ๋ ฅ ๋ฆฌ์คํธ์ ์์๋ค์ ๋ฐฐ์ด๋ก ์ฎ๊ฒจ ๋ด๋๋ค โ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ฉด ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ณต๋ฌธ์์ ์์๋ค์ ํจ์ฌ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์๋ค. โ ์ฑ๋ฅ์ ์ํ ๊ตฌํ์ด์ง๋ง ํน์ ์ ๋ ฌ์ ์คํจํ๋๋ผ๋ ์ ๋ ฅ ๋ผ์คํธ๋ ๋ณํ์ง ์๋๋ค.
-
์์ ๋์ค ๋ฐ์ํ๋ ์คํจ๋ฅผ ๊ฐ๋ก์ฑ๋ ๋ณต๊ตฌ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์์ ์ ์ํ๋ก ๋๋ฆฐ๋ค. ์ฃผ๋ก ๋์คํฌ ์ง์์ฑ์ ๋ณด์ฅํด์ผํ๋ ์๋ฃ๊ตฌ์กฐ์์ ์์ฃผ ์ฐ์ด๋๋ฐ ์์ฃผ ์ฐ์ด๋ ๋ฐฉ์์ด๋ค. (db์ ์ง์์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ transcation์์๋ ๋น๋ฒํ๊ฒ ์ฐ์ธ๋ค).
์คํจ ์์์ฑ์ ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋๋ ๋๋ชฉ์ด์ง๋ง ํญ์ ๋ฌ์ฑํ ์ ์๋ ๊ฒ์ ์๋๋ค.
์๋ฅผ ๋ค์ด ๋ ์ค๋ ๋๊ฐ ๋๊ธฐํ ์์ด ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋์์ ์์ ํ๋ค๋ฉด ๊ทธ ๊ฐ์ฒด์ ์ผ๊ด์ฑ์ด ๊นจ์ง ์ ์๋ค. ์ด๋ฅผ ์ํด ConcurrentModificationException์ ์ก์๋ด์ง๋ง ๊ทธ ํ์ ๊ทธ ๊ฐ์ฒด๊ฐ ์ฌ์ ํ ์ธ ์ ์๋ ์ํ๋ผ๊ณ ์๊ฐํด์๋ ์๋๋ค.
ํํธ, Error๋ ๋ณต๊ตฌํ ์ ์์ผ๋ฏ๋ก ์คํจ์์์ ์ผ๋ก ๋ง๋ค๋ ค๋ ์๋์กฐ์ฐจ ํ ํ์๊ฐ ์๋ค.
์คํจ ์์์ ์ผ๋ก ๋ง๋ค ์ ์๋๋ผ๋ ํญ์ ๊ทธ๋ฆฌ ํด์ผ ํ๋ ๊ฒ๋ ์๋๋ค. ์คํจ ์์์ฑ์ ๋ฌ์ฑํ๊ธฐ ์ํ ๋น์ฉ์ด๋ ๋ณต์ก๋๊ฐ ์์ฃผ ํฐ ์ฐ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
โ ๊ทธ๋๋ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ์๊ณ ๋๋ฉด ์คํจ ์์์ฑ์ ๊ณต์ผ๋ก ์ป์ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค!
ํต์ฌ์ ๋ฆฌ
๋ฉ์๋ ๋ช ์ธ์ ๊ธฐ์ ํ ์์ธ๋ผ๋ฉด ์คํน ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๊ฐ์ฒด์ ์ํ๋ ๋ฉ์๋ ํธ์ถ ์ ๊ณผ ๋๊ฐ์ด ์ ์ง๋ผ์ผ ํ๋ค๋ ๊ฒ์ด ๊ธฐ๋ณธ ๊ท์น์ด๋ค. ์ด ๊ท์น์ ์งํค์ง ๋ชปํ๋ค๋ฉด ์คํจ ์์ ๊ฐ์ฒด ์ํ๋ฅผ API ์ค๋ช ์ ๋ช ์ํด์ผ ํ๋ค. (API ๋ฌธ์ ์๋น ๋ถ๋ถ์ด ์ ์งํค์ง ์๊ณ ์๋ค).