Notice
Recent Posts
Recent Comments
Link
ยซ   2024/09   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

BUILD_SSO

[Java] ์ž๋ฐ” ํ…Œํฌ ์ธํ„ฐ๋ทฐ part3 ๋ณธ๋ฌธ

Tech Interview

[Java] ์ž๋ฐ” ํ…Œํฌ ์ธํ„ฐ๋ทฐ part3

sohyeonnn 2023. 6. 13. 18:08

๐Ÿ‘‰๐ŸปJava 8

โ—ผ ์ŠคํŠธ๋ฆผStream API์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • Java 8์—์„œ ๋‚˜์˜จ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค, ์ผ๋ จ์˜ element ๋“ค์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์„ ์ˆœ์ฐจ์ , ๋˜๋Š” ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์ค€๋‹ค.
  • ๋ฐ์ดํ„ฐ ์†Œ์Šค์— ๋Œ€ํ•œ ๊ณตํ†ต๋œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์ŠคํŠธ๋ฆผ์€ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ŠคํŠธ๋ฆผ์€ ์™ธ๋ถ€ ๋ฐ˜๋ณต์„ ํ†ตํ•ด ์ž‘์—…ํ•˜๋Š” ์ปฌ๋ ‰์…˜๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋‚ด๋ถ€ ๋ฐ˜๋ณต(internal iteration)์„ ํ†ตํ•ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ์ŠคํŠธ๋ฆผ์€ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์ปฌ๋ ‰์…˜๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ŠคํŠธ๋ฆผ์˜ ์—ฐ์‚ฐ์€ ํ•„ํ„ฐ(filter)-๋งต(map) ๊ธฐ๋ฐ˜์˜ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์—ฐ(lazy) ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•œ๋‹ค.
  • ์ŠคํŠธ๋ฆผ์€ parallelStream() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ ์†์‰ฌ์šด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค.
  • ์ŠคํŠธ๋ฆผ์€ [์ŠคํŠธ๋ฆผ์˜ ์ƒ์„ฑ -> ์ŠคํŠธ๋ฆผ์˜ ์ค‘๊ฐœ ์—ฐ์‚ฐ -> ์ŠคํŠธ๋ฆผ์˜ ์ตœ์ข… ์—ฐ์‚ฐ] ์˜ ์„ธ ๊ฐ€์ง€ ๋‹จ๊ณ„์— ๊ฑธ์ณ์„œ ๋™์ž‘ํ•˜๋ฉฐ, ์ค‘๊ฐœ ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ Streamํ˜•ํƒœ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์†์ ์œผ๋กœ ์—ฐ๊ฒฐํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ ์ŠคํŠธ๋ฆผ์ด ๋‚˜์˜ค๊ฒŒ๋œ ์ด์œ ๋Š”?

  • ์ž๋ฐ”์—์„œ ๋ฐฐ์—ด์ด๋‚˜ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ ์—ฌ๊ธฐ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋ณต๋ฌธ์ด๋‚˜ ๋ฐ˜๋ณต์ž(Iterator)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•ด์•ผํ–ˆ๋Š”๋ฐ, ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๊ณ  ๊ฐ€๋…์„ฑ๋„ ๋–จ์–ด์ง€๊ณ , ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์ด ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์˜ ์ฝ”๋“œ๊ฐ€ ํƒ„์ƒํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์ŠคํŠธ๋ฆผ์ด ๋“ฑ์žฅํ–ˆ๋‹ค.

โ—ผ ์ผ๋ฐ˜์ ์ธ for-loop ๋ณด๋‹ค ์ŠคํŠธ๋ฆผ์˜ for-each๊ฐ€ ๋Š๋ฆฐ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • ์ตœ์ ํ™”๋ฌธ์ œ
    Stream์˜ ๊ฒฝ์šฐ ๋น„๊ต์  ์ตœ๊ทผ์— ๋‚˜์˜จ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— Stream์— ๋Œ€ํ•ด์„  ์ถฉ๋ถ„ํ•œ ์ตœ์ ํ™”๊ฐ€ ์ง„ํ–‰๋˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๋ผ๋Š” ์ถ”์ธก
  • for๋ฌธ์€ ๋‹จ์ˆœ ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜
    for๋ฌธ์€ ๋‹จ์ˆœ ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ๋„๋Š” ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์ด๊ธฐ ๋•Œ๋ฌธ์— Stream์— ๋น„ํ•ด ๋น ๋ฅด๊ณ  ์˜ค๋ฒ„ํ—ค๋“œ๋„ ์—†๋‹ค.
    stream์˜ ๊ฒฝ์šฐ๋Š” JVM์ด ์ฒ˜๋ฆฌํ•ด์ค˜์•ผํ•˜๋Š” ๊ฒƒ๋“ค์ด ๋งŽ์•„ ์‹คํ–‰ ์‹œ ๋Š๋ฆด ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

โ—ผ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์—๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ž€ 1 ๊ฐœ์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งํ•œ๋‹ค.
    โžก ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋‚˜๋ผ๋Š” ๋œป์€ default method ๋˜๋Š” static method ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•ด๋„ ์ƒ๊ด€ ์—†๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
  • Java8 ๋ถ€ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋ฅผ ํฌํ•จํ•œ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ (default method) ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋”๋ผ๋„ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ค์ง ํ•˜๋‚˜๋ฉด ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
  • ์ž๋ฐ”์˜ ๋žŒ๋‹ค ํ‘œํ˜„์‹์€ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • @FunctionalInterface ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค ์กฐ๊ฑด์— ๋งž๋Š”์ง€ ๊ฒ€์‚ฌํ•ด์ค€๋‹ค.
  • @FunctionalInterface ์–ด๋…ธํ…Œ์ด์…˜์ด ์—†์–ด๋„ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋™์ž‘ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๋Š” ์—†์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค ๊ฒ€์ฆ๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ๋ถ™์—ฌ์ฃผ๋Š” ๊ฒŒ ์ข‹๋‹ค.

โ—ผ Java์—์„œ ๊ธฐ๋ณธ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์—๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

//๊ธฐ๋ณธ ์˜ˆ์‹œ ํƒ€์ž…
@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
}
  • Predicate
    Predicate ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋Š” T ํƒ€์ž…์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„ boolean ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    โžก boolean test(T t);
  • Consumer
    ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด Consumer ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์†Œ๋น„ํ•˜๊ณ  ์•„๋ฌด๊ฒƒ๋„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. T ํƒ€์ž…์˜ ์ธ์ž์— ๋Œ€ํ•ด ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ˜ํ™˜ ํƒ€์ž…์€ void์ž…๋‹ˆ๋‹ค. 
    โžก void accept(T t);
  • Supplier
    Supplier ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ณต๊ธ‰์ž๋ผ๋Š” ์ด๋ฆ„์ฒ˜๋Ÿผ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ›์ง€ ์•Š๊ณ  T ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    โžก T get();
  • Function
    Function ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋Š” T ํƒ€์ž…์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ›„ R ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    ์ˆ˜ํ•™์‹์—์„œ์˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํŠน์ • ๊ฐ’์„ ๋ฐ›์•„์„œ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋ฉฐ, T ์™€ R ์€ ๊ฐ™์€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    Consumer์™€ Supplier์˜ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค.
    โžก R apply(T t);
  • Runnable
    Runnable ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. run() ๋ฉ”์„œ๋“œ์— ์ •์˜๋œ ์ฝ”๋“œ๋งŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    Runnable ์ด๋ผ๋Š” ์ด๋ฆ„์— ๋งž๊ฒŒ "์‹คํ–‰ ๊ฐ€๋Šฅํ•œ" ์ด๋ผ๋Š” ๋œป์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์‹คํ–‰๋งŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

โ—ผ Optional ์—๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • Java8์—์„œ๋Š” Optional<T> ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด NPE(NullPointerException)๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. 
  • Optional<T>๋Š” null์ด ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ๊ฐ์‹ธ๋Š” Wrapper ํด๋ž˜์Šค๋กœ, ์ฐธ์กฐํ•˜๋”๋ผ๋„ NPE๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๋„์™€์ค€๋‹ค. Optional ํด๋ž˜์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ value์— ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด null์ด๋”๋ผ๋„ ๋ฐ”๋กœ NPE๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ข… ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค.

โžก ์ฆ‰, Optional์€ null ๋˜๋Š” ๊ฐ’์„ ๊ฐ์‹ธ์„œ NPE(NullPointerException)๋กœ๋ถ€ํ„ฐ ๋ถ€๋‹ด์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ Wrapper ํด๋ž˜์Šค์ด๋‹ค.


๐Ÿ‘‰๐ŸปModifier

โ—ผ ์ œ์–ด์ž๋ž€(modifier) ?

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

  • ์ ‘๊ทผ์ œ์–ด์ž๋ž€
    ๋ณ€์ˆ˜ ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” Java์˜ ์˜ˆ์•ฝ์–ด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด 4๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ ‘๊ทผ ์ œ์–ด์ž๋Š” ํ•œ ๋ฒˆ์— ๋„ค ๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜๋งŒ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • public์€ ์ ‘๊ทผ ์ œํ•œ์ด ์—†์œผ๋ฏ€๋กœ, ๊ฐ™์€ ํ”„๋กœ์ ํŠธ ๋‚ด ์–ด๋””์„œ๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • protected๋Š” ํ•ด๋‹น ํŒจํ‚ค์ง€ ๋‚ด, ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ์ƒ์†๋ฐ›์•„ ์ž์† ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • default๋Š” ํ•ด๋‹น ํŒจํ‚ค์ง€ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • private๋Š” ํ•ด๋‹น ํด๋ž˜์Šค ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ์™ธ์˜ ์ œ์–ด์ž
    • static์€ ํด๋ž˜์Šค์˜, ๊ณตํ†ต์ ์ธ์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. static์ด ๋ถ™์€ ๋ฉค๋ฒ„๋ณ€์ˆ˜์™€ ๋ฉ”์ˆ˜๋“œ, ์ดˆ๊ธฐํ™” ๋ธ”๋Ÿญ์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค์— ๊ด€๊ณ„๋œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„ ์—†์ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • final์€ ๋งˆ์ง€๋ง‰์˜, ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๊ฑฐ์˜ ๋ชจ๋“  ๋Œ€์ƒ์— ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • abstract์€ ์ถ”์ƒ์˜, ๋ฏธ์™„์„ฑ์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋ฉ”์„œ๋“œ์˜ ์„ ์–ธ๋ถ€์—๋งŒ ์ž‘์„ฑํ•˜๊ณ , ์‹ค์ œ ์ˆ˜ํ–‰๋‚ด์šฉ์€ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค

โ—ผ ๋ฉ”์†Œ๋“œ parameter ์— final ์— ๋ถ™์ด๋Š” ๊ฒฝ์šฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋Š”์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

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

๐Ÿ‘‰๐ŸปSynchronization

โ—ผ ๋™๊ธฐํ™”(synchronization) ๋ž€?

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

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

โ—ผ synchronized ๋ฅผ ์‚ฌ์šฉํ•  ์‹œ sychronized method, sychronized block, static sychronized method, static synchonized block ์˜ 4๊ฐ€์ง€ ์“ฐ์ž„์ƒˆ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • sychronized method
    • ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ์— lock์„ ๊ฒ๋‹ˆ๋‹ค.
    • ์ธ์Šคํ„ด์Šค์— lock์„ ๊ฑฐ๋Š” synchronized ํ‚ค์›Œ๋“œ๋Š” synchronized๊ฐ€ ์ ์šฉ๋œ ๋ฉ”์„œ๋“œ๋ผ๋ฆฌ ์ผ๊ด„์ ์œผ๋กœ lock์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
  • static sychronized method
    • static์ด ๋ถ™์€ synchronized method๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” static ์„ฑ์งˆ์„ ๊ฐ–์œผ๋ฏ€๋กœ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค ๋‹จ์œ„ ๋กœ lock์„ ๊ฒ๋‹ˆ๋‹ค.
    • ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋”๋ผ๋„ static ๋ฉ”์„œ๋“œ์— synchronized๊ฐ€ ๋ถ™์€ ๊ฒฝ์šฐ lock์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    •  static synchronized method์™€ synchronized method์˜ lock์€ ๊ณต์œ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • sychronized block
    • ์ธ์Šคํ„ด์Šค์˜ block ๋‹จ์œ„ ๋กœ lock์„ ๊ฑธ๊ณ  lock ๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • block์— this๋ฅผ ๋ช…์‹œํ•  ๊ฒฝ์šฐ method์— synchornized๋ฅผ ๋ถ™์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ธ์Šคํ„ด์Šค ๋‹จ์œ„๋กœ lock์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
    • block์—๋Š” ๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๊ณ  class ํ˜•์‹์œผ๋กœ ๋„˜๊ธฐ๋ฉด ํ•ด๋‹น class์— lock์„ ๊ฑธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • static synchonized block 
    • this์™€ ๊ฐ™์ด ํ˜„์žฌ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ํ‘œํ˜„์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • static synchronized method ๋ฐฉ์‹๊ณผ์˜ ์ฐจ์ด๋Š” lock ๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•˜๊ณ  block ๋ฒ”์œ„๋ฅผ ํ•œ์ • ์ง€์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋‹จ์œ„๋กœ lock์„ ๊ณต์œ ํ•œ๋‹ค๋Š” ์ ์€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • block์˜ ์ธ์ž๋กœ ์ •์  ์ธ์Šคํ„ด์Šค๋‚˜ ํด๋ž˜์Šค๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โ—ผ synchronized ์‚ฌ์šฉ ์‹œ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • ์ƒํ˜ธ ๋ฐฐ์ œ (Mutual Exclusion) : ํ•œ ์ž์›์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ ๋™์‹œ ์ ‘๊ทผ ๋ถˆ๊ฐ€
  • ์ ์œ ์™€ ๋Œ€๊ธฐ (Hold and Wait) : ์ž์›์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ž์› ๋ฐ˜๋‚ฉ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ
  • ๋น„์„ ์  (Non Preemptive) : ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์˜ ์ž์›์„ ์‹คํ–‰ ์ค‘๊ฐ„์— ๊ฐ•์ œ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Œ
  • ํ™˜ํ˜•๋Œ€๊ธฐ (Circle Wait) : ๊ฐ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ˆœํ™˜์ ์œผ๋กœ ๋‹ค์Œ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์š”๊ตฌํ•˜๋Š” ์ž์›์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ

์œ„์˜ 4๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋ชจ๋‘ ์ถฉ์กฑํ•  ๊ฒฝ์šฐ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜์—ฌ ์•„๋ฌด๋Ÿฐ ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•œ ์ฑ„ ๋ฌดํ•œ์ • ๋Œ€๊ธฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

โ—ผ volatile ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋™๊ธฐํ™” ๋ฌธ์ œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด volatileํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜๋ฅผ volatile๋กœ ์„ ์–ธํ•˜๋ฉด ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋ผ๋„ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

ํŠน์ง•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • volatile๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๋Š” ์ตœ์ ํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • volatile ํ‚ค์›Œ๋“œ๋Š” ๋ณ€์ˆ˜๋ฅผ 'Main Memory์— ์ €์žฅํ•˜๊ฒ ๋‹ค'๋ผ๊ณ  ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋ณ€์ˆ˜์˜ ๊ฐ’์„ Readํ•  ๋•Œ๋งˆ๋‹ค CPU cache์— ์ €์žฅ๋œ ๊ฐ’์ด ์•„๋‹Œ, Main Memory์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค.

 

โ—ผ lock์„ ์‚ฌ์šฉํ–ˆ์„ ์‹œ์™€ volatile์„ ์‚ฌ์šฉํ•  ์‹œ์—, volatile ๋‹จ์ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • Multi Thread ํ™˜๊ฒฝ์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ Thread๊ฐ€ writeํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด race conditionrace์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ์—๋Š” synchronized๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›์ž์„ฑ(atomic)์„ ๋ณด์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰๐ŸปThread

โ—ผ ์ž๋ฐ”์—์„œ thread ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

์ž๋ฐ”์—์„œ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Thread๋ฅผ ์ƒ์†๋ฐ›๋Š” ๋ฐฉ๋ฒ•
    1. Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•œ ํด๋ž˜์Šค ์ •์˜ํ•œ๋‹ค.
    2. run() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ ์ž‘์„ฑํ•œ๋‹ค.
    3. ์Šค๋ ˆ๋“œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    4. start() ๋ฉ”์†Œ๋“œ๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.
  • Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•
    1. Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค.
    2. run() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
    3. Runnable ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    4. Thread ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    5. start() ๋ฉ”์†Œ๋“œ๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.

์ž๋ฐ”๋Š” ๋‹ค์ค‘ ์ƒ์†์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ฒŒ ๋˜๋ฉด ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์„์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ธํ„ฐํŽ˜์ด์Šค์ธ Runnable๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์žฌ์‚ฌ์šฉ์„ฑ(reusability)์ด ๋†’๊ณ  ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ(consistency)์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๋‹ค ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.

์ฐธ๊ณ ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์Šค๋ ˆ๋“œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰์š”์ฒญ์„ ํ•˜๋”๋ผ๋„ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์€ ์ „์ ์œผ๋กœ JVM์— ์˜ํ•œ ์Šค์ผ€์ฅด๋Ÿฌ์— ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” Thread์˜ ์—ฌ๋Ÿฌ ๋ฉ”์†Œ๋“œ๋“ค์„ ํ†ตํ•ด์„œ JVM์— ํ•ด๋‹น ๋ช…๋ น๋“ค์ด ์‹คํ–‰๋˜๋„๋ก ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

*์Šค๋ ˆ๋“œ Thread ๋ž€?

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

โ—ผ Thread ์‹คํ–‰ ์‹œ run()์œผ๋กœ ์ˆ˜ํ–‰ํ•  ๋•Œ์™€ start()๋กœ ์ˆ˜ํ–‰ํ•  ๋•Œ์™€์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • run()
    run()์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ํด๋ž˜์Šค์— ์„ ์–ธ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • start()
    start()๋Š” ์ƒˆ๋กœ์šด ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ํ˜ธ์ถœ์Šคํƒ(call stack)์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ์— run()์„ ํ˜ธ์ถœํ•ด์„œ ์ƒ์„ฑ๋œ ํ˜ธ์ถœ์Šคํƒ์— run()์ด ์ฒซ๋ฒˆ์งธ๋กœ ์˜ฌ๋ผ๊ฐ€๊ฒŒ ํ•œ๋‹ค.

โ—ผ ์ผ๋ฐ˜ ๋ฐฉ์‹์—์„œ main thread๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋  ํ…๋ฐ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์—์„œ main thread๋Š” ์–ธ์ œ ์ข…๋ฃŒ๋˜๋‚˜์š”?

  • ์ž๋ฐ” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ main ์Šค๋ ˆ๋“œ๊ฐ€ main() ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. main ์Šค๋ ˆ๋“œ์˜ ํ๋ฆ„ ์•ˆ์—์„œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•„์š”์— ๋”ฐ๋ผ ์ž‘์—… ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋ณ‘๋ ฌ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์˜ ๊ฒฝ์šฐ, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํ”„๋กœ์„ธ์Šค๋„ ์ข…๋ฃŒ๋˜์ง€๋งŒ, ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ„์† ์‹คํ–‰๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (์Šค๋ ˆ๋“œ๋Š” ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ž‘์—…ํ•˜๊ธฐ ๋•Œ๋ฌธ)

๊ฒฐ๊ณผ์ ์œผ๋กœ, ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์—์„œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” return ์„ ๋งŒ๋‚˜๊ฑฐ๋‚˜, main ๋ฉ”์„œ๋“œ์˜ ๋์ด์˜ค๋ฉด ์ข…๋ฃŒํ•˜๊ฒŒ ๋œ๋‹ค.

 

*์งˆ๋ฌธ์—์„œ ์›ํ•˜๋Š” ๋‹ต์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“œ๋Š”๋ฐ ๋” ์ฐพ์•„๋ด์•ผ๊ฒ ๋‹ค..

โ—ผ ThreadLocal ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  •  ThreadLocal์€ ํ•œ ์“ฐ๋ ˆ๋“œ์—์„œ ์ฝ๊ณ  ์“ฐ์—ฌ์งˆ ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ฐ ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค get(), set() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ง๊ทธ๋Œ€๋กœ Thread ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ThreadLocal์˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    1. ThreadLocal ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    2. ThreadLocal.set() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ˜„์žฌ thread์˜ ๋กœ์ปฌ ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    3. ThreadLocal.get() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ˜„์žฌ thread์˜ ๋กœ์ปฌ ๋ณ€์ˆ˜๊ฐ’์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.
    4. ThreadLocal.remove() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ˜„์žฌ thread ๋กœ์ปฌ ๋ณ€์ˆ˜๊ฐ’์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

โ—ผ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ThreadLocal ์„ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์˜ํ•  ์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • ์Šค๋ ˆ๋“œ ๋กœ์ปฌ์€ ์Šค๋ ˆ๋“œ ํ’€(thread pool)์„ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ์žฌํ™œ์šฉ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ด ๋๋‚ฌ๋‹ค๋ฉด ์Šค๋ ˆ๋“œ ๋กœ์ปฌ์„ ๋น„์›Œ์ฃผ๋Š” ๊ณผ์ •์ด ํ•„์ˆ˜์ ์ด๋‹ค. 

๐Ÿ‘‰๐ŸปError & Exception

โ—ผ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

  1. try, catch
    ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๋•Œ ์šฐ๋ฆฌ๋Š” try ... catch ... finally ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋กœ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ๋˜์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ ์€ ์ž๋ฐ”์—์„œ ๋ชจ๋“  ์˜ˆ์™ธ๋Š” Exception์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค.
    • try ๋ธ”๋ก : ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋กœ ์—ฌ๊ธฐ์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋Š” catch ๋ธ”๋ก์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค.
    • catch ๋ธ”๋ก : try ๋ธ”๋ก์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ ์ฝ”๋“œ๋‚˜ ์˜ˆ์™ธ ๊ฐ์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    • finally ๋ธ”๋ก : ์˜ˆ์™ธ์˜ ๋ฐœ์ƒ ์œ ๋ฌด์— ์ƒ๊ด€์—†์ด ๋งˆ์ง€๋ง‰์— ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋œ๋‹ค.
  2. throws
    ๋ง๊ทธ๋Œ€๋กœ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ๊ฒƒ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์™ธ๋ฅผ ์—ฌ๊ธฐ์„œ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์„ํ…Œ๋‹ˆ ๋‚˜๋ฅผ ๋ถˆ๋Ÿฌ๋‹ค๊ฐ€ ์“ฐ๋Š” ๋…€์„์—๊ฒŒ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ์ „๊ฐ€ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฉฐ ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ์‚ฌ๋žŒ์ด ์ด ์„ ์–ธ๋ถ€๋ฅผ ๋ณด๊ณ  ์–ด๋–ค ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋„ ์•Œ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

โ—ผ Checked Exception ๊ณผ Unchecked Exception ์˜ transaction ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  1. Checked Exception
    • ๋ช…์‹œ์ ์œผ๋กœ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ•์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— checked exception์ด๋ผ ๋ถ€๋ฅธ๋‹ค.
    • ์ด๋Š” Exception ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์ƒ์†ํ•˜๊ฑฐ๋‚˜ IOException, SQLException ๊ฐ™์€ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. 
    • try~catch, throws ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค.
    • ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด IDE์—์„œ ์ปดํŒŒ์ผ์‹œ ์—๋Ÿฌ๋ฅผ ๋ฑ‰๋Š”๋‹ค.
    • compile Exception์œผ๋กœ runtime exception ํ•˜์œ„ exception์„ ์ œ์™ธํ•˜๊ณ  ๋งํ•œ๋‹ค.
  2. Unchecked Exception
    • ๊ฐ•์ œํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— UnChecked Exception์ด๋ผ ๋ถ€๋ฅธ๋‹ค.
    • ์ด ์˜ˆ์™ธ๋“ค์€ ๋Ÿฐํƒ€์ž„ ์‹œ ๋ฐœ์ƒํ•˜๋ฉฐ, ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์‹ค์ˆ˜๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.
    • ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ IDE์—์„œ ์—๋Ÿฌ๋ฅผ ๋ฑ‰์ง€ ์•Š๋Š”๋‹ค.
    • Runtime Exception์œผ๋กœ ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” Exception์„ ๋งํ•œ๋‹ค.
    • Runtime Exception ํ•˜์œ„์˜ NullPointException, IndexOutOfBoundException ๋“ฑ์ด ์žˆ๋‹ค.
    • ํŠธ๋žœ์žญ์…˜์„ ๊ทธ๋ƒฅrollback
    • check ๋Š” rollback ์•ˆ์‹œํ‚ค๊ณ  ์ปค๋ฐ‹ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค

โ—ผ @Transactional ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋‚˜์š”?

  • @Transactional์„ ๋ฉ”์†Œ๋“œ ๋˜๋Š” ํด๋ž˜์Šค์— ๋ช…์‹œํ•˜๋ฉด,
    AOP๋ฅผ ํ†ตํ•ด Target์ด ์ƒ์†ํ•˜๊ณ  ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” Target ๊ฐ์ฒด๋ฅผ ์ƒ์†ํ•œ Proxy ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ,
    Proxy ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด Target ๋ฉ”์†Œ๋“œ ์ „ ํ›„๋กœ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

โ—ผ @Transactional ์ด ๋ถ™์ง€ ์•Š์€ ๋ฉ”์†Œ๋“œ์˜ ๋‚ด๋ถ€์—์„œ @Transactional ์ด ๋ถ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์‹œ, ์ด ๋‚ด๋ถ€ ๋ฉ”์†Œ๋“œ๋„ @Transactional์ด ์ ์šฉ๋ ๊นŒ์š”?

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

 

 

์ฐธ๊ณ 

Comments