JVM(์๋ฐ๊ฐ์๋จธ์ )๊ณผ JRE, JDK
by JiwonDev์ด์์ฒด์ ์ ํ๋์จ์ด์ ๋ ๋ฆฝ์ ์ธ ์ธ์ด, 1995๋ ๋น์ ์ด ๊ฐ๋ ์ ํ๋ก๊ทธ๋๋ฐ์ ํ์ ์ด์๋ค.
์ฐธ๊ณ ๋ก ์๋ฐ๋ ์ฌ ๋ง์ดํฌ๋ก์์คํ ์ค๊ฐ ๊ฐ๋ฐํ์ง๋ง JVM ๋ช ์ธ(Specification)๋ง ๋ฐ๋ฅธ๋ค๋ฉด ๋๊ตฌ๋ ๊ฐ๋ฐํด์ JVM ๋ฒค๋๋ฅผ ์ ๊ณตํ ์๋์๋ค. ํ์ฌ ์๋ฐ๋ ์ค๋ผํด์ด ์ธ์ํ์ผ๋ฏ๋ก ๋ณดํต์ ๊ฒฝ์ฐ ์ค๋ผํด์์ ๊ฐ๋ฐํ ํซ์คํ JVM์ ์ฌ์ฉํ๋ค.
Write Once, Run Anywhere (์๋ฐ ์ฌ๋ก๊ฑด)
# 1. ์๋ฐ ๊ฐ์๋จธ์ (Java Virtual Machine, JVM)
๊ฐ์๋จธ์ ์ด๋ผ๋ ๊ฐ๋ ์ ์ฌ๋ฌ๊ฐ์ง๋ก ์ ์ ํ ์ ์์ง๋ง, ์๋ฏธ๋ก๋ง ์ด๋ ํ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๋ฌผ๋ฆฌ์ ๋จธ์ ์ ์ํํธ์จ์ด๋ก ๊ตฌํํ ๊ฒ์ ๋งํ๋ค. ์๋์ฐ์์ '๋ฆฌ๋ ์ค ๊ฐ์๋จธ์ ํ๋ก๊ทธ๋จ'์ ํตํด ๋ฆฌ๋ ์ค ์ด์์ฒด์ ๋ฅผ ์คํ์ํค๋ ๊ฒ์ ์์ํ๋ฉด ์ดํดํ๊ธฐ ์ฝ๋ค. ์๋ฐ์์๋ ์ฝ๋๋ฅผ ์ปดํ์ผ ํ ๋ ๋ฐ๋ก ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๋๊ฒ ์๋๋ผ ์ค๊ฐ๋จ๊ณ์ '๋ฐ์ดํธ ์ฝ๋ (.class ํ์ผ)'๋ก ๋ณํํ๋ค. ์ดํ ์๋ฐ์คํํ๊ฒฝ(JRE)์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํ์ํค๋ฉด JVM(์๋ฐ๊ฐ์๋จธ์ ) ์์์ ๋ชจ๋ ์ข ๋ฅ์ ํ๋์จ์ด์ ๋์ ํ ์ ์๋๋ก ๋ฒ์ญ, ์คํ๋๋ค.
์ข ๋ ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ์๋ฉด, ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ JRE์์ ๋์ํ๋ค. JRE๋ ํฌ๊ฒ <์๋ฐ API>์ <JVM> ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ JVM์ ์ญํ ์ ์๋ฐ ์ฝ๋๋ฅผ Class Loader๋ฅผ ํตํด ์ฝ์ด๋ค์ฌ ์๋ฐ API์ ํจ๊ป ํ๋ก๊ทธ๋จ์ ์คํ ํ๋ ๊ฒ์ด๋ค.
์ฐธ๊ณ ๋ก JDK๋ (JRE + ๊ฐ๋ฐ, ์ปดํ์ผ๋๊ตฌ)๋ฅผ ์๋ฏธํ๋ฉฐ Java11 ๋ฒ์ ์ดํ๋ก๋ JRE๋ฅผ ๋ฐ๋ก ์ ๊ณตํ์ง ์๊ณ JDK๋ฅผ ์ ๊ณตํ๋ค.
# 2. JVM์ ํน์ง
JVM์์ ๋์ํ๋ ์๋ฐ ๋ฐ์ดํธ์ฝ๋(.class)๋ CPU, ์ด์์ฒด์ ์ ๋ ๋ฆฝ์ ์ด๊ณ ์ปดํ์ผ ๊ฒฐ๊ณผ๋ฌผ์ ํฌ๊ธฐ๊ฐ ๊ธฐ์กด ์์ค์ฝ๋์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ ๋คํธ์ํฌ๋ก ์ ์กํ์ฌ ์คํํ๊ธฐ ์ฝ๋ค. ์ด๊ฒ ๊ฐ๋ฅํ ์ด์ ๋ ์๋์ ๊ฐ์ ํน์ง ๋๋ถ์ด๋ค.
- ์คํ๊ธฐ๋ฐ์ ๊ฐ์๋จธ์
์ปดํจํฐ ๊ตฌ์กฐ์ ๋ํด ๋ฐฐ์ ๋ค๋ฉด, CPU์ ์ํคํ ์ณ์ ๋ฐ๋ผ ๋ช ๋ น์ด์ ๋ ์ง์คํฐ์ ์๊ฐ ๋ค๋ฆ์ ์๊ณ ์์ ๊ฒ์ด๋ค. JVM์์๋ ๋ค์ํ ํ๋ซํผ ์ง์์ ์ํด ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ '์คํ ๊ธฐ๋ฐ'์ผ๋ก ๋์ํ๋ค. - symbolic references (์ฌ๋ณผ๋ฆญ ๋ ํผ๋ฐ์ค)
๊ธฐ๋ณธ ์๋ฃํ์ ์ ์ธํ ๋ชจ๋ ํ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ธฐ๋ฐ ๋ ํผ๋ฐ์ค๊ฐ ์๋ ์ฌ๋ณผ๋ฆญ ๋ ํผ๋ฐ์ค๋ก ์ ๊ณต๋๋ค. ์ฝ๊ฒ๋งํด ์ฐธ์กฐํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ์ง ์๊ณ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฆ(=์ฌ๋ณผ) ๋ง ๊ธฐ๋กํด๋๋ ๋ฐฉ๋ฒ. ์ด๋ ์๋ฐ ์ฝ๋๊ฐ ๋ฐ๋ก ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญ๋๋๊ฒ ์๋๋ผ ๋ฐ์ดํธ์ฝ๋๋ฅผ ํตํด JVM ๋ด์์ ์คํ๋๊ธฐ์ ๊ฐ๋ฅํ๋ค. - ์๋ฃํ์ ๋ช
ํ์ฑ, ํ๋ซํผ ๋
๋ฆฝ์ฑ ๋ณด์ฅ
์๋ฐ๋ ์ ์ด๋ถํฐ ์ฌ๋ฌ ์ด์์ฒด์ ์ ์ฌ์ฉํ ๋ ค๊ณ ์ค๊ณํ์๊ธฐ์ ํ๋ซํผ์ ๋ฐ๋ผ ์๋ฃํ์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๊ฐ ๋ณํ์ง ์๋๋ค. (C์ธ์ด ๊ฐ์ ์ ํต์ ์ธ ์ธ์ด๋ ์ด์์ฒด์ ์ ๋ฐ๋ผ int ํ ๊ฐ์ ๊ธฐ๋ณธ ์๋ฃํ์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ค.) - Network byte order (๋คํธ์ํฌ ๋ฐ์ดํธ ์ค๋)
์๋ฐ ๋ฐ์ดํธ์ฝ๋(.class)๋ ๋คํธ์ํฌ ๋ฐ์ดํธ ์ค๋๋ฅผ ์ฌ์ฉํ๋ค. ์ฝ๊ฒ ๋งํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ๋ฐฉ์(๋น ์๋์, ๋ฆฌํ์๋์)์ ํ๋ซํผ ๋ ๋ฆฝ์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋คํธ์ํฌ ์ ์ก์์ ํ์ค์ผ๋ก ์ฌ์ฉํ๋ ๋ฐ์ดํธ ์ค๋(= ๋น ์๋์)์ ์ฌ์ฉํ๋ค๋ ๋ง.
๊ทธ๋ฆฌ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๊ด๋ฆฌํ์ง์๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ ๊ฐ๋ ์ด ์๋ฐ์์ ์ฒ์ ๋ฑ์ฅํ์๋ค.
# Garbage Colletcion
์๋ฐ ์ด์ ์ ํ๋ก๊ทธ๋๋ฐ์์๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฑ๊ณผ ํ์๋ฅผ ๊ด๋ฆฌํ์๋ค. ์๋ฐ์์๋ JVM์ ๋ด์ฅ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๊ณผ ํ์๋ฅผ ๊ด๋ฆฌํ๋ค. ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๋ฉด ์ฐธ์กฐ ๋์ง ์๋ ๊ฐ์ฒด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐพ์ ๋ฐํ์์์ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
# JIT (Just-In-Time)
์๋ฐ์ ๋ฐ์ดํธ์ฝ๋(.class)๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธํฐํ๋ฆฌํฐ์ฒ๋ผ ๋์ํ๋ค. ์ฆ ๋ฐ์ดํธ์ฝ๋๋ฅผ ํ์ค์ฉ ์คํํ์ฌ ํด์ํ๋ค. ์ปดํ์ผ๋ฌ์ ๋ค๋ฅด๊ฒ ์ธํฐํ๋ฆฌํฐ์ ๊ฒฝ์ฐ ์ ์ฒด์ฝ๋๋ฅผ ๋ถ์ํ๋ ๊ฒ์ด ์๋๋ผ์ ์ต์ ํ๊ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ๋์ผํ ๋ฉ์๋๋ฅผ ์ฌ๋ฌ๋ฒ ํด์ํ๋ ๋นํจ์จ์ ์ธ ์ํฉ์ด ๋ฐ์ํ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ์ํด ์๋ฐ์์๋ JIT(Just-In-Time) ๋ฐฉ์์ ์ปดํ์ผ์ ์ฌ์ฉํ๋ค. ์ด๊ธฐ ์คํ ์์ ์ ์์ฃผ ์ฌ์ฉ๋ ๋งํ ์ฝ๋๋ค์ ๋ฏธ๋ฆฌ ๊ธฐ๊ณ์ด๋ก ํด์ํ์ฌ ์ ์ฅ(=์บ์ฑ)ํด๋จ๋ค๊ฐ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
# JVM์ ๋์
- Class Loader
์๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋(.java)๋ฅผ ๋ฐ์ดํธ์ฝ๋(.class)๋ก ๋ณํํ๋ฉด ์ด๋ฅผ JRE์ ๋ก๋ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ์คํํ๊ฒ ๋๋ค. ๋ฐ์ดํธ ์ฝ๋๋ JVM ์์์๋ Class Loader์ ์ํด ๋ฐํ์ ์์ ์ ๋ก๋ฉ๋๋๋ฐ, ์ด ์์ ์์ Lazy Loading์ ๊ตฌํํ๊ธฐ๋ ํ๋ค. - ์คํ ์์ง (Execution Engine)
Class Loader๋ก ๋ถ๋ฌ์จ ๋ฐ์ดํธ์ฝ๋๋ค์ ์คํํ๋ค. 1๋ฐ์ดํธ์ OpCode์ ํผ์ฐ์ฐ์๋ก ๊ตฌ์ฑ๋๋ค. ์ด ์์ ์ ์์ ์ค๋ช ํ JIT ์ปดํ์ผ๋ฌ๊ฐ ์ฌ์ฉ๋๋ค. - Garbage Collector
Heap ์์ญ์์ ์ฐธ์กฐ๋์ง ์๋ ์ค๋ธ์ ํธ๋ฅผ ์ ๊ฑฐํ๋ค. ๋ฌผ๋ก ์ค์ ๊ตฌํ์ ํจ์ฌ ๋ณต์กํ๋ฐ ๊ถ๊ธํ๋ฉด ๊ตฌ๊ธ์ ๊ฒ์ํด๋ณด์. - Runtime Data Areas
OS(์ด์์ฒด์ )๋ก ๋ถํฐ JRE๊ฐ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ค. ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ด๋๋ค.
# ๋ฐ์ดํธ์ฝ๋๋ ๋ชฐ๋ผ๋ ๋๋๊ฑฐ ์๋๊ฐ์?
D2 naver์ ๋ธ๋ก๊ทธ ๋ด์ฉ์ ์ฐธ์กฐํ์๋ค.
1. ํ์
๊ธฐ์กด์ ์ ์๋ํ๋ ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๊ฐ์๊ธฐ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ(NoSuchMethodError)๋ฅผ ๋ธ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
Exception in thread "main" java.lang.NoSuchMethodError: com.user.UserAdmin.addUser(Ljava/lang/String;)V
at com.service.UserService.add(UserService.java:14)
at com.service.UserService.main(UserService.java:19)
๋ด๊ฐ ๊ฐ๋ฐํ ์๋ฐ ์ฝ๋๋ ๊ธฐ์กด์ ์ ์๋๋๋ ์ฝ๋์์ ๋ฐ๋ก ๋ณ๊ฒฝํ๊ฒ ์์ผ๋ฉฐ, ์๋์ ๊ฐ์ ๊ฐ๋จํ ์ฝ๋์ด๋ค.
// UserService.java
…
public void add(String userName) {
admin.addUser(userName);
}
๋ค๋ง ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๋ฐ์ดํธ ๋์๋๋ฐ, ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ฝ๋์์๋ ๋ณ ๋ฌธ์ ์์ด๋ณด์ด๋๋ฐ, ์ ์์์๋ NoSuchMethodError๊ฐ ๋ฐ์ํ๋ ๊ฒ์ผ๊น?
// UserAdmin.java - ์
๋ฐ์ดํธ๋ ์์ค์ฝ๋
…
public User addUser(String userName) {
User user = new User(userName);
User prevUser = userMap.put(userName, user);
return prevUser; // ๋ฐํ ๊ฐ์ ์ฌ์ฉํ๋ ์ฝ๋๋ก ๋ณ๊ฒฝ๋์๋ค.
// ๋จ์ํ ๋ณด๊ธฐ์๋ com.user.UserAdmin.Admin.addUser() ๋ฉ์๋ ์ฌ์ฉ์ ๋ฌธ์ ๊ฐ ์์ด๋ณด์ธ๋ค.
}
// UserAdmin.java - ์๋ ์์ค์ฝ๋
…
public void addUser(String userName) {
User user = new User(userName);
userMap.put(userName, user);
}
2. ์์ธ
์์ธ์ ์ดํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ '์๋ก์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ' ๋ฒ์ ์ผ๋ก ๋ค์ ์ปดํ์ผํ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฐ ์ฝ๋์์ผ๋ก ๋ณด๊ธฐ์๋ ๋ฐํ๊ฐ๊ณผ ๋ฌด๊ดํ๊ฒ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์๋ ๊ฒ ๊ฐ์ง๋ง, ์ค์ ์ปดํ์ผ ๋ ๋ฐ์ดํธ์ฝ๋(.class) ํ์ผ์ ๋ฐํ๊ฐ๊น์ง ์ง์ ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
Exception in thread "main" java.lang.NoSuchMethodError: com.user.UserAdmin.addUser(Ljava/lang/String;)V
์ด ์ค๋ฅ์ ์๋ฏธ๋ com.user.UserAdmin.addUser()๋ผ๋ ๋ฉ์๋๋ฅผ ์ฐพ์ง ๋ชปํ๋ค๋ ์๋ฏธ์ด๋ค. ๋ฉ์๋์ ์ ํ์๋ L, V๋ ์คํ๊ฐ ์๋๋ผ ์๋ฐ ๋ฐ์ดํธ์ฝ๋ ํํ์์ (Ljava/lang/String) ์์ L์ ํด๋์ค ์ธ์คํด์ค๋ฅผ, (...)V๋ ๋ฐํ๊ฐ์ด ์๋ ๋ฉ์๋์์ ์๋ฏธํ๋ค.
์ฆ, ํด๋น ์๋ฐ์ฝ๋๋ ์ด์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก ์ ๋ฐ์ดํธ ๋ ์ ๊ท ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ์ฒด 1๊ฐ๋ฅผ ์ ๋ ฅ๊ฐ์ผ๋ก ๋ฐ๊ณ ๋ฐํ๊ฐ์ด ์๋ addUser()๋ผ๋ ๋ฉ์๋๋ฅผ ์ฐพ์ง ๋ชปํ๋ค๋ ์๋ฏธ์ด๋ค.
3. ์ค๋ช
๋ฌผ๋ก ์ค๋ฅ ์์ฒด๋ ๋ฉ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋ง์๋๋ก ๋ณ๊ฒฝํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๊ณต์์ ์๋ชป์ด ๋งค์ฐ ํฌ๋ค. ํ์ง๋ง ์ค์ ๊ฐ๋ฐํจ์ ์์ด ์ด๋ฌํ ์ํฉ์ ๋ง์งํ๋ค๋ฉด ์ด๋ป๊ฒ ๋์ฒ ํ ์ ์์๊น? ํ๋ฃจ์ข ์ผ ์ฝ๋๋ฅผ ๋๋ฒ๊น ํ๋ค ํ๋ค ๊ณผ์ฐ ๋ฌธ์ ๋ฅผ ์ฐพ์ ์ ์์๊น?
์ด๋ฐ ์ํฉ์์ ํฐ ๋์์ ์ค ์ ์๋ ๊ฒ์ด ๋ฐ๋ก ๋ฐ์ดํธ ์ฝ๋์ ๋ํ ์ดํด์ด๋ค. ๋ฌผ๋ก ํด๋์ค(.class) ํ์ผ ์์ฒด๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ด๋ผ ์ดํดํ๊ธฐ ์ด๋ ต๊ธฐ์ JVM ์ ํจ๊ป ์ ๊ณต๋๋ ์ญ์ด์ ๋ธ๋ฌ(disaasembler)๋ฅผ ์ด์ฉํด์ ๋ถ์ํ๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ฐ์ดํธ ํ๊ธฐ ์ add() ์ฝ๋๋ฅผ javap -c ๋ช ๋ น์ด๋ก ์ญ์ด์ ๋ธํ ๊ฒฐ๊ณผ๋ฌผ์ ๋ค์๊ณผ ๊ฐ๋ค.
/*
// ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์
๋ฐ์ดํธ ์ add ์ฝ๋
public void add(String userName) {
admin.addUser(userName);
}
*/
public void add(java.lang.String);
Code:
0: aload_0
1: getfield #15; //Field admin:Lcom/nhn/user/UserAdmin;
4: aload_1
5: invokevirtual #23; //Method com/nhn/user/UserAdmin.addUser:(Ljava/lang/String;)V
8: return
์ด ๋ฐ์ดํธ์ฝ๋์์ addUser()๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ์ [ 5: invokevirtual #23 ]์ด๋ค. ์ด๋ 23๋ฒ ์ธ๋ฑ์ค์์ ํด๋น ๋ฉ์๋๋ฅผ ์คํํ๋ผ๋ ์๋ฏธ์ด๋ฉฐ ์ดํดํ๊ธฐ ์ฝ๊ฒ javap ํ๋ก๊ทธ๋จ์์ ์ฃผ์์ ๋ฌ์์ฃผ์๋ค.
invokevirtual์ ์ด๋ฆ์์ ์ ์ถ ํ ์ ์๋ฏ์ด ์๋ฐ ๋ฐ์ดํธ์ฝ๋์์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ช ๋ น์ด์ OpCode ์ด๋ค.
- invokeinterface: ์ธํฐํ์ด์ค ๋ฉ์๋ ํธ์ถ
- invokespecial: ์์ฑ์, private ๋ฉ์๋, ์ํผ ํด๋์ค์ ๋ฉ์๋ ํธ์ถ
- invokestatic: static ๋ฉ์๋ ํธ์ถ
- invokevirtual: ์ธ์คํด์ค ๋ฉ์๋ ํธ์ถ
- ๊ทธ ์ธ ํผ์ฐ์ฐ์ (Operand)
์ด๋ฅผ ์ ๋ฐ์ดํธ๋ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ญ์ด์ ๋ธํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
/*
// ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์
๋ฐ์ดํธ ํ add ์ฝ๋ (๋์ผ)
public void add(String userName) {
admin.addUser(userName);
}
*/
public void add(java.lang.String);
Code:
0: aload_0
1: getfield #15; //Field admin:Lcom/nhn/user/UserAdmin;
4: aload_1
5: invokevirtual #23; //Method com/nhn/user/UserAdmin.addUser:(Ljava/lang/String;)Lcom/nhn/user/User;
8: pop
9: return
์ด๋ ๊ฒ ๋ฐ์ดํธ์ฝ๋ ๋ถ์์ ํตํด ์ด๋ค ๋ถ๋ถ์ด ๋ฌ๋ผ์ ธ์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋์ง ์ฝ๊ฒ ์ ์ถ ํ ์ ์๋ค.
๋ฌผ๋ก '๊ทธ๋ฅ ๊ตฌ๊ธ์ ์ค๋ฅ๋ช ๊ทธ๋๋ก ๊ฒ์ํ๋๊น ํด๊ฒฐ๋ฐฉ๋ฒ์ด ๋์ค๋๋ฐ์?' ํ๊ณ ๋์ด๊ฐ๋ ์๊ด์ ์์ผ๋ ์ด๋ฐ ๋ฐฉ๋ฒ๋ ์๋ค๋๊ฑธ ์ธ์ง์ ๋๋ ํ๊ณ ์์ผ๋ฉด ์ถํ์ ๋ฐ๋์ ๋์์ด ๋ ๊ฒ์ด๋ค.
'๐๊ธฐ๋ณธ ์ง์ > Java ๊ธฐ๋ณธ์ง์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฐ๋ ๋ ๋๊ธฐํ (sync, volatile, AtomicClass) (0) | 2021.07.27 |
---|---|
์๋ฐ์ String๊ณผ Constant Pool (2) | 2021.07.27 |
.equals์ .hashCode()๋ ํญ์ ํจ๊ป ์ค๋ฒ๋ผ์ด๋ฉํด์ผํ๋ค. (0) | 2021.07.27 |
์ ๋ค๋ฆญ(Generic)์ ๋ํ์ฌ (0) | 2021.07.26 |
์๋ฐ์์ Stack Memory & Heap Memory (0) | 2021.07.10 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev