Java

[Java] JDK, JRE, JVM μ§ˆμ˜μ‘λ‹΅ (ChatGPT)

devJK93 2024. 8. 31.

πŸ”₯ .java → javac → .class → JVM

❓ Question

μžλ°” μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ 클래슀 파일이 되고 이 클래슀 νŒŒμΌμ„ JVMμ—μ„œ μ‹€ν–‰ν•˜λŠ”κ±° λ§žμ•„?

 

πŸ“ Answer

λ„€, λ§žμŠ΅λ‹ˆλ‹€! μžλ°” ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” 과정은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. μžλ°” μ†ŒμŠ€ μ½”λ“œ μž‘μ„±: κ°œλ°œμžλŠ” .java νŒŒμΌμ— μžλ°” μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
  2. 컴파일: μžλ°” 컴파일러(javac)λ₯Ό μ‚¬μš©ν•˜μ—¬ .java νŒŒμΌμ„ μ»΄νŒŒμΌν•˜λ©΄ λ°”μ΄νŠΈμ½”λ“œκ°€ ν¬ν•¨λœ .class 파일이 μƒμ„±λ©λ‹ˆλ‹€. 이 .class νŒŒμΌμ€ JVM이 이해할 수 μžˆλŠ” 쀑간 ν˜•νƒœμ˜ μ½”λ“œμž…λ‹ˆλ‹€.
  3. μ‹€ν–‰: μžλ°” 가상 λ¨Έμ‹ (JVM)이 .class νŒŒμΌμ„ μ½μ–΄μ„œ μ‹€ν–‰ν•©λ‹ˆλ‹€. JVM은 λ°”μ΄νŠΈμ½”λ“œλ₯Ό ν•΄μ„ν•˜κ±°λ‚˜ Just-In-Time (JIT) 컴파일러λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°”μ΄νŠΈμ½”λ“œλ₯Ό λ„€μ΄ν‹°λΈŒ λ¨Έμ‹  μ½”λ“œλ‘œ λ³€ν™˜ν•˜μ—¬ μ‹€ν–‰ν•©λ‹ˆλ‹€.

즉, μžλ°” μ†ŒμŠ€ μ½”λ“œλŠ” μžλ°” μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ .class 파일둜 λ³€ν™˜λ˜κ³ , 이 .class νŒŒμΌμ€ JVMμ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€.

 

πŸ”₯ JVM μ’…λ₯˜

❓ Question

JVM은 μ–΄λ–€κ²Œ μžˆμ§€

 

πŸ“ Answer

μžλ°” 가상 λ¨Έμ‹ (JVM)은 μžλ°” ν”„λ‘œκ·Έλž¨μ˜ 싀행을 λ‹΄λ‹Ήν•˜λŠ” μ€‘μš”ν•œ ꡬ성 μš”μ†Œλ‘œ, λ‹€μ–‘ν•œ JVM κ΅¬ν˜„μ²΄κ°€ μžˆμŠ΅λ‹ˆλ‹€. μ£Όμš” JVM κ΅¬ν˜„μ²΄λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. Oracle HotSpot JVM:
    • μ„€λͺ…: 였라클의 JDK(μžλ°” 개발 ν‚€νŠΈ)μ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ JVMμž…λ‹ˆλ‹€. 널리 μ‚¬μš©λ˜λ©°, μ„±λŠ₯ μ΅œμ ν™”μ™€ λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
    • νŠΉμ§•: JIT(Just-In-Time) 컴파일러, 가비지 컬렉터, λ©€ν‹°μŠ€λ ˆλ”© 지원 λ“±.
  2. OpenJ9:
    • μ„€λͺ…: IBMμ—μ„œ κ°œλ°œν•œ JVM으둜, Eclipse μž¬λ‹¨μ˜ μ˜€ν”ˆ μ†ŒμŠ€ ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.
    • νŠΉμ§•: λ©”λͺ¨λ¦¬ μ‚¬μš©κ³Ό μŠ€νƒ€νŠΈμ—… 속도 μ΅œμ ν™”, λ‹€μ–‘ν•œ 가비지 컬렉터 μ˜΅μ…˜ 제곡.
  3. GraalVM:
    • μ„€λͺ…: μ˜€λΌν΄μ—μ„œ κ°œλ°œν•œ JVM으둜, κ³ μ„±λŠ₯ JIT μ»΄νŒŒμΌλŸ¬μ™€ ν•¨κ»˜ λ‹€κ΅­μ–΄ 지원을 μ œκ³΅ν•©λ‹ˆλ‹€.
    • νŠΉμ§•: μžλ°” 외에도 JavaScript, Ruby, R, Python λ“± μ—¬λŸ¬ μ–Έμ–΄λ₯Ό μ§€μ›ν•˜λ©°, λ„€μ΄ν‹°λΈŒ 이미지 κΈ°λŠ₯도 제곡.
  4. Zulu OpenJDK:
    • μ„€λͺ…: Azul Systemsμ—μ„œ μ œκ³΅ν•˜λŠ” OpenJDK의 μ˜€ν”ˆ μ†ŒμŠ€ λ°°ν¬νŒμž…λ‹ˆλ‹€.
    • νŠΉμ§•: ZuluλŠ” λ‹€μ–‘ν•œ ν”Œλž«νΌμ—μ„œ μ‚¬μš©ν•  수 있으며, μ•ˆμ •μ„±κ³Ό μ„±λŠ₯을 κ°•μ‘°ν•©λ‹ˆλ‹€.
  5. Amazon Corretto:
    • μ„€λͺ…: Amazon Web Services(AWS)μ—μ„œ μ œκ³΅ν•˜λŠ” μžλ°” SE의 무료 λ°°ν¬νŒμž…λ‹ˆλ‹€.
    • νŠΉμ§•: AWS ν΄λΌμš°λ“œ ν™˜κ²½μ— μ΅œμ ν™”λ˜μ–΄ 있으며, μž₯κΈ° 지원(LTS)을 μ œκ³΅ν•©λ‹ˆλ‹€.
  6. JRockit:
    • μ„€λͺ…: 였라클이 μΈμˆ˜ν•œ BEA Systems의 JVMμž…λ‹ˆλ‹€. ν˜„μž¬λŠ” 였라클의 HotSpot JVM으둜 ν†΅ν•©λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    • νŠΉμ§•: κ³ μ„±λŠ₯κ³Ό 관리 도ꡬλ₯Ό κ°•μ‘°ν–ˆμœΌλ‚˜, μ΄μ œλŠ” 더 이상 λ…λ¦½μ μœΌλ‘œ μ œκ³΅λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

각 JVM은 μ„œλ‘œ λ‹€λ₯Έ νŠΉμ§•κ³Ό μ„±λŠ₯ μ΅œμ ν™” μ˜΅μ…˜μ„ μ œκ³΅ν•˜λ―€λ‘œ, νŠΉμ • ν™˜κ²½μ΄λ‚˜ μš”κ΅¬μ‚¬ν•­μ— λ§žλŠ” JVM을 μ„ νƒν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

 

πŸ”₯ JDKκ°€ javac 포함

❓ Question

μžλ°” μ»΄νŒŒμΌλŸ¬λ„ λ”°λ‘œ μ„€μΉ˜ν•΄μ•ΌλΌ?

 

πŸ“ Answer

λ„€, μžλ°” μ»΄νŒŒμΌλŸ¬λŠ” μžλ°” 개발 도ꡬ(λ˜λŠ” JDK)의 μΌλΆ€λ‘œ μ œκ³΅λ©λ‹ˆλ‹€. JDK(μžλ°” 개발 ν‚€νŠΈ)λŠ” μžλ°” μ†ŒμŠ€ μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜κ³  μ‹€ν–‰ν•  수 μžˆλŠ” 도ꡬ와 라이브러리λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. JDKμ—λŠ” μžλ°” 컴파일러(javac), μžλ°” μ‹€ν–‰ ν™˜κ²½(java), 그리고 기타 μœ μš©ν•œ 도ꡬ듀이 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은:

  1. JDK μ„€μΉ˜: μžλ°” 컴파일러(javac)λŠ” JDK의 μΌλΆ€λ‘œ ν¬ν•¨λ˜μ–΄ 있기 λ•Œλ¬Έμ—, μžλ°” κ°œλ°œμ„ ν•˜λ €λ©΄ JDKλ₯Ό μ„€μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. JDKλŠ” μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜κ³  μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  도ꡬλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  2. JRE와 JDK: JRE(μžλ°” μ‹€ν–‰ ν™˜κ²½)λŠ” μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ λΌμ΄λΈŒλŸ¬λ¦¬μ™€ JVM을 ν¬ν•¨ν•˜μ§€λ§Œ, μžλ°” μ†ŒμŠ€ μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜λŠ” κΈ°λŠ₯은 ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 컴파일 κΈ°λŠ₯을 μ‚¬μš©ν•˜λ €λ©΄ JDKλ₯Ό μ„€μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  3. μ„€μΉ˜ 방법:
    • Oracle JDK: 였라클 μ›Ήμ‚¬μ΄νŠΈμ—μ„œ λ‹€μš΄λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • OpenJDK: μ—¬λŸ¬ μ˜€ν”ˆ μ†ŒμŠ€ ν”„λ‘œμ νŠΈ μ‚¬μ΄νŠΈμ—μ„œ λ‹€μš΄λ‘œλ“œν•  수 있으며, λ‹€μ–‘ν•œ 배포판이 μžˆμŠ΅λ‹ˆλ‹€.
    • Amazon Corretto: AWS μ›Ήμ‚¬μ΄νŠΈμ—μ„œ λ‹€μš΄λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • Azul Zulu: Azul Systems의 μ›Ήμ‚¬μ΄νŠΈμ—μ„œ λ‹€μš΄λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  4. ν™˜κ²½ λ³€μˆ˜ μ„€μ •: JDKλ₯Ό μ„€μΉ˜ν•œ ν›„μ—λŠ” JAVA_HOME ν™˜κ²½ λ³€μˆ˜λ₯Ό μ„€μ •ν•˜κ³ , PATH ν™˜κ²½ λ³€μˆ˜μ— bin 디렉터리λ₯Ό μΆ”κ°€ν•˜μ—¬ javac와 같은 도ꡬλ₯Ό λͺ…λ Ήμ€„μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ„€μΉ˜κ°€ μ™„λ£Œλ˜λ©΄, λͺ…λ Ήμ€„μ—μ„œ javac -version을 μž…λ ₯ν•˜μ—¬ μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ μ œλŒ€λ‘œ μ„€μΉ˜λ˜μ—ˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ”₯ Java μ„€μΉ˜

❓ Question

μžλ°”λ₯Ό μ„€μΉ˜ν•˜λ©΄ JDKκ°€ μžˆλŠ”κ±°μ•Ό?

 

πŸ“ Answer

μžλ°”λ₯Ό μ„€μΉ˜ν•  λ•Œ, JDK(Java Development Kit)λ₯Ό μ„€μΉ˜ν•  수 있으며, μ΄λŠ” μžλ°” 컴파일러λ₯Ό ν¬ν•¨ν•œ μžλ°” κ°œλ°œμ— ν•„μš”ν•œ 전체 도ꡬ 집합을 μ œκ³΅ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 기본적으둜 μžλ°”λ₯Ό μ„€μΉ˜ν•  λ•Œ, μžλ°” μ‹€ν–‰ ν™˜κ²½(JRE, Java Runtime Environment)만 μ„€μΉ˜λ˜λŠ” κ²½μš°λ„ μžˆμŠ΅λ‹ˆλ‹€. JREλŠ” μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ λΌμ΄λΈŒλŸ¬λ¦¬μ™€ JVM(Java Virtual Machine)만 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μžλ°” κ°œλ°œμ„ μœ„ν•΄ JDKλ₯Ό μ„€μΉ˜ν•˜λ €λ©΄ λ‹€μŒκ³Ό 같은 점을 κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€:

  1. JRE와 JDK의 차이:
    • JRE: μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ ν™˜κ²½μœΌλ‘œ, JVMκ³Ό μžλ°” 클래슀 라이브러리만 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
    • JDK: μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜λŠ” 데 ν•„μš”ν•œ 도ꡬλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€. JDKλŠ” JREλ₯Ό ν¬ν•¨ν•˜λ©°, μΆ”κ°€μ μœΌλ‘œ μžλ°” 컴파일러(javac), μžλ°” λ¬Έμ„œ 생성기(javadoc), μžλ°” 디버거(jdb) λ“± κ°œλ°œμ— ν•„μš”ν•œ 도ꡬ듀을 μ œκ³΅ν•©λ‹ˆλ‹€.
  2. JDK μ„€μΉ˜:
    • JDKλ₯Ό μ„€μΉ˜ν•˜λ €λ©΄, 였라클의 JDK μ›Ήμ‚¬μ΄νŠΈλ‚˜ OpenJDK, Amazon Corretto, Azul Zulu λ“± λ‹€λ₯Έ JDK 배포판 제곡 μ‚¬μ΄νŠΈμ—μ„œ λ‹€μš΄λ‘œλ“œν•˜μ—¬ μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • JDK μ„€μΉ˜ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•œ ν›„, μ„€μΉ˜λ₯Ό μ§„ν–‰ν•˜λ©΄ μžλ°” μ»΄νŒŒμΌλŸ¬μ™€ ν•¨κ»˜ 개발 도ꡬ가 μ„€μΉ˜λ©λ‹ˆλ‹€.
  3. μ„€μΉ˜ 방법:
  4. μ„€μΉ˜ 확인:
    • μ„€μΉ˜κ°€ μ™„λ£Œλ˜λ©΄, λͺ…λ Ήμ€„μ—μ„œ java -versionκ³Ό javac -version을 μž…λ ₯ν•˜μ—¬ μžλ°” λŸ°νƒ€μž„κ³Ό μ»΄νŒŒμΌλŸ¬κ°€ μ •μƒμ μœΌλ‘œ μ„€μΉ˜λ˜μ—ˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ •λ¦¬ν•˜μžλ©΄, μžλ°”λ₯Ό μ„€μΉ˜ν•œλ‹€κ³  ν•΄μ„œ 기본적으둜 JDKκ°€ μ„€μΉ˜λ˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. μžλ°” κ°œλ°œμ„ μœ„ν•΄μ„œλŠ” λ³„λ„λ‘œ JDKλ₯Ό μ„€μΉ˜ν•΄μ•Ό ν•˜λ©°, JDKλŠ” JREλ₯Ό ν¬ν•¨ν•˜κ³  μžλ°” κ°œλ°œμ— ν•„μš”ν•œ λͺ¨λ“  도ꡬλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

 

πŸ”₯ Java μ„€μΉ˜ οΉ¦ JDK μ„€μΉ˜ ?

❓ Question

보톡 μžλ°”λ₯Ό μ„€μΉ˜ν•œλ‹€λŠ” 말은 JDKλ₯Ό μ„€μΉ˜ν•œλ‹€λŠ” 말과 같은거야?

 

πŸ“ Answer

"μžλ°”λ₯Ό μ„€μΉ˜ν•œλ‹€"λŠ” ν‘œν˜„μ€ λ¬Έλ§₯에 따라 λ‹€λ₯Ό 수 μžˆμ§€λ§Œ, μΌλ°˜μ μœΌλ‘œλŠ” 두 가지 κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€:

  1. JDK μ„€μΉ˜:
    • μžλ°” κ°œλ°œμ„ μœ„ν•œ 경우: μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜λ €λŠ” κ²½μš°μ—λŠ” JDKλ₯Ό μ„€μΉ˜ν•˜λŠ” 것이 λ§žμŠ΅λ‹ˆλ‹€. JDKμ—λŠ” μžλ°” 컴파일러(javac), μžλ°” λŸ°νƒ€μž„(java), 그리고 개발 도ꡬ듀이 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ "μžλ°”λ₯Ό μ„€μΉ˜ν•œλ‹€"λŠ” 말이 JDKλ₯Ό μ„€μΉ˜ν•œλ‹€λŠ” 의미둜 μ‚¬μš©λ  λ•Œκ°€ λ§ŽμŠ΅λ‹ˆλ‹€.
    • κΈ°λŠ₯ 확인: javac와 같은 개발 도ꡬλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜κ±°λ‚˜, μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜κ³  배포할 κ³„νšμ΄ μžˆλŠ” κ²½μš°μ—λŠ” JDK μ„€μΉ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
  2. JRE μ„€μΉ˜:
    • μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 싀행을 μœ„ν•œ 경우: μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰λ§Œ ν•˜κ³  κ°œλ°œν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λŠ” JRE만 μ„€μΉ˜ν•΄λ„ μΆ©λΆ„ν•©λ‹ˆλ‹€. JREλŠ” JVMκ³Ό μžλ°” 라이브러리λ₯Ό ν¬ν•¨ν•˜κ³  있으며, μžλ°” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  것을 μ œκ³΅ν•©λ‹ˆλ‹€.
    • 개발 ν•„μš” μ—†μŒ: μžλ°” μ†ŒμŠ€ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ±°λ‚˜ μ»΄νŒŒμΌν•  ν•„μš”κ°€ μ—†κ³ , λ‹¨μˆœνžˆ μžλ°” 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λͺ©μ μ΄λΌλ©΄ JRE만 μ„€μΉ˜ν•˜λ©΄ λ©λ‹ˆλ‹€.

μš”μ•½

  • μžλ°” 개발: JDK μ„€μΉ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€. JDKλŠ” JREλ₯Ό ν¬ν•¨ν•˜κ³  μžˆμ–΄ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 개발과 싀행이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰: JRE만 μ„€μΉ˜ν•˜λ©΄ λ©λ‹ˆλ‹€. JREλŠ” μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ λΌμ΄λΈŒλŸ¬λ¦¬μ™€ JVM을 μ œκ³΅ν•©λ‹ˆλ‹€.

κ·Έλž˜μ„œ 일반적으둜 "μžλ°”λ₯Ό μ„€μΉ˜ν•œλ‹€"λŠ” 말은 κ°œλ°œμ„ μœ„ν•œ JDK μ„€μΉ˜λ₯Ό μ˜λ―Έν•˜λŠ” κ²½μš°κ°€ λ§Žμ§€λ§Œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰λ§Œμ„ μœ„ν•œ κ²½μš°μ—λŠ” JREλ₯Ό μ„€μΉ˜ν•œλ‹€κ³  이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ”₯ static은 객체 생성 전에 쑴재

❓ Question

μžλ°” static은 μΈμŠ€ν„΄μŠ€ 생성전에 μžˆλŠ”κ±°μž–μ•„

 

πŸ“ Answer

λ„€, λ§žμŠ΅λ‹ˆλ‹€! μžλ°”μ—μ„œ static ν‚€μ›Œλ“œλŠ” 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ μ ‘κ·Όν•  수 μžˆλŠ” 멀버λ₯Ό μ •μ˜ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. ꡬ체적으둜, static으둜 μ„ μ–Έλœ λ³€μˆ˜λ‚˜ λ©”μ„œλ“œλŠ” ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ  λ•Œ μƒμ„±λ˜λ©°, 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ° 전에도 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, static λ³€μˆ˜λŠ” ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ  λ•Œ μ΄ˆκΈ°ν™”λ˜λ©°, 클래슀의 λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅μœ ν•˜λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€. static λ©”μ„œλ“œλ„ 클래슀의 μΈμŠ€ν„΄μŠ€ 없이 ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ° κ°„λ‹¨ν•œ μ˜ˆμ‹œκ°€ μžˆμŠ΅λ‹ˆλ‹€:

public class Example {
    // static λ³€μˆ˜
    static int staticVariable = 0;

    // μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
    int instanceVariable = 0;

    // static λ©”μ„œλ“œ
    static void staticMethod() {
        System.out.println("This is a static method.");
    }

    // μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ
    void instanceMethod() {
        System.out.println("This is an instance method.");
    }

    public static void main(String[] args) {
        // static λ©”μ„œλ“œλŠ” 클래슀 μ΄λ¦„μœΌλ‘œ 호좜 κ°€λŠ₯
        Example.staticMethod();

        // static λ³€μˆ˜λŠ” 클래슀 μ΄λ¦„μœΌλ‘œ μ ‘κ·Ό κ°€λŠ₯
        Example.staticVariable = 10;
        System.out.println("Static variable: " + Example.staticVariable);

        // μΈμŠ€ν„΄μŠ€ 생성 ν›„ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ™€ λ³€μˆ˜ μ‚¬μš© κ°€λŠ₯
        Example example = new Example();
        example.instanceMethod();
        example.instanceVariable = 5;
        System.out.println("Instance variable: " + example.instanceVariable);
    }
}

 

이 μ˜ˆμ œμ—μ„œ staticMethod와 staticVariable은 Example ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ  λ•Œ μƒμ„±λ˜λ©°, μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ§€ μ•Šκ³ λ„ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. 반면, instanceMethod와 instanceVariable은 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ–΄μ•Όλ§Œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ”₯ JVM의 ν΄λž˜μŠ€λ‘œλ”κ°€ static 멀버 생성

❓ Question

JVM의 ν΄λž˜μŠ€λ‘œλ”μ—μ„œ 클래슀λ₯Ό λ‘œλ“œν• λ•Œ μƒμ„±λ˜λ‚˜?

 

πŸ“ Answer

λ§žμŠ΅λ‹ˆλ‹€. JVM의 클래슀 λ‘œλ”κ°€ 클래슀λ₯Ό λ‘œλ“œν•  λ•Œ, static 멀버듀이 μƒμ„±λ©λ‹ˆλ‹€. μžμ„Ένžˆ μ„€λͺ…ν•˜μžλ©΄:

  1. 클래슀 λ‘œλ”©: JVM은 클래슀λ₯Ό ν•„μš”λ‘œ ν•  λ•Œ 클래슀λ₯Ό λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•©λ‹ˆλ‹€. 이 과정은 클래슀 λ‘œλ”μ— μ˜ν•΄ μˆ˜ν–‰λ©λ‹ˆλ‹€.
  2. 클래슀 μ΄ˆκΈ°ν™”: ν΄λž˜μŠ€κ°€ 처음 λ‘œλ“œλ  λ•Œ, static λ³€μˆ˜μ™€ static 블둝이 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€. 클래슀의 static λ©€λ²„λŠ” ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ  λ•Œ μ΄ˆκΈ°ν™”λ˜λ©°, μ΄λŠ” 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜κΈ° μ „μž…λ‹ˆλ‹€.
  3. static λ³€μˆ˜ μ΄ˆκΈ°ν™”: static λ³€μˆ˜λŠ” ν΄λž˜μŠ€κ°€ λ‘œλ“œλ  λ•Œ ν•œ 번만 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€. μ΄λŠ” 클래슀 λ‘œλ”κ°€ 클래슀λ₯Ό λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•  λ•Œ μˆ˜ν–‰λ©λ‹ˆλ‹€. μ΄ˆκΈ°ν™”λŠ” 클래슀의 static 블둝을 ν¬ν•¨ν•˜μ—¬ static λ³€μˆ˜μ˜ μ„ μ–Έ 및 μ΄ˆκΈ°κ°’μ„ 톡해 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.
  4. static 블둝 μ‹€ν–‰: static 블둝은 ν΄λž˜μŠ€κ°€ λ‘œλ“œλ  λ•Œ ν•œ 번 μ‹€ν–‰λ©λ‹ˆλ‹€. 이 블둝은 static λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•˜κ±°λ‚˜ λ‹€λ₯Έ static μ΄ˆκΈ°ν™” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

λ‹€μŒμ€ 이λ₯Ό μ„€λͺ…ν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€:

public class StaticExample {
    // static λ³€μˆ˜
    static int staticVariable = 10;

    // static 블둝
    static {
        System.out.println("Static block executed.");
        staticVariable = 20;
    }

    public static void main(String[] args) {
        // static λ³€μˆ˜ 좜λ ₯
        System.out.println("Static variable: " + StaticExample.staticVariable);
    }
}

이 μ˜ˆμ œμ—μ„œ:

  • StaticExample ν΄λž˜μŠ€κ°€ 처음 λ‘œλ“œλ  λ•Œ, static λ³€μˆ˜ staticVariable이 10으둜 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.
  • 이후 static 블둝이 μ‹€ν–‰λ˜μ–΄ "Static block executed."κ°€ 좜λ ₯되며, staticVariable의 값이 20으둜 λ³€κ²½λ©λ‹ˆλ‹€.
  • main λ©”μ„œλ“œκ°€ 싀행될 λ•Œ, staticVariable의 값은 20으둜 좜λ ₯λ©λ‹ˆλ‹€.

μ •λ¦¬ν•˜μžλ©΄, static 멀버듀은 ν΄λž˜μŠ€κ°€ JVM의 클래슀 λ‘œλ”μ— μ˜ν•΄ λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ˜κ³  μ΄ˆκΈ°ν™”λ  λ•Œ μƒμ„±λ©λ‹ˆλ‹€. 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜κΈ° 전에 μ΄ˆκΈ°ν™”κ°€ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

'Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Java] Reflection  (2) 2024.02.21
Generics (Java)  (1) 2024.02.12
JVM λ©”λͺ¨λ¦¬ ꡬ쑰 (JAVA)  (1) 2024.02.08

λŒ“κΈ€