#1 ์ ๊นจ์ง๋๊ฐ?
#1-1 ๋ฐฐ๊ฒฝ ์ง์
VM์ด println("๋จ") ๋ผ๋ ์ฝ๋๋ฅผ ๋ง์ฃผ์ณค๋ค. (์ ํํ๋, ์ ๋ฐ .java ์ฝ๋ ํํ๊ฐ ์๋ .class ์ฝ๋ ํํ์ print๋ฌธ ์ผ ๊ฒ์ด๋ค)
[UTF-8๋ก ์ธ์ฝ๋ฉ] "๋จ" → EB 80 A8 (ํฌ๊ธฐ: 3๋ฐ์ดํธ)
[CP949๋ก ์ธ์ฝ๋ฉ] "๋จ" → B2 F3 (ํฌ๊ธฐ: 2๋ฐ์ดํธ)
ํน์๋ผ๋ ํท๊ฐ๋ฆด๊น๋ด ์ฌ๋ด๋ถํฐ ๊บผ๋ด๋ ๊ฒ ์ข ๊ทธ๋ ์ง๋ง, "์ธ์ฝ๋ฉ"์ ์ปดํ์ผ ์์ ์์ ์ผ์ด๋๋ ์ผ์ด ์๋๋ค. ์ ์ด์ VM์ ์ด๋ฏธ ์ปดํ์ผ๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ฝ๋ ์ญํ ์ด๋ฏ๋ก, "VM์ด ์ธ์ฝ๋ฉ์ ์ํํ๋ค"๋ ์ผ์ ์ปดํ์ผ ์ดํ(= ๋ฐํ์)์ ์ผ์ด๋๋ ์ผ์ด์ด์ผ๋ง ํ๋ค. ๊ทธ๋ ๋ค๋ฉด "์ธ์ฝ๋ฉ"์ด๋ ๋ฌด์์ธ๊ฐ?
"์ธ์ฝ๋ฉ"์ด๋, Java VM์ด .class ํ์ผ์ ์คํํ๋ค๊ฐ ์ฝ์์ ๋ฌธ์์ด์ ์ถ๋ ฅํ๊ฑฐ๋ ํ์ผ์ ์ ์ฅํ๋ ๋ฑ "๋ญ๊ฐ ํํใ๋ด๋ณด๋ด์ผ ํ๋ ์ํฉ"์์ ํด๋น ์ ๋ณด๋ฅผ ํน์ ๊ท์น์ ๋ฐ๋ผ ์ด์ง์๋ก ๋ณํํ๋ ๋ฐํ์(์คํ ์ค) ์์
์ด๋ค.
์์ฐ์ด๋ก ์ํตํ๋ ์ฌ๋๊ณผ ๋ฌ๋ฆฌ, ์ปดํจํฐ๋ผ๋ฆฌ๋ ์ ๋ณด๋ฅผ ์ด์ง์๋ก ์ฃผ๊ณ ๋ฐ๋๋ค. ๋ฐ๋ผ์ ์ ๋ณด๋ฅผ ๋ณด๋ด๊ธฐ ์ ์ ์ด์ง์๋ก ๋ณํ์ ํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฐ๋ ์ชฝ์์๋ ์ ์ ๋ณด๋ฅผ ํด์ํ๊ธฐ ์ํด ์ญ๋ณํ์ ํด์ผ ํ ๊ฒ์ด๋ค. ์ด๊ฒ์ ๋์ฝ๋ฉ์ด๋ผ ํ๋ค. ์ธ์ฝ๋ฉ๊ณผ ๋์ฝ๋ฉ์์ ์๋ก ๊ฐ์ ๊ท์น์ ์จ์ผ ์ ๋๋ก ๋ ์ ๋ณด๊ฐ ํ์ด๋์ฌ ๊ฒ์ด๋ค.
#1-2 ์ด์
Mac์ด๋ Linux์์๋ ํ๊ธ ๊นจ์ง์ด ํํ์ง ์๋ค. ํ๊ธ์ด ๊นจ์ง๋ ์ด์์ฒด์ ๋ ๋๋ถ๋ถ Windows๋ค. ์ ๊ทธ๋ด๊น?
์ ๋ณด๋ฅผ ์ฃผ๋ ์ชฝ = JVM ์ชฝ = Java/Kotlin ์ชฝ์ ๋น๊ต์ ์ต๊ทผ(2010๋
๋ ํ๋ฐ~)์ "๊ธฐ๋ณธ๊ฐ์ (๋ฒ์ฉ์ ๊ท์น์ธ) UTF-8๋ก ํต์ผํ์"๋ ๋ฐฉํฅ์ผ๋ก ์
๋ฐ์ดํธ๋ฅผ ๋จํํ๋ค. ์ต์ JDK๋ ํ๋ซํผ ์๊ด์์ด UTF-8์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ฐ์ด๋ถ์ธ๋ค.
๋ฐ๋ฉด, ์ ๋ณด๋ฅผ ๋ฐ๋ ์ชฝ = Windows ์ฝ์ ์ชฝ์ 1980 ~ 90๋
๋ MS-DOS ์์ ๋ถํฐ ์ด์ด์ ธ ์จ ๋ ๊ฑฐ์ ์์คํ
์ ์ฌ์ ํ ์ ์งํ๋ค. ๋น์์ Unicode / UTF-8์ด๋ผ๋ ๊ฐ๋
์์ฒด๊ฐ ์์๊ณ , ๊ฐ ๋๋ผ ๋ณ๋ก ์ฝ๋ ํ์ด์ง(ํ๊ตญ์ 949)๋ฅผ ๋ฐ๋ก ์ ํด์ ์จ์๋ค. Windows๋ ์๋ ํ๋ก๊ทธ๋จ๋ค๊ณผ์ ํ์ ํธํ์ฑ์ ์ง๊ธ๊น์ง๋ ์งํค๊ธฐ ์ํด, ์ธ์ฝ๋ฉใ๋์ฝ๋ฉ ๊ท์น์ ์ฌ์ ํ ์ง์ญ๋ณ ๋ ๊ฑฐ์ ๊ฐ์ผ๋ก ์ ์งํ๋ค.
๊ทธ๋ ๋ค. ํ์ ํธํ์ฑ ๋๋ฌธ์ ๊ท์น ์ต์ ํ๋ฅผ ํ์ง ์์ ๊ฒ์ด๋ค. Windows ๋๋ฆ๋๋ก์ Trade-Off ์์๊น? (#2-3์์ Windows๊ฐ ์ ์ด๋ฐ Trade-Off๋ฅผ ํ๋์ง ์กฐ๊ธ์ ์ดํดํ๊ฒ ๋์๋ค!)
#2 ํด๊ฒฐ
#2-1 ๋ฐฉ๋ฒ 1: ํ๊ฒฝ ๋ณ์ ์ด์ฉ
key: JAVA_TOOL_OPTIONS
value: -Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8
์์ ๊ฐ์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ถ๊ฐํ๋ค. JAVA_TOOL_OPTIONS์ JAVA_HOME์ฒ๋ผ, JVM ์์ฒด์์ (๊ณต์์ ์ผ๋ก) ์ฐธ์กฐํ๋ ํ๊ฒฝ ๋ณ์ key๊ฐ์ด๋ค. value์ ๋ด์ฉ์ ์ปดํจํฐ์์ ์คํ๋๋ ๋ชจ๋ JVM ํ๋ก์ธ์ค์ (UTF-8๋ก ๋์ฝ๋ฉํ๋ผ๊ณ ) ๊ฐ์ ํ๋ ๊ฒ์ด๋ค.
- ์ฅ์ : ํ๋ ์ฝ๋ฉ์ด๋ค๋ณด๋, ์ผ๋จ ๊ฐ๋ ฅํ๋ค.
- ๋จ์ : JVM์ด ์คํ๋ ๋๋ง๋ค "Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8"๋ผ๋, ๊ฑฐ์ฌ๋ฆฌ๋ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.
#2-2 ๋ฐฉ๋ฒ 2: gradle.properties ์์
# in gradle.properties
org.gradle.jvmargs=-Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8
gradle.properties๋ฅผ ์ผ์ ์ org.gradle...=UTF-8 ํ ์ค ์ถ๊ฐํ๋ฉด ๋๋ค.
- ์ฅ์ : gradle.properties ํ์ผ์ ์ผ๋ฐ์ ์ผ๋ก Git์ ์ถ์ ๋์์ ํฌํจ๋๊ธฐ ๋๋ฌธ์ ํ์๋ผ๋ฆฌ ๊ณต์ ํ ์ ์๋ค. ๋, #2-1์ฒ๋ผ ๊ณผ๊ฒฉํ ๋ฐฉ์ ๋ํ ์๋๋ค.
- ๋จ์ : Gradle์ด ์คํํ๋ Java ํ๋ก์ธ์ค์๋ง ์ ์ฉ๋๋ค.
#2-3 ๋ฐฉ๋ฒ 3: Windows ์์คํ ์์ฒด๋ฅผ ๋ฐ๊พธ๊ธฐ
[์ค์ ] - [์๊ฐ ๋ฐ ์ธ์ด] - [์ธ์ด ๋ฐ ์ง์ญ] - [์ธ์ด] - "Beta: ์ธ๊ณ ์ธ์ด ์ง์์ ์ํด Unicode UTF-8 ์ฌ์ฉ" ์ต์ ํ์ฑํ
์ต์
์ด๋ฆ์ "Beta"๊ฐ ๋ค์ด๊ฐ๋ ์ด์ ์, ํ์ ํ ๋จ์ ๋๋ฌธ๋ ์์ ๊ฒ์ด๋ค. ํธํ์ฑ์ด๋ผ๋ ๊ฒ์ด ์ฐธ ์ด๋ ต๊ณ ์ค์ํ๋ค๋ ๊ฑธ ๋๊ผ๋ค.
- ์ฅ์ : VM์ ์กฐ๊ธ๋ ๊ฑด๋ค์ด์ง ์๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. ๊ฐ์ฅ ์ด์์ ์ธ ํด๊ฒฐ์ฑ ์ด๋ผ๊ณ ๋ ๋ณผ ์ ์๋ค.
- ๋จ์ : Windows 10 1903 ๋ฒ์ ๋ถํฐ ๊ฐ๋ฅํ๋ค. ์ถ๊ฐ๋ก, ์ด ์ค์ ์ ํ๊ณ ๋๋ฉด (๋ฉ์ดํ์คํ ๋ฆฌ ๊ฐ์) ์ผ๋ถ ๊ฒ์์ด ์คํ๋์ง ์๋๋ค. ๊ฒ์์ ์คํํ๊ธฐ ์ ๋ง๋ค ๋งค๋ฒ ์ค์ ์ฐฝ์ ๋ค๋ฝ๋ ๋ฝํ ์ ์๊ธฐ์ ์ผ๋ถ ์ฌ๋๋ค์๊ฒ๋ ์น๋ช ์ ์ธ ๋จ์ ์ด๋ค.