1003 ~ 1009


# 1003 ~ 1009

# 1003 - DB ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

# ๋™์‹œ์„ฑ์ด๋ž€(Concurrency)?

์‚ฌ์ „์  ์˜๋ฏธ๋Š” ํ•˜๋‚˜์˜ CPU ์ฝ”์–ด์—์„œ ์‹œ๊ฐ„๋ถ„ํ• (Time sharing)์„ ํ†ตํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์—ฌ์ง€๊ฒŒ ํ•˜๋Š” ๊ธฐ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค.
ํ•˜์ง€๋งŒ, ๋Œ€์ค‘์ ์œผ๋กœ๋Š” ์—ฌ๋Ÿฌ ์š”์ฒญ์ด ๋™์‹œ์— ๋™์ผํ•œ ์ž์›(data)์— ์ ‘๊ทผํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋ ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

# ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

# [ ๋น„๊ด€์ ์ธ ๋ฐฉ๋ฒ• ]

ํ˜„์žฌ ์ˆ˜์ •ํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์–ธ์ œ๋“  ๋‹ค๋ฅธ ์š”์ฒญ์— ์˜ํ•ด ์ˆ˜์ •๋  ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— Lock์„ ๊ฑฐ๋Š” ๋ฐฉ์‹.
์žฅ์ ์€ ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์™„๋ฒฝํžˆ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ˆ˜์ •ํ•  ๋ฐ์ดํ„ฐ์— row level lock์„ ๊ฑธ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์š”์ฒญ์—์„œ ์ˆ˜์ •ํ•˜๋ ค๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
๋‹จ์ ์€ lock์œผ๋กœ ์ธํ•ด ์ดํ›„์˜ ๋‹ค๋ฅธ ์š”์ฒญ์€ ๋Œ€๊ธฐ์ƒํƒœ๋กœ ๋น ์ง„๋‹ค. ๊ธฐ์กด์˜ lock์˜ transaction์ด commit ๋˜๋Š” rollback์œผ๋กœ ๋๋‚˜๋ฉด ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋–ค ์š”์ฒญ์„ ๋น„๋กœ์†Œ ์‹คํ–‰ํ•œ๋‹ค.
ํ•ด๋‹น ๋ฐฉ๋ฒ•์€ ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋„์ž…ํ•˜๊ธฐ์ „ ์„œ๋น„์Šค์˜ ์ตœ์†Œ ์ฒ˜๋ฆฌ tps์— ๋ถ€ํ•ฉํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•œ๋‹ค.
์ด ๋ฐฉ๋ฒ•์€ ์„ธ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ๋Š” DB์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ Lock์ˆ˜์ค€์„ ๋†’์ด๋Š” ๊ฒƒ์ด๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋ณธ์ˆ˜์ค€๊ฐ’์ธ Repeatable Read๋ฅผ Serializer ์ด์ƒ์˜ ์ˆ˜์ค€์œผ๋กœ ์˜ฌ๋ฆฐ๋‹ค. ๊ฐ•๋„ ๋†’์€ ๋ฝ์œผ๋กœ ์™„์ „ํ•œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ด๋กœ์ธํ•œ ๋‹ค๋ฅธ ์š”์ฒญ๋“ค์ด ๋ชจ๋‘ ์ทจ์†Œ๊ฐ€๋œ๋‹ค. ์ทจ์†Œ๋œ ์ž‘์—…๋“ค์€ ์žฌ์‹œ๋„๋ฅผ ์œ„ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค์— ์ ์šฉํ•˜๋Š”๊ฒƒ์—” ํ˜„์‹ค์„ฑ์ด ๋ถ€์กฑํ•˜๋‹ค.

๋‘ ๋ฒˆ์งธ๋Š” select for update ํ™œ์šฉํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ lock์„ ์žก์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ lock์„ ์žก๋Š” ๊ตฌ๊ฐ„์ด ๊ธธ์–ด์ ธ ์„ฑ๋Šฅ์— ์‹ฌ๊ฐํ•œ ์˜ํ–ฅ์„ ์ค€๋‹ค. ๊ทน์žฅ์˜ˆ๋งค์™€ ๊ฐ™์€ ์„œ๋น„์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๊ฒƒ์ด ์ข‹๋‹ค.

๋งˆ์ง€๋ง‰์€ Data์˜ transaction์˜ write lock์„ ํ™œ์šฉํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ write lock์ด ๊ฑธ๋ฆฌ๊ณ  transaction์ด ๋๋‚˜์•ผ lock์ด ํ’€๋ฆฌ๋Š” ๊ฒƒ์„ ์ด์šฉํ•œ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์ฐŒ๋งŒ DB์™€ ์„œ๋ฒ„ ์„ฑ๋Šฅ์— ๋”ฐ๋ผ์„œ ์„œ๋น„์Šค์˜ ์†๋„๊ฐ€ ์ขŒ์šฐ๋œ๋‹ค.

# [ ๋‚™๊ด€์ ์ธ ๋ฐฉ๋ฒ• ]

์ˆ˜์ •ํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋‚˜๋งŒ ์ˆ˜์ •ํ•  ๊ฒƒ์ด๋ผ๋Š” ๋‚™๊ด€์ ์ธ ์ƒ๊ฐ์˜ ๋ฐฉ๋ฒ•์ด๋‹ค. ํ…Œ์ด๋ธ”์— version์ด๋ผ๋Š” ์ˆซ์ž์ปฌ๋Ÿผ ๋˜๋Š” updated_at ์ด๋ผ๋Š” ์‹œ๊ฐ„์ปฌ๋Ÿผ์„ ๋งŒ๋“ค์–ด์„œ ์ˆ˜์ •๋  ๋•Œ๋งˆ๋‹ค 1์”ฉ ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜, ํ˜„์žฌ์‹œ๊ฐ„์œผ๋กœ ๊ฐฑ์‹ ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. ๊ฐ’์„ ์ˆ˜์ •ํ• ๋–„ Version์ด ๋™์ผํ•˜๋ฉด ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•ด์ง€๊ณ , ๋™์ผํ•˜์ง€ ์•Š์œผ๋ฉด ์ˆ˜์ •์— ์‹คํŒจํ•œ๋‹ค.

์žฅ์ ์œผ๋กœ๋Š” ๋ชจ๋ธ์— ์ปฌ๋Ÿผ์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ตฌํ˜„์ด ๋น„๊ต์ ์œผ๋กœ ์‰ฝ์ง€๋งŒ, ๋‘๊ฐœ์˜ DB์„ธ์…˜์ด ๋™์ผํ•œ ๋ฒ„์ „์œผ๋กœ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํ•œ ๊ฐœ์˜ ์„ธ์…˜์—์„  version conflict์ด ๋ฐœ์ƒํ•˜์—ฌ affected row count๊ฐ€ 0์ด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ ์š”์ฒญ์„ ์žฌ์‹œ๋„ํ•˜๋„๋ก ๊ตฌํ˜„์ด ํ•„์š”.


# 1004 - JAVA์˜ ๋ฒ„์ „๋ณ„ ๋ณ€ํ™”(JAVA SE 10 ~ 15)

# [ Java SE 10 ]

2018๋…„ 3์›” 20์ผ ๋ฐœํ‘œ๋œ ๋ฒ„์ „. ์ผ๋ฐ˜ ์ง€์›์€ 2018๋…„ 9์›”์— ์ข…๋ฃŒ. var ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•œ ์ง€์—ญ ๋ณ€์ˆ˜ ํƒ€์ž…์ถ”๋ก , ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜, ๊ฐœ๋ณ„ ์Šค๋ ˆ๋“œ๋กœ ๋ถ„๋ฆฌ๋œ Stop-The-World, ๋ฃจํŠธ CA ๋ชฉ๋ก ๋“ฑ์ด ์ถ”๊ฐ€. ๋˜ํ•œ JDK์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉ, JVM ํž™ ์˜์—ญ์„ ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๋ฉ”๋ชจ๋ฆฌ์—๋„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์‹คํ—˜ ๊ธฐ๋Šฅ์œผ๋กœ Java ๊ธฐ๋ฐ˜์˜ JIT ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๊ณ , ์ด์ „ ๋ฒ„์ „์—์„œ Deprecated ์ฒ˜๋ฆฌ๋œ API๋Š” Java SE 10์—์„œ ๋ชจ๋‘ ์‚ญ์ œ๋˜์—ˆ๋‹ค.

# [ JAVA SE 11 ]

2018๋…„ 9์›” 25์ผ์— ๋ฐœํ‘œ๋œ ๋ฒ„์ „. ์ผ๋ฐ˜ ์ง€์›์€ 2023๋…„ 9์›”, ์—ฐ์žฅ ์ง€์›์€ 2026๋…„ 9์›”์— ์ข…๋ฃŒ ์˜ˆ์ •. ์ดํด๋ฆฝ์Šค ์žฌ๋‹จ์œผ๋กœ ๋„˜์–ด๊ฐ„ Java EE๊ฐ€ JDK์—์„œ ์‚ญ์ œ๋˜๊ณ , JavaFX๋„ JDK์—์„œ ๋ถ„๋ฆฌ๋˜์–ด ๋ณ„๋„์˜ ๋ชจ๋“ˆ๋กœ ์ œ๊ณต๋œ๋‹ค. Gloun์ด๋ผ๋Š” ์—…์ฒด๊ฐ€ JavaFX๋ฅผ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ด๋ฏ€๋กœ ์ด๊ณณ์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜๋ฉด ๋œ๋‹ค. ๋žŒ๋‹ค ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ์ง€์—ญ ๋ณ€์ˆ˜ ๋ฌธ๋ฒ•, ์—ก์‹ค๋ก  ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ, HTTP ํด๋ผ์ด์–ธํŠธ ํ‘œ์ค€ํ™” ๋“ฑ์˜ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€.

๊ฐ€์žฅ ์ปค๋‹ค๋ž€ ๋ณ€ํ™”๋Š” ๋ฐ”๋กœ ๋ผ์ด์„ ์Šค ๋ถ€๋ถ„. Java SE 11๋ถ€ํ„ฐ Oracle JDK์˜ ๋…์  ๊ธฐ๋Šฅ์ด ์˜คํ”ˆ ์†Œ์Šค ๋ฒ„์ „์ธ OpenJDK์— ์ด์‹๋œ๋‹ค. ์ด๋Š” ๋‹ค์‹œ ๋งํ•ด Oracle JDK์™€ OpenJDK๊ฐ€ ์™„์ „ํžˆ ๋™์ผํ•ด์ง„๋‹ค๋Š” ๋œป์ด๋‹ค. Oracle JDK๋Š” Java SE 11๋ถ€ํ„ฐ LTS(์žฅ๊ธฐ ์ง€์›)๋ฒ„์ „์œผ๋กœ 3๋…„๋งˆ๋‹ค ์ถœ์‹œ๋˜๋Š”๋ฐ, ์ถœ์‹œ ํ›„ 5๋…„ ๋™์•ˆ ์˜ค๋ผํด์˜ ๊ธฐ์ˆ  ์ง€์›์ด ์ œ๊ณต๋˜๊ณ  ์ตœ๋Œ€ 3๋…„๊นŒ์ง€ ์ง€์› ๊ธฐ๊ฐ„์„ ์—ฐ์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. Oracle JDK๋Š” ์ด์ œ 3๋…„์— ํ•œ ๋ฒˆ ์ถœ์‹œ๋˜๋‹ˆ ์ž๋ฐ”์˜ ์‹ค์งˆ์ ์ธ ๋ฒ„์ „ ์—…์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฒƒ์€ OpenJDK๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. OpenJDK๋Š” ๊ธฐ์—…๋“ค์„ ์œ„ํ•œ ๊ธฐ์ˆ  ์ง€์›์€ ์—†๊ณ , ์ƒˆ๋กœ์šด ๋ฒ„์ „์ด ๋‚˜์˜ค๋ฉด ์ด์ „ ๋ฒ„์ „์— ๋Œ€ํ•œ ๋งˆ์ด๋„ˆ ์—…๋ฐ์ดํŠธ์™€ ๋ณด์•ˆ ์—…๋ฐ์ดํŠธ๋Š” ์ค‘๋‹จ๋œ๋‹ค.

Java 11๊ณผ ํ•จ๊ป˜ ๋ฐœํ‘œ๋œ ๋˜ ๋‹ค๋ฅธ ์†Œ์‹์€ Oracle JDK๊ฐ€ ๊ตฌ๋…ํ˜• ์œ ๋ฃŒ ๋ชจ๋ธ๋กœ ์ „ํ™˜๋œ๋‹ค๋Š” ์ ์ด๋‹ค. 2019๋…„ 1์›”๋ถ€ํ„ฐ ์˜ค๋ผํด์ด ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  Oracle JDK๋Š” ์œ ๋ฃŒํ™”๋˜๋ฉฐ, ๊ตฌ๋…๊ถŒ์„ ๊ตฌ์ž…ํ•˜์ง€ ์•Š์œผ๋ฉด Oracle JDK์— ์ ‘๊ทผ ์ž์ฒด๊ฐ€ ๊ธˆ์ง€๋œ๋‹ค. ๊ธฐ์กด์˜ ์ผ๋ฐ˜/์—ฐ์žฅ ์ง€์› ์„œ๋น„์Šค๋Š” ๊ตฌ๋…๊ถŒ์— ํฌํ•จ๋˜๋ฏ€๋กœ ๋ณ„๋„์˜ ์„œ๋น„์Šค๋กœ๋Š” ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ ์‚ฌ์šฉ์ž๋Š” 2021๋…„ 1์›”๋ถ€ํ„ฐ ๋น„์šฉ์„ ์ง€๋ถˆํ•ด์•ผ ํ•œ๋‹ค. ์ด ๋–„๋ฌธ์— ๋งŽ์€ ๊ธฐ์—…๋“ค์ด Oracle JDK์—์„œ ๋ฐœ์„ ๋นผ๊ณ  ์žˆ์œผ๋ฉฐ, OpenJDK๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋‹ค๋ฅธ ์„œ๋“œํŒŒํ‹ฐ JDK๊ฐ€ ๋Œ€์•ˆ์œผ๋กœ ๋– ์˜ค๋ฅด๊ณ  ์žˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ Azul Systems์—์„œ ๊ฐœ๋ฐœํ•œ Zulu JDK๋Š” ์˜ค๋ผํด์˜ TCK(Technology Certification Kit) ์ธ์ฆ์„ ๋ฐ›์€ ๊ตฌํ˜„์ฒด์ด๋‹ค. ๊ฐœ์ธ๊ณผ ๊ธฐ์—… ๋ชจ๋‘ ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ธฐ์ˆ  ์ง€์›์— ํ•œํ•ด์„œ๋งŒ ์œ ๋ฃŒ ์„œ๋น„์Šค๊ฐ€ ์ œ๊ณต๋œ๋‹ค. ๋˜ ๋‹ค๋ฅธ ๋Œ€์•ˆ์œผ๋กœ๋Š” AdoptOpenJDK๊ฐ€ ์žˆ๋Š”๋ฐ, AdoptOpenJDK๋Š” HotStop VM๋Œ€์‹  Eclipse OpenJ9๋ฅผ ํƒ‘์žฌํ•œ ๋ฒ„์ „๋„ ๊ฐ™์ด ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. ๋‹ค๋งŒ ์•„์ง TCK ์ธ์ฆ์„ ๋ฐ›์ง€ ์•Š์•˜๊ธฐ์— ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

# [ JAVA SE 12 ]

2019๋…„ 3์›” 19์ผ ๊ณต๊ฐœ๋œ ๋ฒ„์ „์ด๋‹ค. ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋กœ ๋ฌธ๋ฒ•์ ์œผ๋กœ Switch๋ฌธ์„ ํ™•์žฅํ•œ ๊ฒƒ์ด ์žˆ๋‹ค.

  • AS-IS
switch (day) {  
    case MONDAY:  
    case FRIDAY:  
    case SUNDAY:  
        System.out.println(6);  
        break;    case TUESDAY:  
        System.out.println(7);  
        break;    case THURSDAY:  
    case SATURDAY:  
        System.out.println(8);  
        break;    case WEDNESDAY:  
        System.out.println(9);  
        break;
}
  • TO-BE
switch (day) {  
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);  
    case TUESDAY -> System.out.println(7);  
    case THURSDAY, SATURDAY -> System.out.println(8);  
    case WEDNESDAY -> System.out.println(9);  
}

์ด์™ธ์— ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ๊ฐœ์„ , ๋งˆ์ดํฌ๋กœ ๋ฒค์น˜๋งˆํฌ ํˆด ์ถ”๊ฐ€, ์„ฑ๋Šฅ ๊ฐœ์„ ์˜ ๋ณ€๊ฒฝ์ ์ด ์žˆ๋‹ค.

# [ JAVA SE 13 ]

2019๋…„ 9์›” 17์ผ ๊ณต๊ฐœ๋œ ๋ฒ„์ „์ด๋ฉฐ, java 12์—์„œ์˜ ์Šค์œ„์น˜ ๊ฐœ์„ ์„ ์ด์–ด yield๋ผ๋Š” ์˜ˆ์•ฝ์–ด๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

var a = switch (day) {  
    case MONDAY, FRIDAY, SUNDAY:  
        yield 6;  
    case TUESDAY:  
        yield 7;  
    case THURSDAY, SATURDAY:  
        yield 8;  
    case WEDNESDAY:  
        yield 9;  
};

# [ JAVA SE 14 ]

2020๋…„ 3์›” 18์ผ ๊ณต๊ฐœ๋œ ๋ฒ„์ „์ด๋‹ค. ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์œผ๋กœ instanceof์˜ ํŒจํ„ด ๋งค์นญ๊ณผ record๋ผ๋Š” ๋ฐ์ดํ„ฐ ์˜ค๋ธŒ์ ํŠธ ์„ ์–ธ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ๊ทธ ์™ธ์— ์ธํ๋ฒ ์ดํ„ฐ๋ผ๋Š” ํŒจํ‚ค์ง• ํˆด(OS์— ๋งž์ถ˜ ์‹คํ–‰ํŒŒ์ผ ์ƒ์„ฑ ๊ธฐ๋Šฅ) ์ถ”๊ฐ€ ๋“ฑ์ด ์žˆ๋‹ค.

  • instanceof ํŒจํ„ด ๋งค์นญ
if (!(obj instanceof String s)) {
	.. s.contains(..) ..
} else {
	.. s.contains(..) ..
}
  • record ํƒ€์ž… ์ง€์›
record Point(int x, int y) {}

# [ JAVA SE 15 ]

2020๋…„ 9์›” 15์ผ ๊ณต๊ฐœ๋œ ๋ฒ„์ „.

  • EdDSA ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ถ”๊ฐ€
  • ํŒจํ„ด ๋งค์นญ (2์ฐจ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ์ƒ๋‹จ Java 14 ์ฐธ์กฐ)
  • ์Šค์ผ€์ผ๋ง ๊ฐ€๋Šฅํ•œ ๋‚ฎ์€ ์ง€์—ฐ์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ์ถ”๊ฐ€(ZGC)
  • Solaris ๋ฐ SPARC ํ”Œ๋žซํผ ์ง€์› ์ œ๊ฑฐ
  • ์™ธ๋ถ€ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ API (์ธํ๋ฒ ์ดํŒ…)
  • ๋ ˆ์ฝ”๋“œ (2์ฐจ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ์ƒ๋‹จ Java 14 ์ฐธ์กฐ)
  • ํด๋ž˜์Šค ๋ด‰์ธ (๋ฏธ๋ฆฌ ๋ณด๊ธฐ)
    • ์ƒ์† ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ด‰์ธ ํด๋ž˜์Šค๊ฐ€ ์ œ๊ณต
    • ์ƒ์† ๊ฐ€๋Šฅํ•œ ๋Œ€์ƒ์€ ์ƒ์œ„ ํด๋ž˜์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํŒจํ‚ค์ง€ ๋‚ด์— ์†ํ•ด ์žˆ์–ด์•ผ ํ•œ๋‹ค
package wiki.namu.example.species;  
  
public sealed class Animal  
		Dog,  
	        wiki.namu.example.species.india.Monkey,  
            wiki.namu.example.species.sabana.Leopard  
{  
	// ...  
}
  • ํ…์ŠคํŠธ ๋ธ”๋ก
String html = """ 
				<html>
					<body> 
						<p>Hello, world</p>
					</body>
				</html> 
			""";

# 1005 - TCP์™€ย UDP

TCP์™€ UDP๋Š” TCP/IP์˜ ์ „์†ก๊ณ„์ธต์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ์ „์†ก๊ณ„์ธต์€ IP์— ์˜ํ•ด ์ „๋‹ฌ๋˜๋Š” ํŒจํ‚ท์˜ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ์žฌ์ „์†ก ์š”๊ตฌ ๋“ฑ์˜ ์ œ์–ด๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ณ„์ธต์ด๋‹ค.

# TCP(Transmission Control Protocol)

์ „์†ก์„ ์ œ์–ดํ•˜๋Š” ํ”„๋กœํ† ์ฝœ
์ธํ„ฐ๋„ท์ƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”์„ธ์ง€์˜ ํ˜•ํƒœ๋กœ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด IP์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ TCP์™€ IP๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, IP๊ฐ€ ๋ฐ์ดํ„ฐ์˜ ๋ฐฐ๋‹ฌ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด TCP๋Š” ํŒจํ‚ท์„ ์ถ”์  ๋ฐ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. TCP๋Š” ์—ฐ๊ฒฐํ˜• ์„œ๋น„์Šค๋ฅผ ์ง€์›ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ๋กœ ์ธํ„ฐ๋„ท ํ™˜๊ฒฝ์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

# [ ํŠน์ง• ]

  • ์—ฐ๊ฒฐํ˜• ์„œ๋น„์Šค๋กœ ๊ฐ€์ƒ ํšŒ์„  ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค. (ํŒจํ‚ท ์ „์†ก์„ ์œ„ํ•œ ๋…ผ๋ฆฌ์  ๊ฒฝ๋กœ๋ฅผ ๋ฐฐ์ •)
  • 3-way handshaking๊ณผ์ •์„ ํ†ตํ•ด ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ  4-way handshaking์„ ํ†ตํ•ด ํ•ด์ œํ•œ๋‹ค.
  • ํ๋ฆ„ ์ œ์–ด ๋ฐ ํ˜ผ์žก ์ œ์–ด๋ฅผ ํ•œ๋‹ค.
  • ๋†’์€ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค. (Sequence Number, Ack)
  • UDP๋ณด๋‹ค ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค.
  • ์ „์ด์ค‘(Full-Duplex), ์ ๋Œ€์ (Point to Poin)๋ฐฉ์‹์ด๋‹ค.
  • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋Š” 1๋Œ€ 1๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค.
  • ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค์— ๋ถˆ๋ฆฌํ•˜๋‹ค. (์†์‹ค๋œ ๊ฒฝ์šฐ, ์žฌ์ „์†ก ์š”์ฒญ)

# [ ์žฅ์  ]

  • 3-way handshaking๊ณผ์ •์€ ๋ชฉ์ ์ง€์™€ ์ˆ˜์‹ ์ง€๋ฅผ ํ™•์‹คํžˆ ํ•˜์—ฌ ์ •ํ™•ํ•œ ์ „์†ก์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„ธ์…˜์„ ์ˆ˜๋ฆฝํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. TCP๋Š” ์—ฐ๊ฒฐํ˜• ์„œ๋น„์Šค๋กœ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— 3-way handshaking์˜ ๊ณผ์ •๋„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ณ , ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์ œ์–ด๋‚˜ ํ˜ผ์žก ์ œ์–ด์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ๋„ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋•Œ๋ฌธ์— UDP๋ณด๋‹ค ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค.
  • ํ†ต์‹ ์˜ ์‹ ๋ขฐ์„ฑ์ด ๋†’๋‹ค.

# [ ๋‹จ์  ]

  • ๋ฐ์ดํ„ฐ๋กœ ๋ณด๋‚ด๊ธฐ์ „์— ๋ฐ˜๋“œ์‹œ ์—ฐ๊ฒฐ์ด ํ˜•์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • 1:1 ํ†ต์‹ ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๊ณ ์ •๋œ ํ†ต์‹  ๊ฒฝ๋กœ๊ฐ€ ์ตœ๋‹จ์„ ์ด ์•„๋‹๊ฒฝ์šฐ ์ƒ๋Œ€์ ์œผ๋กœ UDP๋ณด๋‹ค ๋ฐ์ดํ„ฐ ์ „์†ก์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค.

# UDP(User Datagram Protocol)

์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๊ทธ๋žจ ํ”„๋กœํ† ์ฝœ
๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๊ทธ๋žจ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ๊ทธ๋žจ์ด๋ž€ ๋…๋ฆฝ์ ์ธ ๊ด€๊ณ„๋ฅผ ์ง€๋‹ˆ๋Š” ํŒจํ‚ท์ด๋‹ค.
TCP์™€ ๋‹ฌ๋ฆฌ UDP๋Š” ๋น„์—ฐ๊ฒฐํ˜• ํ”„๋กœํ† ์ฝœ๋กœ ์—ฐ๊ฒฐ์„ ์œ„ํ•ด ํ• ๋‹น๋˜๋Š” ๋…ผ๋ฆฌ์  ๊ฒฝ๋กœ๊ฐ€ ์—†๋‹ค. ๋•Œ๋ฌธ์— ๊ฐ๊ฐ์˜ ํŒจํ‚ท์€ ๋‹ค๋ฅธ๊ฒฝ๋กœ๋กœ ์ „์†ก๋˜๊ณ , ๊ฐ๊ฐ์˜ ํŒจํ‚ท์€ ๋…๋ฆฝ์ ์ธ ๊ด€๊ณ„๋ฅผ ์ง€๋‹ˆ๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋…๋ฆฝ์ ์ธ ๊ฒฝ๋กœ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
์ฆ‰, UDP๋Š” ๋ฐœ์‹ ์ž๊ฐ€ ๋ฐ์ดํ„ฐ ํŒจํ‚ท์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ณด๋‚ด๋”๋ผ๋„ ์ด ํŒจํ‚ท๋“ค์€ ์„œ๋กœ ๋‹ค๋ฅธ ํ†ต์‹  ์„ ๋กœ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋‹ค. ๋จผ์ € ๋ณด๋‚ธ ํŒจํ‚ท์ด ๋Š๋ฆฐ ์„ ๋กœ๋ฅผ ํ†ตํ•ด ์ „์†ก๋  ๊ฒฝ์šฐ ๋‚˜์ค‘์— ๋ณด๋‚ธ ํŒจํ‚ท๋ณด๋‹ค ๋Šฆ๊ฒŒ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ตœ์•…์˜ ๊ฒฝ์šฐ ์œ ์‹ค๋  ์ˆ˜๋„ ์žˆ๋‹ค. UDP๋Š” ์ค‘๊ฐ„์— ํŒจํ‚ท์ด ์œ ์‹ค์ด๋‚˜ ๋ณ€์กฐ๊ฐ€ ๋˜์–ด๋„ ์žฌ์ „์†ก์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

# [ ํŠน์ง• ๋ฐ ์žฅ์  ]

  • ๋น„์—ฐ๊ฒฐํ˜• ์„œ๋น„์Šค๋กœ ๋ฐ์ดํ„ฐํฌ๋žจ ๋ฐฉ์‹์ด๋‹ค. (์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ  ํ•ด์ œํ•˜๋Š” ๊ณผ์ •์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.)
  • ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„๋•Œ ์ •๋ณด๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜ ๋ฐ›๋Š”๋‹ค๋Š” ์‹ ํ˜ธ์ ˆ์ฐจ๊ฐ€ ์—†๋‹ค.
  • UDPํ—ค๋”์˜ CheckSum ํ•„๋“œ๋ฅผ ํ†ตํ•ด ์ตœ์†Œํ•œ์˜ ์˜ค๋ฅ˜๋งŒ ๊ฒ€์ถœํ•œ๋‹ค.
  • TCP๋ณด๋‹ค ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.
  • ์‹ ๋ขฐ์„ฑ๋ณด๋‹ค๋Š” ์—ฐ์†์„ฑ์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค(์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค)์—์„œ ์ž์ฃผ ์‚ฌ์šฉ.
  • ์†Œ์ผ“ ๋Œ€์‹  IP์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก.
  • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ตฌ๋ถ„์ด ์—†๋‹ค. (1:1, 1:N, N:M ๋“ฑ์œผ๋กœ ์—ฐ๊ฒฐ๊ฐ€๋Šฅ)

# [ ๋‹จ์  ]

  • ์‹ ๋ขฐ์„ฑ์ด ๋‚ฎ๋‹ค.
  • ํ๋ฆ„์ œ์–ด(flow control)๊ฐ€ ์—†์–ด์„œ ํŒจํ‚ท์ด ์ œ๋Œ€๋กœ ์ „์†ก๋˜์—ˆ๋Š”์ง€, ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค.

# 1007 - ์ž๋ฐ”์—์„œ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” 3๊ฐ€์ง€ ํ‚ค์›Œ๋“œ

# 1. synchronized

synchronized ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ธ”๋Ÿญ์˜ ์•ก์„ธ์Šค๋ฅผ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ synchronized๊ฐ€ ์„ ์–ธ๋œ ๋ธ”๋Ÿญ์—๋Š” ๋™์‹œ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์˜ˆ์ œ
public class SomeClass {
    // ๋ฉ”์„œ๋“œ ์ „์ฒด์— ๋™๊ธฐํ™” ์ ์šฉ
    public synchronized void foo() { 
        /* critical section */
    }

    // ๋‚ด๋ถ€์— ๋™๊ธฐํ™” ๋ธ”๋Ÿญ ์ƒ์„ฑ
    public void bar() {
        synchronized (this) {
            /* critical section */
        }
    }
}

// ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ์ „์—ญ ๋ฉ”์„œ๋“œ์—์„œ ๋™๊ธฐํ™” ๋ธ”๋Ÿญ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•
public class SomeClass {
    public static void syncMethod() {
        synchronized (SomeClass.class) {
            /* critical section */
        }
    }
}
  • synchronized method
    • ๋™๊ธฐํ™”๋ฅผ ์‹œํ‚ค๊ณ  ์‹ถ์€ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ์— synchronized ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๋ฉด ๋˜๊ณ , synchronized method๋Š” ์ธ์Šคํ„ด์Šค ๋‹จ์œ„์˜ synchronized ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์€ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ lock ๊ณต์œ ํ•œ๋‹ค.
  • static synchronized method
    • static synchronized method ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค ๋‹จ์œ„๋กœ lock์„ ๊ณต์œ ํ•˜๋ฉฐ, synchronized method์™€ ๋™์ผํ•˜๊ฒŒ ํ•จ์ˆ˜ ๊ฐ„์˜ ๋™๊ธฐํ™”๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋งŒ์•ฝ synchronized method๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ธ์Šคํ„ด์Šค ๋ฝ๊ณผ ํด๋ž˜์Šค ๋ฝ์€ ๊ณต์œ ๊ฐ€ ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋™๊ธฐํ™” ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
  • synchronized block
    • synchronized(this) : ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋“ค์–ด์™€ ์„œ๋กœ ๋‹ค๋ฅธ block์„ ํ˜ธ์ถœํ•ด๋„ this๋ฅผ ์‚ฌ์šฉํ•ด ์ž์‹ ์— lock์„ ๊ฑธ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค.
    • synchronized(Object) : block๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ lock์„ ๊ฑธ๋ฆฌ๊ฒŒํ•ด ํ›จ์”ฌ ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • static synchronized block
    • ํด๋ž˜์Šค ๋‹จ์œ„๋กœ lock์„ ๊ณต์œ ํ•˜๋‚˜ lock๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•˜๊ณ  block์œผ๋กœ ๋ฒ”์œ„๋ฅผ ํ•œ์ •์ง€์„ ์ˆ˜ ์—†๋‹ค.

# 2. volatile

JVM์—์„œ ์Šค๋ ˆ๋“œ๋Š” ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” CPU ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•œ๋‹ค(CPU Cache). ๋”ฐ๋ผ์„œ ๋ฉ€ํ‹ฐ ์ฝ”์–ด ํ”„๋กœ์„ธ์„œ์—์„œ ๋‹ค์ˆ˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ€์ˆ˜ a๋ฅผ ๊ณต์œ ํ•˜๋”๋ผ๋„ ์บ์‹ฑ๋œ ์‹œ์ ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„œ๋กœ ๋‹ค๋ฅธ ์ฝ”์–ด์˜ ์Šค๋ ˆ๋“œ๋Š” ๋ฐ์ดํ„ฐ ๊ฐ’์ด ๋ถˆ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.
์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•ด ์ฃผ์ง€ ์•Š๋Š” ์ด์ƒ ์บ์‹ฑ ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ธ์ œ ๊ฐฑ์‹ ๋˜๋Š”์ง€ ๋˜ํ•œ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์—†๋‹ค.
์ด๋Ÿฐ ๊ฒฝ์šฐ volatileํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CPU ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์บ์‹ฑ๋œ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ํ•ญ์ƒ ์ตœ์‹ ์˜ ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—์„œ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. -> ์ฆ‰, ๋™์ผ ์‹œ์ ์— ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ๋™๊ธฐํ™”ํ•œ๋‹ค.

public volatile long count = 0;

ํ•˜์ง€๋งŒ volatile์„ ํ†ตํ•ด ๋ชจ๋“  ๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š”๊ฑด ์•„๋‹ˆ๋‹ค. ์›์ž์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋Š” ๋™์ผํ•˜๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค.(๋‹จ์ง€ ๋ฉ€ํ‹ฐ ์ฝ”์–ด์—์„œ์˜ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์บ์‹œ ์—†์ด ์ตœ์‹ ์˜ ๊ฐ’์„ ๋ณด๊ฒŒ ํ• ๋ฟ)

# Atomic ํด๋ž˜์Šค

์•ž์—์„œ ์„ค๋ช…ํ•œ ๋‘ ๊ฐ€์ง€ ํ‚ค์›Œ๋“œ synchronized, volatile๋งŒ์œผ๋กœ๋Š” ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค.
์ž๋ฐ”์—์„œ๋Š” ์œ„ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๋น„-์›์ž์  ์—ฐ์‚ฐ์—์„œ๋„ ๋™๊ธฐํ™”๋ฅผ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค ๋ชจ์Œ์„ ์ œ๊ณตํ•œ๋‹ค.

java.util.concurrent.* (๋Œ€ํ‘œ์ ์œผ๋กœ ์ปฌ๋ ‰์…˜, Wrapper ํด๋ž˜์Šค ๋“ฑ์ด ์žˆ๋‹ค.)

  • java.util.concurrent.atomic.AtomicLong
public class AtomicLong extends Number implements java.io.Serializable {
	
    private volatile long value; // volatile ํ‚ค์›Œ๋“œ๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ๋‹ค.
	
    public final long incrementAndGet() { // value ๊ฐ’์„ ์‹ค์ œ๋กœ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฉ”์„œ๋“œ
        return U.getAndAddLong(this, VALUE, 1L) + 1L;
    }
}
  • jdk.internal.misc.Unsafe
public final class Unsafe {
    // ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ’๊ณผ CPU์— ์บ์‹œ๋œ ๊ฐ’์„ ๋น„๊ตํ•ด ๋™์ผํ•œ ๊ฒฝ์šฐ์—๋งŒ update ์ˆ˜ํ–‰
    public final long getAndAddLong(Object o, long offset, long delta) {
        long v;
        do {
            v = getLongVolatile(o, offset);
        } while (!weakCompareAndSetLong(o, offset, v, v + delta)); // CAS ์•Œ๊ณ ๋ฆฌ์ฆ˜ (JNI ์ฝ”๋“œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.)
        return v;
    }
}

Non-Blocking ์ž„์—๋„ ๋™์‹œ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ์ด์œ ๋Š” CAS(Compare-and-swap) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • valatile ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด์„œ ํ˜„์žฌ ์Šค๋ ˆ๋“œ์— ์ €์žฅ๋œ ๊ฐ’๊ณผ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.
    • ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๊ต์ฒด(thread-safe ํ•œ ์ƒํƒœ์ด๋ฏ€๋กœ ๋กœ์ง ์ˆ˜ํ–‰)
    • ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์‹คํŒจ ํ›„ ์žฌ์‹œ๋„(thread-safe ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์˜€์œผ๋ฏ€๋กœ ์žฌ์‹œ๋„)

์„ฑ๋Šฅ๋น„๊ต ๋ฐ ๋งˆ๋ฌด๋ฆฌ

  • Blocking(synchronized)
private static long startTime = System.currentTimeMillis();
private static int maxCnt = 1000;
private static long count = 0;

@Test
void threadNotSafe() throws Exception {
    for (int i = 0; i < maxCnt; i++) {
        new Thread(this::plus).start();
    }

    Thread.sleep(2000); // ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋ ๋•Œ ๊นŒ์ง€ ์ž ๊น ๋Œ€๊ธฐ
    Assertions.assertThat(count).isEqualTo(maxCnt);
}

public synchronized void plus() {
    if (++count == maxCnt) {
        System.out.println(System.currentTimeMillis() - startTime);
    }
    try {
        Thread.sleep(1);
    } catch (InterruptedException e) {
    }
}

ํ‰๊ท  1300ms ์ •๋„ ์†Œ์š”๋˜์—ˆ๋‹ค. (Blocking ์—ฐ์‚ฐ์—์„œ 1000๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ๊ฐ 1ms์˜ ์ถ”๊ฐ€ ๋”œ๋ ˆ์ด๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ)

  • Non-Blocking (AtomicLong)
private static long startTime = System.currentTimeMillis();
private static int maxCnt = 1000;
private static AtomicLong count2 = new AtomicLong();

@Test
void threadNotSafe2() throws Exception {
    for (int i = 0; i < maxCnt; i++) {
        new Thread(this::plus2).start();
    }

    Thread.sleep(2000); // ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋ ๋•Œ ๊นŒ์ง€ ์ž ๊น ๋Œ€๊ธฐ
    Assertions.assertThat(count2.get()).isEqualTo(maxCnt);
}

public void plus2() {
    if (count2.incrementAndGet() == maxCnt) {
        System.out.println(System.currentTimeMillis() - startTime);
    }
    try {
        Thread.sleep(1);
    } catch (InterruptedException e) {
    }
}

ํ‰๊ท  140ms ์ •๋„ ์†Œ์š”๋˜์—ˆ๋‹ค. (Non-Blocking ์—ฐ์‚ฐ์—์„œ 1ms์˜ ์ถ”๊ฐ€ ๋”œ๋ ˆ์ด๋Š” ํฐ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.)

์ž„์˜๋กœ ๋”œ๋ ˆ์ด๋ฅผ ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋“œ๋ผ๋งˆํ‹ฑํ•˜๊ฒŒ ์ฐจ์ด๊ฐ€๋‚œ๋‹ค


# 1008 - ์ž๋ฐ” ์„ค๊ณ„ ๊ฒฐํ•จ

# 1. Generics์˜ ํƒ€์ž…์„ Runtime์— ํ™œ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

  • ์ œ๋„ค๋ฆญ์ด๋ž€?

    • ์ž๋ฐ”์˜ ์ œ๋„ค๋ฆญ์ด๋ž€ ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜๋“ฑ์— type์„ ๋งˆ์น˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์ฒ˜๋Ÿผ ๋„ฃ์–ด ์คŒ์œผ๋กœ์„œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ฏธ๋ฆฌ ํƒ€์ž…์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ถœ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฐœ๋….
  • ์ œ๋„ค๋ฆญ์˜ ํ•œ๊ณ„

    • ์ œ๋„ค๋ฆญ์„ ํ™œ์šฉํ•ด ์ปดํŒŒ์ผ ํƒ€์ž„์— ํƒ€์ž… ์ฒดํฌ๋ฅผ ํ•˜๊ณ  ๋‚˜๋ฉด ์ œ๋„ค๋ฆญ ์ธ์ž๋กœ ๋„˜๊ฒจ์ ธ ์˜จ ํƒ€์ž…์€ Type erasure๋ผ๋Š” ์ ˆ์ฐจ๋ฅผ ํ†ตํ•ด ์ œ๊ฑฐ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ธ์ž๋กœ ๋„˜๊ฒจ์ง„ ํƒ€์ž…์€ Runtime์—์„œ๋Š” ํ™œ์šฉ ๋  ์ˆ˜ ์—†๋‹ค.
ArrayList<Integer> li = new ArrayList<Integer>();
ArrayList<Float> lf = new ArrayList<Float>();
if (li.getClass() == lf.getClass()) { // evaluates to true
    System.out.println("Equal");
}
  • ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์ธ์ž ๊ฐ’์ด ๋‹ค๋ฅด์ง€๋งŒ ๊ฐ™์€ ํด๋ž˜์Šค๋กœ ์ธ์ •๋œ๋‹ค. Runtime์—๋Š” ํƒ€์ž…์ด ์ง€์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
public class MyClass<E> {
    public static void myMethod(Object item) {
        if (item instanceof E) {  //Compiler error
            ...
        }
        E item2 = new E();   //Compiler error
        E[] iArray = new E[10]; //Compiler error
    }
}
  • ๋˜ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ์—์„œ instanceof. new๋“ฑ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋„ Type erasure ๋•Œ๋ฌธ์ด๋‹ค.

# 2. Unsigned integer types๊ฐ€ ์—†๋‹ค.

  • ์ž๋ฐ”์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ c, c++๋“ฑ์—์„œ ์กด์žฌํ•˜๋Š” unsigned ์ž๋ฃŒํ˜•์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์•”ํ˜ธํ•™๊ณผ ๊ฐ™์ด ๋งค์šฐ ํฐ ์–‘์˜ ์ •์ˆ˜๋ฅผ ํ™œ์šฉํ•ด ๋‹ค์–‘ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ถ„์•ผ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์— ๋ถ€์ ํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 2์˜ ๋ณด์ˆ˜ ํ‘œํ˜„์ด๋‚˜ ๋น„ํŠธ๊ด€์ ์—์„œ์˜ ํ‘œํ˜„์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ธ๋‹ค๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœํ•  ๋•Œ์˜ ์ถ”๊ฐ€์ ์ธ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜๋‹ค.

# 3. Operator everloading์„ ํ•  ์ˆ˜ ์—†๋‹ค.

  • ์ž๋ฐ”์—์„œ๋Š” ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.(์˜ˆ์™ธ์ ์œผ๋กœ String์˜ +, += ์—ฐ์‚ฐ์ž๋งŒ์ด ์œ ์ผํ•˜๊ฒŒ ์กด์žฌํ•œ๋‹ค.)
  • ์ˆ˜ํ•™์ ์ธ ๋‚ด์šฉ์˜ ๊ฐ์ฒด๋“ค์— ๋Œ€ํ•ด์„œ ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ณ  ํ™œ์šฉํ•˜๋Š”๋ฐ์— ๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค.

# 4. ๋ฐฐ์—ด ํฌ๊ธฐ๊ฐ€ 2^31์œผ๋กœ ์ œํ•œ๋œ๋‹ค.

  • ๋ฉ”๋ชจ๋ฆฌ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐฐ์—ด์ž์ฒด์˜ ํฌ๊ธฐ๋ฅผ int์ž๋ฃŒํ˜•์œผ๋กœ ์ •์˜ํ•˜๊ธฐ๋กœ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— 2^31๋ณด๋‹ค ํฐ ๋ฐฐ์—ด์€ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค.

# 5. primitives type๊ณผ Array๊ฐ€ ํด๋ž˜์Šค์™€ ๋‹ค๋ฅด๊ฒŒ ์ทจ๊ธ‰๋จ.

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

# 1009 - Jackson ObjectMapper

@Getter
@Setter
@NoArgsConstructor
public class Cat {
    private String name;

    public Cat(String name) {
        this.name = name;
    }
}
  • Object to Json
ObjectMapper objectMapper = new ObjectMapper();

Cat cat = new Cat("kitty");
String catString = objectMapper.writeValueAsString(cat);
System.out.println("catString : " + catString);

--- output ---
catString : {"name":"kitty"}
  • Json to Object
String json = "{\"name\":\"kitty\"}";
Cat cat2 = objectMapper.readValue(json, Cat.class);
System.out.println("cat2 name :  " + cat2.getName());

--- output ---
cat2 name :  kitty
  • Json to Jackson JsonNode
JsonNode jsonNode = objectMapper.readTree(json);
String name = jsonNode.get("name").asText();
System.out.println("Tree cat2 name : " + name);

--- output ---
Tree cat2 name : kitty
  • Json List to List
String jsonList = "[{\"name\":\"kitty\"},{\"name\":\"kitty2\"}]";
List<Cat> cats = objectMapper.readValue(jsonList, new TypeReference<List<Cat>>() {});
for (Cat catElement : cats) {
    System.out.println("catElement : " + catElement.getName());
}

--- output ---
catElement : kitty
catElement : kitty2
Last update: October 11, 2022 23:25
Contributors: jaesungahn91