์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- java
- sw expert academy
- redux-toolkit
- ๋ฆฌ์กํธ
- ์๊ณ ๋ฆฌ์ฆ
- axios
- react-redux
- ํ ์ฝํ ์ฝ
- react-router
- redux-saga
- json-server
- ํญํดํ๋ฌ์ค
- SW
- Get
- Algorithm
- programmers
- JavaScript
- ์๋ฐ
- C++
- ๋งค์ผ๋ฉ์ผ
- Python
- maeil-mail
- createSlice
- redux
- ์ฝ๋ฉํ ์คํธํฉ๊ฒฉ์๋๊ธฐ
- ์ด์ฝํ
- react
- ํ๋ก๊ทธ๋๋จธ์ค
- useDispatch
- ํญํด99
- Today
- Total
Binary Journey
[Java] ์ฝ๋๋ก ์์ํ๋ ์๋ฐ ์ฒซ ๊ฑธ์ (4-6) Q & A ๋ณธ๋ฌธ
[Java] ์ฝ๋๋ก ์์ํ๋ ์๋ฐ ์ฒซ ๊ฑธ์ (4-6) Q & A
binaryJournalist 2025. 1. 25. 17:08๐ก inflearn - ๊น์ํ์ ์ค์ ์๋ฐ ๋ก๋๋งต์ ๋ฐ๋ผ ํ์ตํ๊ณ ์ง๋ฌธ์ ๋ฝ์ ๋ตํ๋ฉฐ ๋ณต์ตํฉ๋๋ค.
๐ก ํ์ต๋ด์ฉ์ ์น์ 4๋ถํฐ ์น์ 6๊น์ง์ด๋ฉฐ ์ ๋ฆฌ ๋ด์ฉ์ ์ฌ๊ธฐ์ ์์ฑํ์์ต๋๋ค.
์ฐ์ฐ์
"๋ฌธ์์ด์ ๋น๊ตํ ๋ == ๋์ equals()๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ๋ฅผ ์ค๋ช
ํด์ฃผ์ธ์."
==
์ฐ์ฐ์๋ ๊ฐ์ฒด์ ์ฐธ์กฐ(๋ฉ๋ชจ๋ฆฌ ์ฃผ์)๋ฅผ ๋น๊ตํ๊ณ ,equals()
๋ ๊ฐ์ฒด์ ๋ด์ฉ์ ๋น๊ตํฉ๋๋ค.String
๊ฐ์ฒด๋ ์์ฑ ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์ํฉ๋๋ค:- ๋ฆฌํฐ๋ด๋ก ์์ฑ ์(
"hello"
):String Pool
์ ์ ์ฅ๋์ด ๊ฐ์ ๋ฌธ์์ด์ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ๊ณต์ ํฉ๋๋ค. new
์ฐ์ฐ์๋ก ์์ฑ ์: ํญ์ ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด ๋ค๋ฅธ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.String str1 = "hello"; String str2 = "hello"; String str3 = new String("hello"); str1 == str2; // true (๊ฐ์ String Pool์ ์ฐธ์กฐ) str1 == str3; // false (๋ค๋ฅธ ๊ฐ์ฒด ์ฐธ์กฐ) str1.equals(str3); // true (๋ด์ฉ ๋น๊ต)
- ๋ฆฌํฐ๋ด๋ก ์์ฑ ์(
"์ฐ์ ์ฐ์ฐ์์ ๋ฐ์ํ ์ ์๋ ์์ธ ์ํฉ์๋ ์ด๋ค ๊ฒ๋ค์ด ์๋์? (์: 0์ผ๋ก ๋๋๊ธฐ)"
0์ผ๋ก ๋๋๊ธฐ
: ArithmeticException ๋ฐ์ํ ์ ์์ต๋๋ค.- ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ ์ฌ์ ์ ๋ถ๋ชจ ์ฒดํฌ๊ฐ ํ์ํฉ๋๋ค.
์ ์ ์ค๋ฒํ๋ก์ฐ/์ธ๋ํ๋ก์ฐ
: ํ์ ์ ๋ฒ์๋ฅผ ๋์ด์๋ ๊ณ์ฐ ์ ๋ฐ์ํ ์ ์์ต๋๋ค.- ์ํฉ์ ๋ฐ๋ผ ๋ ํฐ ๋ฐ์ดํฐ ํ์ ์ ์ฌ์ฉํ์ฌ ๋ฐฉ์งํฉ๋๋ค.
๋ถ๋ ์์์ ์ฐ์ฐ์ ์ ๋ฐ๋ ๋ฌธ์
: 0.1 + 0.2 != 0.3BigDecimal
ํด๋์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
"BigDecimal ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ญ๊ฐ์?"
- ์๋ฐ์์ ์ค์ํ(
float
,double
)์ ๋ถ๋์์์ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ ํํ ์ค์ ๊ณ์ฐ์ด ์ด๋ ต์ต๋๋ค. BigDecimal
์ ์ด๋ฐ ๋ถ๋์์์ ์ ์ค์ฐจ ์์ด ์ ํํ ์ค์ ๊ณ์ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.- ๋ค๋ง
BigDecimal
์ ์ผ๋ฐ ์ค์ํ๋ณด๋ค ์ฐ์ฐ ์๋๊ฐ ๋๋ฆฌ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฌ์ฉํ๋ ๋จ์ ์ด ์์ด, ์ ํํ ๊ณ์ฐ์ด ํ์ํ ๊ฒฝ์ฐ์๋ง ์ ํ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
"์ฆ๊ฐ ์ฐ์ฐ์(++, --)์ ์ ์ ์ฐ์ฐ๊ณผ ํ์ ์ฐ์ฐ์ ์ฐจ์ด์ ์ ์์ ์ ํจ๊ป ์ค๋ช
ํด์ฃผ์ธ์."
- ์ฆ๊ฐ ์ฐ์ฐ์๋ฅผ ๋ณ์
์
์ ๋ถ์ด๋ฉด์ ์ ์ฐ์ฐ
,๋ค
์ ๋ถ์ด๋ฉดํ์ ์ฐ์ฐ
์ผ๋ก ๋ถ๋ฆ ๋๋ค.
์ ์ฝ๋๋ฅผ ๋๊ณ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ ์ ๋ณ์int a = 1; int b = ++a; int c = a++;
a
๊ฐ ์๊ณa
์ ๊ฐ์1
์ผ๋ก ๊ฐ์ ํ์ ๋์ ์ ์ฐ์ฐ
์ ๊ฒฝ์ฐ++a
๋ก ๋ํ๋ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ฒฝ์ฐ ๊ฐ์ ๋ผ์ธ์ ์ฝ๋๊ฐ ์กด์ฌํ ๋ ์ ์ ์ฐ์ฐ์ ๋จผ์ ์คํํ ๋ค์ ๊ฐ์ ๋ผ์ธ์ ์ฝ๋๋ฅผ ์คํ ํฉ๋๋ค. ์๋ฅผ ๋ค์ดint b = ++a
์ ์ฝ๋๋b
์ ๊ฐ์ ๋ด๊ธฐ ์ ์a = a + 1
์ ๋จผ์ ์คํํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋์b
์๋2
๊ฐ ์ ์ฅ๋ฉ๋๋ค. ๋ฐ๋๋กint c = a++
์ ๊ฒฝ์ฐ ๊ฐ์ ๋ผ์ธ์ ์ฝ๋์์ ํ์ ์ฐ์ฐ์ ๊ฐ์ฅ ๋์ค์ ์คํํ๊ฒ ๋ฉ๋๋ค.c
์๋ ์ฐ์ฐ ์ ์a
๊ฐ์ธ2
๊ฐ ์ ์ฅ๋๊ณ ๊ทธ ๋ค์a = a + 1
์ด ์งํ๋ฉ๋๋ค.
์กฐ๊ฑด๋ฌธ
"if-else์ switch ์ค ์ด๋ค ์ํฉ์์ ์ด๋ค ๊ฒ์ ์ ํํด์ผ ํ ๊น์?"
- ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค๊ณ ๋ง์๋๋ฆด ์ ์์ต๋๋ค. ๋จ์ ๊ฐ์ผ๋ก๋ง ์กฐ๊ฑด์ผ๋ก ํ๋ณํ ๊ฒฝ์ฐ, ์๋๋ฉด ์กฐ๊ฑด์ผ๋ก ์ธํ ๊ฐ์ ๋ฐ๋ผ ๋ณ์์ ๋ณ๊ฒฝ๋ ๊ฐ์ ์ ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ
switch
๋ฌธ์ด ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋์ ์ ์์ต๋๋ค. ์กฐ๊ฑด์์ด ๋จ์ ๊ฐ์ผ๋ก ๋ถ๋ฅ๋ ์ ์๊ฑฐ๋ ์กฐ๊ฑด์ ๋ด์ ์ฐ์ฐ์์ด ํฌํจ๋ ๊ฒฝ์ฐif-else
๋ฌธ์ด ๋์ ์ ์์ต๋๋ค.
"switch ๋ฌธ์์ break๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์? ์ด๋ฅผ ํ์ฉํ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ค๋ช
ํด์ฃผ์ธ์."
switch
์break
๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ ๋ค์ ์กฐ๊ฑด๋ฌธ๋ ๋น๊ต๋ฅผ ํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋์ผํ ๊ฐ์ ๋ฐํํ๊ฑฐ๋ ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ๋ ๊ฒฝ์ฐbreak
๋ฅผ ์ฌ์ฉํ์ฌ ๋ถํ์ํ ์ฐ์ฐ์ ํ์ง ์๋๋ก ํ ์ ์์ต๋๋ค.
"์ผํญ ์ฐ์ฐ์๋ ์ด๋ค ์ํฉ์์ ์ฌ์ฉํ๋ฉด ์ข์๊น์? if-else์ ๋น๊ตํ์ ๋ ์ฅ๋จ์ ์?"
- ๋จ์
true
orfalse
๋ง ํ๋ณํ์ฌ ๋ณ์์ ๊ฐ์ ๋ด๊ฑฐ๋ ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ ๋ ์ฌ์ฉํ๋ฉด ์ข์ต๋๋ค. ์ฅ๋จ์ ์if-else
์ ๋นํด ๋ผ์ธ ์๋ฅผ ์ค์ผ ์ ์๋ค๋ ์ฅ์ ์ด ์์ผ๋ ์คํ๋ ค ์ด ์ ์ผ๋ก ์ธํด ๊ฐ๋ ์ฑ์ด ๋๋น ์ง ์ ์๋ค๋ ๋จ์ ๋ ์กด์ฌํฉ๋๋ค.
๋ฐ๋ณต๋ฌธ
"for๋ฌธ๊ณผ while๋ฌธ์ ์ฐจ์ด์ ์ ์ค๋ช
ํ๊ณ , ๊ฐ๊ฐ ์ด๋ค ์ํฉ์์ ์ฌ์ฉํ๋ฉด ์ข์์ง ์ค๋ช
ํด์ฃผ์ธ์."
for
๋ฌธ์ ๊ฒฝ์ฐ ์ด๊ธฐ์, ๋ฐ๋ณต ํ์, ๋ฐ๋ณต ์กฐ๊ฑด ์์ด ์กด์ฌํ์ฌ ๋ฐ๋ณตํ์๋ฅผ ์ผ์ ํ ์๋ก ์ ํ ํ ์ ์์ต๋๋ค.while
๋ ๋ณ์์break
๋ฅผ ์ด์ฉํ์ฌfor
๋ฌธ ์ฒ๋ผ ์ ํ๋ ๋ฐ๋ณต๋ฌธ์ ์ค์ ํ ์ ์์ง๋ง ์กฐ๊ฑด์ ๊ฑธ์ง ์๊ณ ๋ฌดํ๋ฃจํ๋ ๊ฐ๋ฅํฉ๋๋ค. ํ์์ ์ ํ์ด ์๊ณ ํ๋ก๊ทธ๋จ์ด ๊ณ์ ์คํ๋์ด์ผ ํ ๊ฒฝ์ฐ์๋while
์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ซ๊ณ ํ์์ ์ ํ์ด ํ์ํ๊ณ ์ผ์ ํ์ ์์ผ๋ก๋ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋์ด์ผ ํ๋ ๊ฒฝ์ฐfor
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ซ์ต๋๋ค.
"break์ continue์ ์ฐจ์ด์ ์ ์ค๋ช
ํ๊ณ , ๊ฐ๊ฐ์ ์ฌ์ฉ ์์๋ฅผ ๋ค์ด์ฃผ์ธ์."
break
๋ ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃํ๊ณ ๋น ์ ธ๋์ค๊ฒ ํ๋ ํค์๋์ด๋ฉฐcontinue
๋ ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃํ์ง ์๊ณcontinue
์ดํ์ ์ฝ๋๋ ์คํํ์ง ์๊ณ ๋ค์ ์กฐ๊ฑด์์ผ๋ก ์ด๋ํ์ฌ ๋ค์ ํ์ฐจ์ ๋ฐ๋ณต๋ฌธ์ ์คํํ๋๋ก ํฉ๋๋ค. ์ค์ํ์์๋ ๊ทธ ์๋ฅผ ์ ํ ์ ์๋๋ฐ ์๋์ฐ os ํ๊ฒฝ์์ ํ์ผ ๋ฆฌ์คํธ๋ฅผ ์ด๋ค ํด๋์ ๋ณต์ฌ-๋ถ์ฌ๋ฃ๊ธฐ ํ ๋ ๋์ผํ ํ์ผ ๋ฆฌ์คํธ๊ฐ ์์ด ํ๋ฉด์ ๋ ธ์ถ๋๋ ์๋ฆผ์ฐฝ์ ๋ณด์ ์ ์์ ๊ฒ๋๋ค. ๊ทธ ์๋ฆผ ์ฐฝ์์๊ฑด๋๋ฐ๊ธฐ
๋ฒํผ์continue
์ด๊ณ์ค์ง
๋ฒํผ์break
๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.๋ฎ์ด์ฐ๊ธฐ
๋ฒํผ์ ๊ฒฝ์ฐcontinue
์ดํ์ ์ฝ๋๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค.
"๋ฌดํ ๋ฃจํ๋ ์ด๋ค ์ํฉ์์ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์์ ํ๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ธ๊ฐ์?"
์๋ฒ ํ๋ก๊ทธ๋จ์ ๋ฉ์ธ ๋ฃจํ
,์ฌ์ฉ์ ์ ๋ ฅ ๋๊ธฐ
,๋ฉ์์ง ํ ์ฒ๋ฆฌ
๋ฑ์ ์ํฉ์ด ์์ ์ ์์ต๋๋ค.- ์์ ํ๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก :
- ๋ช
ํํ ์ข
๋ฃ ์กฐ๊ฑด ๊ตฌํ (
break
์กฐ๊ฑด) timeout
์ค์ ์ผ๋ก ๋ฌดํ ๋๊ธฐ ๋ฐฉ์ง- ๋ฆฌ์์ค ๋ชจ๋ํฐ๋ง ๋ฐ ๊ด๋ฆฌ
- ์ฃผ๊ธฐ์ ์ธ ์ํ ์ฒดํฌ
try-catch
๋ก ์์ธ ์ํฉ ์ฒ๋ฆฌ
์ด ์์ต๋๋ค.
- ๋ช
ํํ ์ข
๋ฃ ์กฐ๊ฑด ๊ตฌํ (
์ฑ๋ฅ๊ณผ ์ต์ ํ
"๋ฐ๋ณต๋ฌธ์์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๊ณ ๋ คํด์ผ ํ ์ฌํญ๋ค์ ๋ฌด์์ธ๊ฐ์?"
- ๋ฐ๋ณต๋ฌธ ๋ด๋ถ์์:
- ๊ฐ์ฒด ์์ฑ์ ์ต์ํํฉ๋๋ค.
- ๋ถ๋ณ ๊ฐ์ ๋ฐ๋ณต๋ฌธ ์ธ๋ถ๋ก ์ด๋์ํต๋๋ค.
Collection
์ ๊ทผ ์ ์ ์ ํ ์๋ฃ๊ตฌ์กฐ ์ ํํฉ๋๋ค.
"switch ๋ฌธ๊ณผ if-else ๋ฌธ์ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ ์์ธ๊ณผ JVM์ ์ต์ ํ ๋ฐฉ์์ ์ค๋ช
ํด์ฃผ์ธ์."
switch
๋ฌธ์jump table
์ ์ฌ์ฉํ์ฌO(1)
์๊ฐ ๋ณต์ก๋๋ก ๋ถ๊ธฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.if-else
๋ ์กฐ๊ฑด์ ์์ฐจ์ ์ผ๋ก ํ๊ฐํ๋ฏ๋กO(n)
์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ต๋๋ค.- ๋ฐ๋ผ์ ๋ถ๊ธฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ
switch
๋ฌธ์ด ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.
"jump table ์ด ๋ฌด์์ธ์ง ์ค๋ช
ํด์ฃผ์ธ์."
jump table
(์ ํ ํ ์ด๋ธ)์switch
๋ฌธ์ ์ต์ ํํ๊ธฐ ์ํด ์ปดํ์ผ๋ฌ๊ฐ ์์ฑํ๋ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค.- ์๋ ๋ฐฉ์
// ์ด๋ฐ switch๋ฌธ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
switch (value) {
case 1: return "ONE";
case 2: return "TWO";
case 3: return "THREE";
}
// ์ปดํ์ผ๋ฌ๋ ๋ด๋ถ์ ์ผ๋ก ์ด๋ฐ ์ ํ ํ
์ด๋ธ์ ์์ฑํฉ๋๋ค.
// address[1] -> code for case 1
// address[2] -> code for case 2
// address[3] -> code for case 3
O(1)
์๊ฐ ๋ณต์ก๋:value
๊ฐ์ผ๋ก ๋ฐ๋ก ํด๋นcase
์ ์ฃผ์๋ฅผ ์ฐพ์๊ฐ ์ ์์if-else
์ ๋ฌ๋ฆฌ ์กฐ๊ฑด์ ์์ฐจ์ ์ผ๋ก ํ์ธํ ํ์๊ฐ ์์
"String ์ฐ์ฐ์์ + ์ฐ์ฐ์ ๋์ StringBuilder๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ๋ฅผ JVM ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ด์ ์์ ์ค๋ช
ํด์ฃผ์ธ์."
String
์๋ถ๋ณ(immutable) ๊ฐ์ฒด
๋ผ+
์ฐ์ฐ๋ง๋ค ์๋ก์ดString
๊ฐ์ฒด๊ฐ ํ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ๋๊ณ ๊ธฐ์กดString
๊ฐ์ฒด๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์์ด ๋ฉ๋๋ค.StringBuilder
๋๊ฐ๋ณ(mutable) ๊ฐ์ฒด
๋ผ ๋์ผ ๊ฐ์ฒด ๋ด์์ ๋ฌธ์์ด์ ์กฐ์ํฉ๋๋ค.- ๋ด๋ถ์ ์ผ๋ก ๊ฐ๋ณ ํฌ๊ธฐ์
char[]
๋ฐฐ์ด์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. append()
์ ํ์ํ ๊ฒฝ์ฐ์๋ง ๋ฐฐ์ด ํฌ๊ธฐ๋ฅผ ์กฐ์ ํฉ๋๋ค.- ํ๋์ ๊ฐ์ฒด ๋ด์์ ๋ฌธ์์ด ์กฐ์์ด ์ด๋ฃจ์ด์ ธ ์ถ๊ฐ ๊ฐ์ฒด ์์ฑ์ด ์์ต๋๋ค.
- ๋ด๋ถ์ ์ผ๋ก ๊ฐ๋ณ ํฌ๊ธฐ์
- ์์:
String str = "a" + "b" + "c"; // ๋ด๋ถ์ ์ผ๋ก ์ฌ๋ฌ String ๊ฐ์ฒด ์์ฑ
StringBuilder sb = new StringBuilder()
.append("a").append("b").append("c"); // ํ๋์ ๊ฐ์ฒด๋ง ์ฌ์ฉ
- ์ ๋ฆฌํ์๋ฉด
String
+
์ฐ์ฐ์ ๊ฒฝ์ฐ ์ค๊ฐ ๊ฐ์ฒด๋ค์ ์์ฑ๊ณผ GC๋ก ์ธํ ๋ฉ๋ชจ๋ฆฌ ๋ถํ๊ฐ ๋ฐ์ํ ์ ์๊ณ ,StringBuilder
์ ๊ฒฝ์ฐ ๋จ์ผ ๊ฐ์ฒด ์ฌ์ฉ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ดStringBuilder
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
"๋ฐ๋ณต๋ฌธ ๋ด์์ ๋ฌธ์์ด ์ฐ์ฐ์ด ๋ง์ ๋ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ๊ณผ ํด๊ฒฐ ๋ฐฉ์์?"
- ๋ฌธ์์ด์
+
์ฐ์ฐ์๋ก ๊ณ์ ์ฐ๊ฒฐํ๋ฉด ๋งค๋ฒ ์๋ก์ดString
๊ฐ์ฒด๊ฐ ์์ฑ๋์ด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.- ํด๊ฒฐ๋ฐฉ์์ผ๋ก๋
StringBuilder
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ์ฐ๊ฒฐํ๋ฉด ๋ฉ๋๋ค.
- ํด๊ฒฐ๋ฐฉ์์ผ๋ก๋
"๋ฌดํ ๋ฃจํ๊ฐ ๋ฐ์ํ์ ๋ ๋๋ฒ๊น
ํ๊ณ ํด๊ฒฐํ๋ ์ ์ฐจ๋ฅผ ์ค๋ช
ํด์ฃผ์ธ์."
- ๋ฌธ์ ํ์
๋จ๊ณ์์๋:
- ๋ก๊ทธ๋ฅผ ํตํ ๋ฐ๋ณต ํ์์ ์ฃผ์ ๋ณ์ ๊ฐ์ ๋ชจ๋ํฐ๋งํฉ๋๋ค.
- ๋๋ฒ๊ฑฐ๋ฅผ ํตํ ๋ณ์ ๊ฐ ๋ณํ๋ฅผ ์ถ์ ํฉ๋๋ค.
- ๋ฌธ์ ํ์
์ดํ๋ก๋:
- ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃ ์กฐ๊ฑด์ด ์ ๋๋ก ์ค์ ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
- ์ข ๋ฃ ์กฐ๊ฑด์ ์ฌ์ฉ๋๋ ๋ณ์๊ฐ ์ ์ ํ ๋ณ๊ฒฝ๋๊ณ ์๋์ง ์ฒดํฌํฉ๋๋ค.
- ํ์ํ๋ค๋ฉด
์ต๋ ์คํ ํ์
๋timeout
์ ์ค์ ํ์ฌ ์์ ์ฅ์น๋ฅผ ์ถ๊ฐํฉ๋๋ค.
"๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ๋ณต๋ฌธ์ ์์ฑํ ๋ ์ฃผ์ํด์ผ ํ ์ ์?"
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ํ ๋ฒ์ ๋๋ฌด ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ์ง ์๋๋ก ํฉ๋๋ค.
- ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ์ต์ํํฉ๋๋ค.
- ๊ฐ๋ฅํ๋ค๋ฉด ์ฒ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ถํ ํ์ฌ
batch
์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ค๊ณ์ ๊ตฌํ ํจํด
"switch ๋ฌธ์ ์ฌ์ฉํ ์ฝ๋๋ฅผ OOP ๊ด์ ์์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํด์ฃผ์ธ์. (Strategy ํจํด ๋ฑ)"
// Before: switch ๋ฌธ ์ฌ์ฉ
public class PaymentProcessor {
public void processPayment(String type) {
switch (type) {
case "CREDIT":
processCreditPayment();
break;
case "DEBIT":
processDebitPayment();
break;
case "KAKAO":
processKakaoPayment();
break;
}
}
}
Strategy ํจํด
// After: Strategy ํจํด ์ ์ฉ
interface PaymentStrategy {
void process();
}
class CreditPayment implements PaymentStrategy {
public void process() {
// ์ ์ฉ์นด๋ ๊ฒฐ์ ์ฒ๋ฆฌ
}
}
class DebitPayment implements PaymentStrategy {
public void process() {
// ์ง๋ถ์นด๋ ๊ฒฐ์ ์ฒ๋ฆฌ
}
}
class KakaoPayment implements PaymentStrategy {
public void process() {
// ์นด์นด์คํ์ด ๊ฒฐ์ ์ฒ๋ฆฌ
}
}
class PaymentProcessor {
private final Map<String, PaymentStrategy> strategies = new HashMap<>();
public PaymentProcessor() {
strategies.put("CREDIT", new CreditPayment());
strategies.put("DEBIT", new DebitPayment());
strategies.put("KAKAO", new KakaoPayment());
}
public void processPayment(String type) {
PaymentStrategy strategy = strategies.get(type);
strategy.process();
}
}
1. ์๋ก์ด ํ์
์ถ๊ฐ๊ฐ ์ฉ์ดํฉ๋๋ค. (OCP - Open-Closed Principle)
- ์๋ก์ด ๊ฒฐ์ ๋ฐฉ์ ์ถ๊ฐ ์ ์๋ก์ด ํด๋์ค๋ง ๊ตฌํํ๋ฉด ๋ฉ๋๋ค.
- ๊ธฐ์กด ์ฝ๋ ์์ ์ด ๋ถํ์ํฉ๋๋ค.
2. ๊ฐ ์ฒ๋ฆฌ ๋ก์ง์ ๋ณ๋ ํด๋์ค๋ก ๋ถ๋ฆฌํ์์ต๋๋ค. (SRP - Single Responsibility Principle)
- ๊ฐ ๊ฒฐ์ ๋ฐฉ์๋ณ ๋ก์ง์ ๋
๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ์ฝ๋์ ์์ง๋๊ฐ ๋์์ง๊ณ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋ ํจ๊ณผ๋ฅผ ์ป์ต๋๋ค.
3. ์คํ ์์ ์ ์ ๋ต์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. (์ ์ฐ์ฑ ์ฆ๊ฐ)
- ๋ฐํ์์ ๋ค๋ฅธ ๊ฒฐ์ ๋ฐฉ์์ผ๋ก ๊ต์ฒด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
"๋ฐ๋ณต๋ฌธ ์ฒ๋ฆฌ ์ ๋ฐ์ํ ์ ์๋ ๊ต์ฐฉ ์ํ(deadlock)๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ์ค๊ณ ๋ฐฉ๋ฒ์ ์ค๋ช
ํด์ฃผ์ธ์."
- ๋ชจ๋ฅด๊ฒ ์ต๋๋ค..!
- ์์ ํ ๋น ์์ ์ผ๊ด์ฑ ์ ์ง
- Lock Ordering ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ์์์ ํญ์ ์ผ์ ํ ์์๋ก ํ๋ํ๋๋ก ํฉ๋๋ค. ์ด๋ ์ํ ๋๊ธฐ ์กฐ๊ฑด์ ๋ฐฉ์งํ์ฌ ๊ต์ฐฉ ์ํ๋ฅผ ์๋ฐฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ๊ฐ์ ๋ฝ์ ์ฌ์ฉํด์ผ ํ ๊ฒฝ์ฐ ํญ์ ๋ฎ์ ๋ฒํธ์ ๋ฝ๋ถํฐ ๋์ ๋ฒํธ์ ๋ฝ ์์ผ๋ก ํ๋ํ๋๋ก ํฉ๋๋ค.
- ํ์์์ ๋ฐ ์ฌ์๋ ๋ฉ์ปค๋์ฆ ๊ตฌํ
- ์์ ํ๋ ์ ํ์์์์ ์ค์ ํ๊ณ , ์ผ์ ์๊ฐ ๋ด์ ์์์ ํ๋ํ์ง ๋ชปํ๋ฉด ์์ ์ ์ค๋จํ๊ณ ๋์ค์ ์ฌ์๋ํ๋๋ก ํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ฌดํ์ ๋๊ธฐํ๋ ์ํฉ์ ๋ฐฉ์งํ์ฌ ๊ต์ฐฉ ์ํ๋ฅผ ํํผํ ์ ์์ต๋๋ค.
- ์์ ํ ๋น ๊ทธ๋ํ ํ์ฉ
- Resource Allocation Graph๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ ๋น ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ์ํ ๋๊ธฐ ์กฐ๊ฑด์ด ๋ฐ์ํ์ง ์๋๋ก ๊ด๋ฆฌํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ํตํด ์ ์ฌ์ ์ธ ๊ต์ฐฉ ์ํ๋ฅผ ์ฌ์ ์ ๊ฐ์งํ๊ณ ์๋ฐฉํ ์ ์์ต๋๋ค.
- ์ ์ ์ ๋๊ธฐ ์กฐ๊ฑด ๋ฐฉ์ง
- ํ๋ก์ธ์ค๊ฐ ํ์ํ ๋ชจ๋ ์์์ ํ ๋ฒ์ ์์ฒญํ๋๋ก ์ค๊ณํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ผ๋ถ ์์๋ง ๋ณด์ ํ ์ฑ ๋ค๋ฅธ ์์์ ๊ธฐ๋ค๋ฆฌ๋ ์ํฉ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๋ค๋ง, ์ด ๋ฐฉ๋ฒ์ ์์ ํ์ฉ๋๊ฐ ๋ฎ์์ง ์ ์๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
- ๋น์ ์ ์กฐ๊ฑด ์ํ
- ์ฐ์ ์์๊ฐ ๋์ ํ๋ก์ธ์ค๊ฐ ํ์ํ ์์์ ์ ์ ํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ต์ฐฉ ์ํ์ ๋น ์ง ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์์ง๋ง, ํ๋ก์ธ์ค ๊ฐ ์์ ํด์ ์ ์ฌํ๋์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ๊ณ ๊ธ ๋์์ฑ ๋ฉ์ปค๋์ฆ ํ์ฉ
- ๋ฝ ํ๋ฆฌ(lock-free) ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ํธ๋์ญ์ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ๊ณ ๊ธ ๋์์ฑ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๋ณต์กํ ๋์์ฑ ์ ์ด๋ฅผ ๋จ์ํํ๊ณ ๊ต์ฐฉ ์ํ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ์ค์ ๋๋ค.์ด๋ฌํ ๋ฐฉ๋ฒ๋ค์ ์ ์ ํ ์กฐํฉํ์ฌ ์ฌ์ฉํ๋ฉด ๋ฐ๋ณต๋ฌธ ์ฒ๋ฆฌ ์ ๋ฐ์ํ ์ ์๋ ๊ต์ฐฉ ์ํ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๋ํ, ์์คํ ์ ํน์ฑ๊ณผ ์๊ตฌ์ฌํญ์ ๋ง๋ ์ต์ ์ ๋ฐฉ๋ฒ์ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
"์ฌ๋ฌ ๊ฐ์ ์ค์ฒฉ๋ if-else ๋ฌธ์ ์ด๋ป๊ฒ ๋ฆฌํฉํ ๋งํ๋ฉด ์ข์๊น์?"
- ์กฐ๊ฑด์ ๋ณต์ก๋๋ฅผ ์ค์ด๊ธฐ ์ํด:
guard clause
ํจํด ์ ์ฉ (early return
) ํฉ๋๋ค.- ๋ณต์กํ ์กฐ๊ฑด์ ์๋ฏธ ์๋
๋ฉ์๋
๋ก ๋ถ๋ฆฌํฉ๋๋ค. - ๊ณตํต ์กฐ๊ฑด์ ์์๋ก ์ถ์ถํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
- ์กฐ๊ฑด์ ๋จ์ํํ ์ ์๋ ์ด๊ฑฐํ(
enum
) ํ์ฉํฉ๋๋ค. - ๊ฐ๋ฅํ ๊ฒฝ์ฐ
switch
๋ฌธ ์ฌ์ฉ์ ๊ณ ๋ คํฉ๋๋ค.
"๋ฐ๋ณต๋ฌธ๊ณผ ์กฐ๊ฑด๋ฌธ์ด ๋ง์ ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํ ๋ ์ฃผ๋ก ์ด๋ค ์ ๋ค์ ์ฒดํฌํ์๋์?"
- ์ค๋ณต๋๋ ์ฐ์ฐ์ด ์๋์ง ํ์ธํฉ๋๋ค.
- ๋ถํ์ํ ์ค์ฒฉ์ด ์๋์ง ํ์ธํฉ๋๋ค.
- ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃ ์กฐ๊ฑด์ด ๋ช ํํ์ง ํ์ธํฉ๋๋ค.
- ์กฐ๊ฑด๋ฌธ์ ์์๊ฐ ์ต์ ํ๋์ด ์๋์ง ํ์ธํฉ๋๋ค(์์ฃผ ๋ฐ์ํ๋ ์กฐ๊ฑด์ ๋จผ์ ์ฒดํฌ).
JVM๊ณผ ๋ด๋ถ ๋์
"JVM์ด switch ๋ฌธ์ ์ปดํ์ผํ ๋ ๋ด๋ถ์ ์ผ๋ก ์ด๋ค ์ต์ ํ๋ฅผ ์ํํ๋์ง ์ค๋ช
ํด์ฃผ์ธ์."
- ๋ชจ๋ฅด๊ฒ ์ต๋๋ค..!
ํ ์ด๋ธ์ค์์น(tableswitch)์ ๋ฃฉ์ ์ค์์น(lookupswitch)
JVM์ switch ๋ฌธ์ ๋ ๊ฐ์ง ๋ฐ์ดํธ์ฝ๋ ์ค ํ๋๋ก ์ปดํ์ผํฉ๋๋ค
- ํ ์ด๋ธ์ค์์น(tableswitch): case ๊ฐ๋ค์ด ์๋ก ๊ฐ๊น์ด ๊ฒฝ์ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ ๋ ๋น ๋ฅธ ์คํ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฃฉ์ ์ค์์น(lookupswitch): case ๊ฐ๋ค์ด ์๋ก ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด:
switch (value) {
case 1 -> "one";
case 2 -> "two";
case 4 -> "four";
default -> "other";
}
์ ์ฝ๋๋ ํ ์ด๋ธ์ค์์น๋ก ์ปดํ์ผ๋ฉ๋๋ค.
switch (value) {
case 1 -> "one";
case 10 -> "ten";
case 100 -> "one hundred";
default -> "other";
}
์ ์ฝ๋๋ ๋ฃฉ์ ์ค์์น๋ก ์ปดํ์ผ๋ฉ๋๋ค.
์ ํ ํ ์ด๋ธ ์ต์ ํ
์ปดํ์ผ๋ฌ๋ switch ๋ฌธ์ ์ ํ ํ ์ด๋ธ๋ก ๋ณํํ์ฌ ์ง์ ํด๋น case๋ก ์ด๋ํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ if-else ๋ฌธ๋ณด๋ค ๋ ํจ์จ์ ์ธ ์คํ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๋ฐํ์ ์ต์ ํ
- HotSpot JVM ์ต์ ํ
- HotSpot JVM์ ์คํ ์๊ฐ์ ๋ค์ํ ์ต์ ํ๋ฅผ ์ํํฉ๋๋ค.
- ์ธ๋ผ์ด๋: ์์ฃผ ํธ์ถ๋๋ switch ๋ฌธ์ ํฌํจํ ๋ฉ์๋๋ฅผ ์ธ๋ผ์ธํํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ๋ฃจํ ์ต์ ํ: switch ๋ฌธ์ด ๋ฃจํ ๋ด์ ์๋ ๊ฒฝ์ฐ, ๋ฃจํ ์ธ๋กค๋ง, ๋ฒกํฐํ ๋ฑ์ ๊ธฐ๋ฒ์ ์ ์ฉํฉ๋๋ค.
- ๋ถ๊ธฐ ์์ธก: ์์ฃผ ์คํ๋๋ case๋ฅผ ์์ธกํ์ฌ ์คํ ์๋๋ฅผ ๋์ ๋๋ค.
- HotSpot JVM์ ์คํ ์๊ฐ์ ๋ค์ํ ์ต์ ํ๋ฅผ ์ํํฉ๋๋ค.
- ๋์ ์ต์ ํ
- JIT(Just-In-Time) ์ปดํ์ผ๋ฌ๋ ์คํ ์ค์ switch ๋ฌธ์ ํจํด์ ๋ถ์ํ๊ณ ์ต์ ํํฉ๋๋ค.
- ํ๋กํ์ผ ๊ธฐ๋ฐ ์ต์ ํ: ์์ฃผ ์คํ๋๋ case๋ฅผ ๋จผ์ ๊ฒ์ฌํ๋๋ก ์ฌ์ ๋ ฌํฉ๋๋ค.
- ์ค์์น ๋ถ์: ๋ณต์กํ switch ๋ฌธ์ ๋ ํจ์จ์ ์ธ ํํ๋ก ๋ณํํฉ๋๋ค.
- JIT(Just-In-Time) ์ปดํ์ผ๋ฌ๋ ์คํ ์ค์ switch ๋ฌธ์ ํจํด์ ๋ถ์ํ๊ณ ์ต์ ํํฉ๋๋ค.
- ์ด์ค์ผ์ดํ ๋ถ์
- JVM์ ์ด์ค์ผ์ดํ ๋ถ์์ ํตํด switch ๋ฌธ ๋ด์์ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ๋ฉ์๋๋ฅผ ๋ฒ์ด๋์ง ์๋ ๊ฒฝ์ฐ, ํด๋น ๊ฐ์ฒด์ ํ ๋น์ ์ ๊ฑฐํ๊ฑฐ๋ ์คํ์ ํ ๋นํ๋ ์ต์ ํ๋ฅผ ์ํํ ์ ์์ต๋๋ค.์ด๋ฌํ ์ต์ ํ ๊ธฐ๋ฒ๋ค์ ํตํด JVM์ switch ๋ฌธ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ์ฐ์ ์ผ๋ก ๊ณ ๋ คํ๊ณ , ๊ทน๋จ์ ์ธ ์ฑ๋ฅ ์ต์ ํ๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ด๋ฌํ ๋ด๋ถ ๋์์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
"String equals() ๋ฉ์๋์ ๋ด๋ถ ๊ตฌํ์ ์ค๋ช
ํ๊ณ , ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๊ณ ๋ คํด์ผ ํ ์ฌํญ๋ค์ ์ค๋ช
ํด์ฃผ์ธ์."
- "String equals() ๋ฉ์๋์ ๋ด๋ถ ๊ตฌํ"
- ๋ฌธ์์ด ์ ์ฒด๋ฅผ ๋น๊ตํ๊ธฐ ์ ์ ์ํํ๋ ๋น ๋ฅด๊ฒ ๊ฒ์ฌํฉ๋๋ค.
- ๋์ผ ๊ฐ์ฒด ์ฐธ์กฐ์ธ์ง ํ์ธ (
this == obj
) null
์ฒดํฌ
- ๋์ผ ๊ฐ์ฒด ์ฐธ์กฐ์ธ์ง ํ์ธ (
- ๋ฌธ์์ด์ ๋น๊ตํฉ๋๋ค.
- ๊ธธ์ด ๋น๊ต
- ๋ฌธ์ ๋ฐฐ์ด์ ์์ฐจ์ ์ผ๋ก ๋น๊ต
- ๋ฌธ์์ด ์ ์ฒด๋ฅผ ๋น๊ตํ๊ธฐ ์ ์ ์ํํ๋ ๋น ๋ฅด๊ฒ ๊ฒ์ฌํฉ๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ์:
- ์์ฃผ ์ฌ์ฉ๋๋ ๋ฌธ์์ด์
String Pool
ํ์ฉ - ๋ถํ์ํ
String
๊ฐ์ฒด ์์ฑ ์ต์ํ
- ์์ฃผ ์ฌ์ฉ๋๋ ๋ฌธ์์ด์
"String Pool์ ๋ํด ์ค๋ช
ํด์ฃผ์ธ์."
String Pool
(๋๋String Constant Pool
)์ ์๋ฐ์ ํน๋ณํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก,๋ฌธ์์ด ๋ฆฌํฐ๋ด
์ ์ ์ฅํ๊ณ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ ๊ณต๊ฐ์ ๋๋ค.- ์๋ ๋ฐฉ์
๋ฌธ์์ด ๋ฆฌํฐ๋ด
์ ์์ฑํ ๋(์:String str = "hello"
),JVM
์ ๋จผ์ String Pool
์์ ๋์ผํ ๋ฌธ์์ด์ ์ฐพ์ต๋๋ค.- ๋์ผํ ๋ฌธ์์ด์ด ์์ผ๋ฉด ๊ทธ ์ฐธ์กฐ๋ฅผ ๋ฐํํฉ๋๋ค.
- ์์ผ๋ฉด
String Pool
์ ์๋ก ์์ฑํ๊ณ ๊ทธ ์ฐธ์กฐ๋ฅผ ๋ฐํํฉ๋๋ค.
- String Pool์ ์ฅ์
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ: ๋์ผํ ๋ฌธ์์ด์ ์ฌ๋ฌ ๋ฒ ์์ฑํ์ง ์์
- ์ฑ๋ฅ ํฅ์: ๋ฌธ์์ด ๋น๊ต ์ ๊ฐ์ฒด ์ฌ์ฌ์ฉ์ผ๋ก ์ธํ ์ด์
- ์๋ ๋ฐฉ์
"๋ฐ๋ณต๋ฌธ ์คํ ์ JVM์ JIT ์ปดํ์ผ๋ฌ๋ ์ด๋ค ์ต์ ํ๋ฅผ ์ํํ๋์?"
- ๋ชจ๋ฅด๊ฒ ์ต๋๋ค..!
- ๋ฃจํ ์ธ๋กค๋ง (Loop Unrolling)
- ๋ฃจํ ์ธ๋กค๋ง์ ๋ฐ๋ณต๋ฌธ์ ๋ณธ๋ฌธ์ ์ฌ๋ฌ ๋ฒ ๋ณต์ฌํ์ฌ ํผ์น๋ ๊ธฐ๋ฒ์ ๋๋ค.
- ์ด์
- ๋ฐ๋ณต ํ์ ๊ฐ์๋ก ์ธํ ๋ถ๊ธฐ ์์ธก ์คํจ ๊ฐ์
- ๋ช ๋ น์ด ํ์ดํ๋ผ์ธ ์ต์ ํ
- ๋ช ๋ น์ด ์์ค ๋ณ๋ ฌ์ฑ ํฅ์
๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ
for(int i = 0; i < numIterations; i++) {
METRICS.gauge("test.metric", i);
}
์๋์ ๊ฐ์ด ๋ณํํ ์ ์์ต๋๋ค.
for(int i = 0; i < numIterations; i += 5) {
METRICS.gauge("test.metric", i);
METRICS.gauge("test.metric", i+1);
METRICS.gauge("test.metric", i+2);
METRICS.gauge("test.metric", i+3);
METRICS.gauge("test.metric", i+4);
}
- ๋ฒ์ ๊ฒ์ฌ ์ ๊ฑฐ (Range Check Elimination)
- JIT ์ปดํ์ผ๋ฌ๋ ๋ฐฐ์ด ์ ๊ทผ ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๋๋ค๊ณ ํ๋จ๋๋ฉด ๋ฒ์ ๊ฒ์ฌ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ์ฝ๋์์ ์ปดํ์ผ๋ฌ๋ i
๊ฐ ํญ์ arr.length
๋ฏธ๋ง์์ ๋ณด์ฅํ ์ ์์ผ๋ฏ๋ก ๋ฐฐ์ด ์ ๊ทผ ์ ๋ฒ์ ๊ฒ์ฌ๋ฅผ ์๋ตํ ์ ์์ต๋๋ค.
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
- ๋ฃจํ ๋ณํ (Loop Transformation)
- JIT ์ปดํ์ผ๋ฌ๋
long
ํ์ ์ ๋ฐ๋ณต๋ฌธ์int
ํ์ ์ ์ค์ฒฉ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ณํํ์ฌ ๊ธฐ์กด์int
๊ธฐ๋ฐ ์ต์ ํ๋ฅผ ์ ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
- JIT ์ปดํ์ผ๋ฌ๋
- ๋ฃจํ ๋ถ๋ณ ์ฝ๋ ์ด๋ (Loop-Invariant Code Motion)
- ๋ฐ๋ณต๋ฌธ ๋ด์์ ๋ณํ์ง ์๋ ์ฐ์ฐ์ ๋ฐ๋ณต๋ฌธ ๋ฐ์ผ๋ก ์ด๋์์ผ ๋ถํ์ํ ๊ณ์ฐ์ ์ค์ ๋๋ค.
- ๋ฃจํ ๋ถ๋ฆฌ (Loop Unswitching)
- ์กฐ๊ฑด๋ฌธ์ ํฌํจํ ๋ฃจํ๋ฅผ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ ๊ฐ์ ๋ณ๋ ๋ฃจํ๋ก ๋ถ๋ฆฌํ์ฌ ๋ถ๊ธฐ ์์ธก์ ๊ฐ์ ํฉ๋๋ค.
- ๋ฒกํฐํ (Vectorization)
- SIMD (Single Instruction, Multiple Data) ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ฒ๋ฆฌํฉ๋๋ค.์ด๋ฌํ ์ต์ ํ ๊ธฐ๋ฒ๋ค์ JIT ์ปดํ์ผ๋ฌ๊ฐ ์คํ ์๊ฐ์ ์ฝ๋์ ์คํ ํจํด์ ๋ถ์ํ๊ณ , "ํซ์คํ"์ผ๋ก ํ๋จ๋๋ ๋ถ๋ถ์ ์ ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด Java ํ๋ก๊ทธ๋จ์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
ํ ํ์ ๊ด๋ จ
"์ฃผ๋์ด ๊ฐ๋ฐ์๊ฐ ์์ฑํ ๋ณต์กํ ์กฐ๊ฑด๋ฌธ์ ๋ฆฌ๋ทฐํ ๋, ์ด๋ค ๋ฐฉ์์ผ๋ก ํผ๋๋ฐฑํ์๋์?"
- ์กฐ๊ฑด๋ฌธ์ ๋ํธ ๋ฆฌ๋ทฐ ๊ฒฝํ์ ์์ผ๋ ์๋ ๋ฐฉ์์ผ๋ก ์งํํ๊ฒ ์ต๋๋ค.
- ๋ฆฌํฉํ ๋ง์ด ํ์ํ ๋ถ๋ถ์ ์์ ์ฝ๋์ ํจ๊ป ์ค๋ช ํฉ๋๋ค.
- ์ฑ๋ฅ์ด๋ ๊ฐ๋ ์ฑ ์ธก๋ฉด์์ ๊ฐ์ ๊ฐ๋ฅํ ๋ถ๋ถ์ ์ ์ํฉ๋๋ค.
- ์ ๊ทธ๋ ๊ฒ ๊ฐ์ ํด์ผ ํ๋์ง ์ด์ ๋ฅผ ์ค๋ช ํฉ๋๋ค.
- ๊ด๋ จ ๋์์ธ ํจํด์ด๋ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ฅผ ๊ณต์ ํฉ๋๋ค.
"ํ์์ ํต์ผ๋ ์ฝ๋ ์คํ์ผ์ ์ํด ์กฐ๊ฑด๋ฌธ/๋ฐ๋ณต๋ฌธ ์์ฑ ์ ์ด๋ค ๊ท์น์ ๋ง๋ค์ด ๋ณด์
จ๋์?"
- ์กฐ๊ฑด๋ฌธ ๋ฐ ๋ฐ๋ณต๋ฌธ์ ๋ํ ๊ท์น์ด ๋ฐ๋ก ์์์ผ๋ ๋ง๋ ๋ค๋ฉด ์ด๋ ๊ฒ ์ธ์ฐ๊ฒ ์ต๋๋ค.
- ์กฐ๊ฑด๋ฌธ
- ๋ณต์กํ ์กฐ๊ฑด์ ๋ณ๋ ๋ฉ์๋๋ก ์ถ์ถ
early return
ํจํด ์ฌ์ฉ
- ๋ฐ๋ณต๋ฌธ
- ์ค์ฒฉ ๋ฐ๋ณต๋ฌธ์ ์ต๋ 2๋จ๊ณ๊น์ง๋ง ํ์ฉ
- ๋ฐ๋ณต๋ฌธ ๋ด ๋ก์ง์ ๋ณ๋ ๋ฉ์๋๋ก ๋ถ๋ฆฌ
- ์กฐ๊ฑด๋ฌธ
'Java | Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์ฝ๋๋ก ์์ํ๋ ์๋ฐ ์ฒซ ๊ฑธ์ (4-6) (3) | 2024.12.20 |
---|---|
[Java] ์ฝ๋๋ก ์์ํ๋ ์๋ฐ ์ฒซ ๊ฑธ์ (1-3) Q & A (3) | 2024.12.19 |
[Java] ์ฝ๋๋ก ์์ํ๋ ์๋ฐ ์ฒซ ๊ฑธ์ (1-3) (1) | 2024.12.19 |
[Java] SLF4J LoggerFactory ์ฌ์ฉ (0) | 2021.04.05 |
[Java] Why does the string data type have a .toString() method? (0) | 2021.04.05 |