관리 메뉴

BUILD_SSO

[Java] μžλ°” ν…Œν¬ 인터뷰 part 1 λ³Έλ¬Έ

Tech Interview

[Java] μžλ°” ν…Œν¬ 인터뷰 part 1

sohyeonnn 2023. 5. 17. 16:31

πŸ‘‰πŸ»κ°μ²΄ 지ν–₯ ν”„λ‘œκ·Έλž˜λ° OOP(Object Oriented Programming)

β—Ό 객체지ν–₯ν”„λ‘œκ·Έλž˜λ°μ΄λž€?

  • 객체지ν–₯ν”„λ‘œκ·Έλž˜λ°μ΄λž€ 데이터λ₯Ό 객체둜 μ·¨κΈ‰ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ— λ°˜μ˜ν•œ κ²ƒμœΌλ‘œ, 객체와 객체의 μƒν˜Έμž‘μš©μ„ 톡해 ν”„λ‘œκ·Έλž¨μ΄ λ™μž‘ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€. 
  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 4가지 νŠΉμ§•μœΌλ‘œ 상속, μΊ‘μŠν™”, λ‹€ν˜•μ„±, 좔상화가 있고,
    λͺ¨λ“ˆ μž¬μ‚¬μš©μœΌλ‘œ ν™•μž₯ 및 μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•©λ‹ˆλ‹€.

β—Ό SOLID원칙에 λŒ€ν•΄μ„œ μ„€λͺ…ν•˜μ„Έμš”.

  • SRP
    λ‹¨μΌμ±…μž„μ›μΉ™/ ν•œ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ Έμ•Ό ν•œλ‹€
  • OCP
    κ°œλ°©νμ‡„μ›μΉ™/ ν™•μž₯μ—λŠ” μ—΄λ € 있고, μˆ˜μ •μ—λŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€
  • LSP
    λ¦¬μŠ€μ½”ν”„μΉ˜ν™˜μ›μΉ™/ μƒμœ„νƒ€μž…μ€ ν•˜μœ„νƒ€μž…μœΌλ‘œ μΉ˜ν™˜κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€
  • ISP
    μΈν„°νŽ˜μ΄μŠ€ 뢄리원칙/ μΈν„°νŽ˜μ΄μŠ€ 내에 λ©”μ„œλ“œλŠ” μ μ„μˆ˜λ‘ μ’‹λ‹€    → SRP와 같은 λ¬Έμ œμ— λŒ€ν•œ λ‹€λ₯Έ 해결책이닀.
  • DIP
    μ˜μ‘΄κ΄€κ³„μ—­μ „μ›μΉ™/ ꡬ체적인 ν΄λž˜μŠ€λ³΄λ‹€ μΈν„°νŽ˜μ΄μŠ€, μƒμœ„ν΄λž˜μŠ€, μΆ”μƒν΄λž˜μŠ€μ™€ 같이 λ³€ν•˜μ§€ μ•Šμ„ κ°€λŠ₯성이 큰 ν΄λž˜μŠ€μ™€ 관계λ₯Ό 맺어라

β—Ό 객체지ν–₯μ–Έμ–΄κ°€ μ ˆμ°¨μ§€ν–₯언어와 λ‹€λ₯΄κ²Œ κ°€μ§€λŠ” μž₯점은 λ¬΄μ—‡μΈκ°€μš”?

  • μž¬μ‚¬μš©μ„±
    ν΄λž˜μŠ€μ™€ 객체λ₯Ό μ‚¬μš©ν•˜λ©΄ μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€. 이미 μž‘μ„±λœ 클래슀λ₯Ό 상속받아 μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜ μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν™•μž₯μ„±
    μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜ κΈ°μ‘΄ κΈ°λŠ₯을 μˆ˜μ •ν•˜λŠ” 것이 μƒλŒ€μ μœΌλ‘œ μ‰½μŠ΅λ‹ˆλ‹€. μ΄λŠ” κΈ°λŠ₯이 객체 λ‹¨μœ„λ‘œ κ΅¬λΆ„λ˜μ–΄ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
  • μœ μ§€ 관리 용이
    μ½”λ“œκ°€ 객체 λ‹¨μœ„λ‘œ κ΅¬λΆ„λ˜μ–΄ μžˆμ–΄, μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κ³  λ””λ²„κΉ…ν•˜κΈ° 더 μ‰½μŠ΅λ‹ˆλ‹€. λ˜ν•œ, μ½”λ“œμ˜ μˆ˜μ •μ΄ λ‹€λ₯Έ 뢀뢄에 λ―ΈμΉ˜λŠ” 영ν–₯이 μ μŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, μ„±λŠ₯λ©΄μ—μ„œ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ λ©”λͺ¨λ¦¬ μ‚¬μš©κ³Ό CPU μ‹œκ°„μ΄ 절차 지ν–₯ ν”„λ‘œκ·Έλž˜λ°λ³΄λ‹€ λ§Žμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.


πŸ‘‰πŸ» OOP의 νŠΉμ§•

β—Ό 좔상화, μΊ‘μŠν™”, 상속, λ‹€ν˜•μ„±μ΄λž€?

좔상화(Abstration)

  • 객체의 κ³΅ν†΅μ μΈ μ†μ„±κ³Ό κΈ°λŠ₯을 μΆ”μΆœν•˜μ—¬ μ •μ˜ν•˜λŠ”것을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • μžλ°”μ—μ„œ 좔상화λ₯Ό κ΅¬ν˜„ν•  수 μžˆλŠ” 문법 μš”μ†Œλ‘œλŠ” 좔상 클래슀(abstract class)와 μΈν„°νŽ˜μ΄μŠ€(interface)κ°€ 있고, μΈν„°νŽ˜μ΄μŠ€κ°€ κ°€μž₯ λΉˆλ²ˆν•˜κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€.

μΊ‘μŠν™”(Encapsulation)

  • μΊ‘μŠν™”λž€ ν΄λž˜μŠ€ μ•ˆμ— μ„œλ‘œ μ—°κ΄€μžˆλŠ” μ†μ„±κ³Ό κΈ°λŠ₯듀을 ν•˜λ‚˜μ˜ μΊ‘슐(capsule)둜 λ§Œλ“€μ–΄ λ°μ΄ν„°λ₯Ό μ™ΈλΆ€λ‘œλΆ€ν„° λ³΄ν˜Έν•˜λŠ” κ²ƒμ„ λ§ν•©λ‹ˆλ‹€.
  • μ™ΈλΆ€λ‘œλΆ€ν„° ν΄λž˜μŠ€μ— μ •μ˜λœ 속성과 κΈ°λŠ₯듀을 λ³΄ν˜Έν•˜κ³ (데이터 보호(data protection)), ν•„μš”ν•œλΆ€λΆ„λ§Œ μ™ΈλΆ€λ‘œ λ…ΈμΆœλ  수 μžˆλ„λ‘ ν•˜μ—¬(데이터 μ€λ‹‰(data hiding)) 각 객체 고유의 독립성과 μ±…μž„ μ˜μ—­μ„ μ•ˆμ „ν•˜κ²Œ μ§€ν‚€κ³ μž ν•˜λŠ” λͺ©μ μ΄ μžˆμŠ΅λ‹ˆλ‹€.

상속(Inheritance)

  • 기쑴의 클래슀λ₯Ό μž¬ν™œμš©ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • 상속은 클래슀 κ°„ 곡유될 수 μžˆλŠ” 속성과 κΈ°λŠ₯듀을 μƒμœ„ 클래슀둜 좔상화 μ‹œμΌœ ν•΄λ‹Ή μƒμœ„ ν΄λž˜μŠ€λ‘œλΆ€ν„° ν™•μž₯된 μ—¬λŸ¬ 개의 ν•˜μœ„ ν΄λž˜μŠ€λ“€μ΄ λͺ¨λ‘ μƒμœ„ 클래슀의 속성과 κΈ°λŠ₯듀을 κ°„νŽΈν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
  • 즉, ν΄λž˜μŠ€λ“€ κ°„ κ³΅μœ ν•˜λŠ” 속성과 κΈ°λŠ₯듀을 반볡적으둜 μ •μ˜ν•  ν•„μš” 없이 λ”± ν•œ 번만 μ •μ˜ν•΄λ‘κ³  κ°„νŽΈν•˜κ²Œ μž¬μ‚¬μš©ν•  수 μžˆμ–΄ 반볡적인 μ½”λ“œλ₯Ό μ΅œμ†Œν™”ν•˜κ³  κ³΅μœ ν•˜λŠ” 속성과 κΈ°λŠ₯에 κ°„νŽΈν•˜κ²Œ μ ‘κ·Όν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

λ‹€ν˜•μ„±(polymorphism)

  • λ‹€ν˜•μ„±μ€ ν•˜λ‚˜μ˜ λ³€μˆ˜λͺ…, ν•¨μˆ˜λͺ… 등이 상황에 따라 λ‹€λ₯Έ 의미둜 해석될 수 μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.
  • 즉, μ˜€λ²„λΌμ΄λ”©(Overriding), μ˜€λ²„λ‘œλ”©(Overloading)이 κ°€λŠ₯ν•˜λ‹€λŠ” μ–˜κΈ°μ΄λ‹€.

β—Ό Overriding vs Overloading

  • μ˜€λ²„λΌμ΄λ”©
    μƒμœ„ ν΄λž˜μŠ€μ— μžˆλŠ” λ§€μ„œλ“œλ₯Ό ν•˜μœ„ ν΄λž˜μŠ€μ— μž¬μ •μ˜ν•˜λŠ” 것을 λ§ν•˜κ³ ,
  • μ˜€λ²„λ‘œλ”©
    λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜λ‚˜ νƒ€μž…μ„ λ‹€λ₯΄κ²Œ ν•˜μ—¬ 같은 μ΄λ¦„μ˜ λ§€μ„œλ“œλ₯Ό μ—¬λŸ¬κ°œ μ •μ˜ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€.

β—Ό interface와 abstract에 λŒ€ν•΄μ„œ μ„€λͺ…ν•˜μ„Έμš”.

μΈν„°νŽ˜μ΄μŠ€(interface)

  • λͺ¨λ“  λ©”μ„œλ“œκ°€ 좔상 λ©”μ„œλ“œλ‘œ 이루어진 클래슀 μž…λ‹ˆλ‹€.
  • abstractλ₯Ό 쓰지 μ•Šμ•„λ„ λͺ¨λ‘ 좔상 λ©”μ„œλ“œλ‘œ μ •μ˜λ˜λ©°, μ„ μ–Έν•œ λ³€μˆ˜λŠ” final static ν‚€μ›Œλ“œκ°€ λΆ™μŠ΅λ‹ˆλ‹€.

μΆ”μƒν΄λž˜μŠ€(abstract)

  • ν΄λž˜μŠ€λ‚΄μ— 좔상 λ§€μ„œλ“œκ°€ ν•˜λ‚˜ 이상 ν¬ν•¨λ˜κ±°λ‚˜ abstract둜 μ •μ˜λœ 경우λ₯Ό λ§ν•©λ‹ˆλ‹€.
  • μΆ”μƒν΄λž˜μŠ€λŠ” μžμ‹ μ˜ μƒμ„±μžλ‘œ 객체 생성이 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. ν•˜μœ„ 클래슀λ₯Ό μ°Έμ‘°ν•΄ μƒμœ„ 클래슀의 객체λ₯Ό μƒμ„±ν•˜μ—¬ ν•˜μœ„ 클래슀λ₯Ό μ œμ–΄ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€.

κ³΅ν†΅μ μœΌλ‘œ new μ—°μ‚°μžλ‘œ μΈμŠ€ν„΄μŠ€ 생성이 λΆˆκ°€λŠ₯ν•˜λ©°, μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ ν™•μž₯/κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.

β—Ό μΈν„°νŽ˜μ΄μŠ€μ™€ μΆ”μƒν΄λž˜μŠ€μ˜ 차이 (Interface VS Abstract Class)

  • μΈν„°νŽ˜μ΄μŠ€λŠ” κ·Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” λͺ¨λ“  ν΄λž˜μŠ€μ— λŒ€ν•΄ νŠΉμ •ν•œ λ©”μ†Œλ“œκ°€ λ°˜λ“œμ‹œ μ‘΄μž¬ν•˜λ„λ‘ κ°•μ œν•¨μ— 있고,
    μΆ”μƒν΄λž˜μŠ€λŠ” μƒμ†λ°›λŠ” ν΄λž˜μŠ€λ“€μ˜ 곡톡적인 λ‘œμ§μ„ 좔상화 μ‹œν‚€κ³ , κΈ°λŠ₯ ν™•μž₯을 μœ„ν•΄ μ‚¬μš©ν•œλ‹€.
  • μΆ”μƒν΄λž˜μŠ€λŠ” 닀쀑상속이 λΆˆκ°€λŠ₯ν•˜μ§€λ§Œ,
    μΈν„°νŽ˜μ΄μŠ€λŠ” 닀쀑상속이 κ°€λŠ₯ν•˜λ‹€.

β—Ό μ™œ ν΄λž˜μŠ€λŠ” 단일 μƒμ†λ§Œ κ°€λŠ₯ν•œλ°, μΈν„°νŽ˜μ΄μŠ€λŠ” 2개 이상 κ΅¬ν˜„μ΄ κ°€λŠ₯ν• κΉŒμš”?

  • μΈν„°νŽ˜μ΄μŠ€λŠ” μ‹€μ§ˆμ μΈ κ΅¬ν˜„μ΄ 이루어지지 μ•Šκ³  λ©”μ†Œλ“œμ— λŒ€ν•œ μ •μ˜λ§Œ ν•˜κ³  있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
  • κ²°κ΅­μ—” λ©”μ†Œλ“œκ°€ κ²ΉμΉ˜λ”λΌλ„ μ΅œμ’… κ΅¬ν˜„ 뢀뢄은 κ΅¬ν˜„ 객체(Concrete class)μ—μ„œ μ΄λ£¨μ–΄μ§ˆ 것이기 λ•Œλ¬Έμ— μΈν„°νŽ˜μ΄μŠ€λŠ” 2개 이상 κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

πŸ‘‰πŸ» JVM, GC

β—Ό JVM이 μ •ν™•νžˆ 무엇이고, μ–΄λ–€ κΈ°λŠ₯을 ν•˜λŠ”μ§€ μ„€λͺ…ν•΄ μ£Όμ„Έμš”.

  • JVM은 Javaλ₯Ό μ‹€ν–‰ν•˜κΈ°μœ„ν•œ 가상 ν™˜κ²½ μž…λ‹ˆλ‹€.
  • ν”Œλž«νΌ 독립성
    JVM은 Java μ½”λ“œκ°€ ν•œ 번 μž‘μ„±λ˜λ©΄ μ–΄λ–€ ν•˜λ“œμ›¨μ–΄μ™€ 운영 μ²΄μ œμ—μ„œλ„ λ™μž‘ν•˜κ²Œ ν•˜λŠ” ν”Œλž«νΌ 독립성을 μ œκ³΅ν•©λ‹ˆλ‹€. Java μ»΄νŒŒμΌλŸ¬λŠ” Java μ½”λ“œλ₯Ό λ°”μ΄νŠΈμ½”λ“œλ‘œ λ³€ν™˜ν•˜κ³ , 이 λ°”μ΄νŠΈμ½”λ“œλŠ” λͺ¨λ“  JVMμ—μ„œ λ™μΌν•˜κ²Œ μ‹€ν–‰λ©λ‹ˆλ‹€. μ΄λŠ” κ°œλ°œμžκ°€ νŠΉμ • ν•˜λ“œμ›¨μ–΄λ‚˜ 운영 μ²΄μ œμ— 맞좰 μ½”λ“œλ₯Ό μž‘μ„±ν•  ν•„μš”κ°€ μ—†μŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.
  • λ©”λͺ¨λ¦¬ 관리
    JVM은 μžλ™ λ©”λͺ¨λ¦¬ 관리λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. JVM의 가비지 μ»¬λ ‰ν„°λŠ” λ™μ μœΌλ‘œ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ νšŒμˆ˜ν•˜μ—¬ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.
  • λ³΄μ•ˆ
    JVM은 클래슀 λ‘œλ”μ™€ λ°”μ΄νŠΈμ½”λ“œ 검증기λ₯Ό 톡해 λ³΄μ•ˆμ„ μ œκ³΅ν•©λ‹ˆλ‹€. 클래슀 λ‘œλ”λŠ” μ½”λ“œλ₯Ό JVM에 λ‘œλ“œν•˜λŠ” 역할을 ν•˜λ©°, λ°”μ΄νŠΈμ½”λ“œ κ²€μ¦κΈ°λŠ” μ½”λ“œκ°€ μ•ˆμ „ν•˜κ²Œ 싀행될 수 μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. 이런 λ°©μ‹μœΌλ‘œ JVM은 μ•…μ„± μ½”λ“œμ˜ 싀행을 λ°©μ§€ν•˜κ³  μ‹œμŠ€ν…œμ˜ λ³΄μ•ˆμ„ μœ μ§€ν•©λ‹ˆλ‹€.

즉, JVM은 μŠ€νƒ 기반으둜 λ™μž‘ν•˜λ©°, Java Byte Codeλ₯Ό μš΄μ˜μ²΄μ œμ— 맞게 ν•΄μ„ν•΄μ£ΌλŠ” 역할을 ν•˜κ³  κ°€λΉ„μ§€μ»¬λ ‰μ…˜μ„ 톡해 μžλ™ λ©”λͺ¨λ¦¬ 관리λ₯Ό ν•΄μ€λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, JVM은 '컴파일 -> λ°”μ΄νŠΈ μ½”λ“œ -> 기계어' μ΄λŸ°μ‹μœΌλ‘œ 쀑간에 λ°”μ΄νŠΈ μ½”λ“œ 과정이 있기 λ•Œλ¬Έμ— 속도와 λ©”λͺ¨λ¦¬μ—μ„œ 단점이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

β—Ό 그럼, μžλ°” 말고 λ‹€λ₯Έ μ–Έμ–΄λŠ” JVM μœ„μ— 올릴 수 μ—†λ‚˜μš”?

  • 올릴 수 μžˆμŠ΅λ‹ˆλ‹€. JVM μœ„μ—μ„œ 싀행될 수 μžˆλŠ” μ–Έμ–΄λ₯Ό JVM 언어라고 λΆ€λ¦…λ‹ˆλ‹€.
  • Scala, Kotlin, Groovy 등이 JVM 언어에 μ†ν•©λ‹ˆλ‹€.
  • μ΄λŸ¬ν•œ 언어듀은 각자의 νŠΉμ„±μ„ 가지고 μžˆμ§€λ§Œ, JVM μœ„μ—μ„œ μ‹€ν–‰λ˜λ―€λ‘œ Java의 λΌμ΄λΈŒλŸ¬λ¦¬μ™€ ν”„λ ˆμž„μ›Œν¬λ₯Ό ν™œμš©ν•  수 있고, JVM의 λ©”λͺ¨λ¦¬ 관리와 μ„±λŠ₯ μ΅œμ ν™” 같은 κΈ°λŠ₯을 μ΄μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

β—Ό λ°˜λŒ€λ‘œ JVM 계열 μ–Έμ–΄λ₯Ό 일반적으둜 μ»΄νŒŒμΌν•΄μ„œ μ‚¬μš©ν•  순 μ—†λ‚˜μš”?

  • νŠΉμ • μƒν™©μ—μ„œ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ 컴파일될 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” GraalVMμ΄λ‚˜ Kotlin/Native와 같은 도ꡬλ₯Ό μ‚¬μš©ν•˜λ©΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, 일반적으둜 JVM μ–Έμ–΄λ₯Ό μ‚¬μš©ν•˜λŠ” μ£Όμš” μ΄μœ λŠ” JVM의 μž₯점을 ν™œμš©ν•˜κΈ° μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ JVM κ³„μ—΄ μ–Έμ–΄λ₯Ό λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ μ»΄νŒŒμΌν•˜λŠ” κ²ƒμ€ μΌλ°˜μ μΈ κ²½μš°λŠ” μ•„λ‹™λ‹ˆλ‹€.

β—Ό VM을 μ‚¬μš©ν•¨μœΌλ‘œμ¨ 얻을 수 μžˆλŠ” μž₯점과 단점에 λŒ€ν•΄ μ„€λͺ…ν•΄ μ£Όμ„Έμš”.

μž₯점

  • ν”Œλž«νΌ 독립성
    VM은 ν•˜λ“œμ›¨μ–΄μ™€ 운영 체제의 μ„ΈλΆ€ 사항을 μΆ”μƒν™”ν•˜μ—¬, 같은 ν”„λ‘œκ·Έλž¨μ„ λ‹€μ–‘ν•œ μ‹œμŠ€ν…œμ—μ„œ λ™μΌν•˜κ²Œ μ‹€ν–‰ν•  수 있게 ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, Java Virtual Machine(JVM)은 Java ν”„λ‘œκ·Έλž¨μ„ λͺ¨λ“  JVM이 μ„€μΉ˜λœ ν”Œλž«νΌμ—μ„œ μ‹€ν–‰ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.
  • λ³΄μ•ˆ
    VM은 일반적으둜 μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨μ„ 호슀트 μ‹œμŠ€ν…œμœΌλ‘œλΆ€ν„° κ²©λ¦¬ν•©λ‹ˆλ‹€. 이둜 인해, 잠재적으둜 μœ„ν—˜ν•œ μ½”λ“œκ°€ μ‹œμŠ€ν…œ 전체에 영ν–₯을 λ―ΈμΉ˜λŠ” 것을 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ©”λͺ¨λ¦¬ 관리와 μ΅œμ ν™”
    VM은 μžλ™ λ©”λͺ¨λ¦¬ 관리와 가비지 μ»¬λ ‰μ…˜ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. λ˜ν•œ, VM은 Just-In-Time 컴파일과 같은 κΈ°μˆ μ„ 톡해 ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 속도λ₯Ό μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

단점

  • 속도
    VM을 거쳐 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 것은 일반적으둜 직접 ν•˜λ“œμ›¨μ–΄μ—μ„œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 것보닀 λŠλ¦½λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ΅œμ ν™” 기술이 λ°œμ „ν•¨μ— 따라 이 μ°¨μ΄λŠ” 점점 쀄어듀고 μžˆμŠ΅λ‹ˆλ‹€.
  • μžμ› μ‚¬μš©
    VM은 자체적인 운영 μ²΄μ œμ™€ λŸ°νƒ€μž„ μ‹œμŠ€ν…œμ„ μœ μ§€ν•˜κΈ° λ•Œλ¬Έμ— 좔가적인 λ©”λͺ¨λ¦¬μ™€ CPU λ¦¬μ†ŒμŠ€ μžμ›μ„ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

β—Ό JVMκ³Ό λ‚΄λΆ€μ—μ„œ μ‹€ν–‰λ˜κ³  μžˆλŠ” ν”„λ‘œκ·Έλž¨μ€ λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€ - μžμ‹ ν”„λ‘œμ„ΈμŠ€ 관계λ₯Ό κ°–κ³  μžˆλ‹€κ³  봐도 λ¬΄λ°©ν•œκ°€μš”?

  • 일반적인 운영 체제의 ν”„λ‘œμ„ΈμŠ€ 계측 관계λ₯Ό κ³ λ €ν•  λ•Œ, JVMκ³Ό κ·Έ λ‚΄λΆ€μ—μ„œ μ‹€ν–‰λ˜κ³  μžˆλŠ” ν”„λ‘œκ·Έλž¨μ€ λΆ€λͺ¨-μžμ‹ 관계라고 λ³΄κΈ°λ³΄λ‹€λŠ”, JVM이 ν”„λ‘œμ„ΈμŠ€λ₯Ό ν˜ΈμŠ€νŒ…ν•˜λŠ” μ‰˜(shell) 역할을 ν•˜λŠ” 것에 κ°€κΉμŠ΅λ‹ˆλ‹€.

β—Ό μžλ°”κ°€ 컴파일 λ˜λŠ” 과정을 μ„€λͺ…ν•΄μ£Όμ„Έμš”.

  1. μ‚¬μš©μžκ°€ .java νŒŒμΌμ„ μƒμ„±ν•œλ‹€
  2. buildν•œλ‹€
  3. java 컴파일러의 javac의 λͺ…λ Ήμ–΄λ₯Ό 톡해 λ°”μ΄νŠΈμ½”λ“œ(.class)λ₯Ό μƒμ„±ν•œλ‹€
  4. class loaderλ₯Ό 톡해 JVM λ©”λͺ¨λ¦¬ 내에 λ‘œλ“œν•œλ‹€.
  5. 싀행엔진을 톡해 컴퓨터가 읽을 수 μžˆλŠ” OS에 λ§žλŠ” κΈ°κ³„μ–΄λ‘œ ν•΄μ„λœλ‹€.

β—Ό Java의 GC에 λŒ€ν•΄ μ„€λͺ…ν•΄ μ£Όμ„Έμš”.

  • 가비지 μ»¬λ ‰μ…˜μ€ JVM의 λ©”λͺ¨λ¦¬ 관리 기법이며, μ‹œμŠ€ν…œμ—μ„œ λ™μ μœΌλ‘œ ν• λ‹Ήλλ˜ λ©”λͺ¨λ¦¬ μ˜μ—­ μ€‘μ—μ„œ ν•„μš”μ—†μ–΄μ§„ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ νšŒμˆ˜ν•˜μ—¬ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.
  • 가비지 μ»¬λ ‰μ…˜ κ³Όμ •
    가비지 μ»¬λ ‰μ…˜ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ JVM이 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 싀행을 μž μ‹œ λ©ˆμΆ”κ³ ,
    가비지 μ»¬λ ‰μ…˜μ„ μ‹€ν–‰ν•˜λŠ” μŠ€λ ˆλ“œλ₯Ό μ œμ™Έν•œ λͺ¨λ“  μŠ€λ ˆλ“œλ“€μ˜ μž‘μ—…μ„ 쀑단 ν›„(stop the world)
    μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό μ œκ±°ν•œ λ’€(mark and sweep)
    기쑴의 μž‘μ—…μ„ μž¬κ°œν•©λ‹ˆλ‹€.

β—Ό finalize() λ₯Ό μˆ˜λ™μœΌλ‘œ ν˜ΈμΆœν•˜λŠ” 것은 μ™œ λ¬Έμ œκ°€ 될 수 μžˆμ„κΉŒμš”?

finalize() Object ν΄λž˜μŠ€μ— μ •μ˜λ˜μ–΄ μžˆλŠ” λ©”μ†Œλ“œμ΄λ©°, GC에 μ˜ν•΄ 수거될 λ•Œ JVM에 μ˜ν•΄ μžλ™μœΌλ‘œ ν˜ΈμΆœλ˜λŠ” λ©”μ†Œλ“œλ‘œ μˆ˜λ™μœΌλ‘œ ν˜ΈμΆœν•΄μ„œλŠ” μ•ˆλ˜λŠ” λ©”μ†Œλ“œμž…λ‹ˆλ‹€.

  • λΉ„κ²°μ •μ„±
    finalize() λ©”μ†Œλ“œλŠ” 가비지 컬렉터에 μ˜ν•΄ ν˜ΈμΆœλ©λ‹ˆλ‹€. 가비지 μ»¬λ ‰μ…˜μ€ JVM에 μ˜ν•΄ κ΄€λ¦¬λ˜λ©°, μ–Έμ œ 가비지 μ»¬λ ‰μ…˜μ΄ λ°œμƒν•˜κ³ , μ–΄λ–€ 객체가 μˆ˜κ±°λ μ§€λŠ” 일반적으둜 μ˜ˆμΈ‘ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ finalize()κ°€ ν˜ΈμΆœλ˜λŠ” μ‹œμ  μ—­μ‹œ μ˜ˆμΈ‘ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • μ„±λŠ₯ 이슈
    finalize() λ©”μ†Œλ“œλ₯Ό 가진 κ°μ²΄λŠ” 두 번의 가비지 μ»¬λ ‰μ…˜ 사이클을 거쳐야 ν•©λ‹ˆλ‹€. ν•œ λ²ˆμ€ finalize()λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•œ 것이고, λ‹€λ₯Έ ν•œ λ²ˆμ€ μ‹€μ œλ‘œ 객체λ₯Ό νšŒμˆ˜ν•˜κΈ° μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€. 이둜 인해 가비지 μ»¬λ ‰μ…˜μ˜ μ„±λŠ₯이 μ €ν•˜λ  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μžμ› λˆ„μˆ˜ μœ„ν—˜
    finalize()μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄, 이 μ˜ˆμ™ΈλŠ” λ¬΄μ‹œλ˜λ©°, 남은 정리 μ½”λ“œλŠ” μ‹€ν–‰λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이둜 인해 μžμ›μ΄ μ œλŒ€λ‘œ νšŒμˆ˜λ˜μ§€ μ•ŠλŠ” λˆ„μˆ˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • finalize() λ©”μ†Œλ“œμ˜ 폐지
    Java 9 μ΄ν›„λ‘œ Object 클래슀의 finalize() λ©”μ†Œλ“œλŠ” deprecated(λΉ„κΆŒμž₯) μƒνƒœμž…λ‹ˆλ‹€. μ΄λŠ” finalize()의 μœ„μ™€ 같은 문제점 λ•Œλ¬Έμ΄λ©°, λŒ€μ‹  java.lang.ref.Cleanerλ‚˜ java.lang.ref.PhantomReference와 같은 λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•˜λ„λ‘ ꢌμž₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ finalize() λ©”μ†Œλ“œλ₯Ό μˆ˜λ™μœΌλ‘œ ν˜ΈμΆœν•˜λŠ” 것은 μ΄λŸ¬ν•œ λ¬Έμ œμ μ„ μ•ΌκΈ°ν•  수 μžˆμœΌλ―€λ‘œ, μΌλ°˜μ μœΌλ‘œλŠ” ꢌμž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μžμ› μ •λ¦¬λŠ” λŒ€μ‹  try-with-resources κ΅¬λ¬Έμ΄λ‚˜ finally 블둝 등을 μ‚¬μš©ν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

β—Ό μ–΄λ–€ λ³€μˆ˜μ˜ 값이 null이 λ˜μ—ˆλ‹€λ©΄, 이 값은 GCκ°€ 될 κ°€λŠ₯성이 μžˆμ„κΉŒμš”?

  • λ³€μˆ˜μ˜ 값이 nullμ΄λΌλŠ” 것은 κ·Έ λ³€μˆ˜κ°€ 더 이상 ν•΄λ‹Ή 객체λ₯Ό μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ΄κ²ƒλ§ŒμœΌλ‘œλŠ” κ·Έ 객체가 가비지 μ»¬λ ‰μ…˜(GC)의 λŒ€μƒμ΄ 될지 μ—¬λΆ€λ₯Ό ν™•μ •ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 객체가 GC의 λŒ€μƒμ΄ 되렀면, ν•΄λ‹Ή 객체에 λŒ€ν•œ λͺ¨λ“  μ°Έμ‘°κ°€ μ—†μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • λ‹€μ‹œ 말해, μ–΄λ–€ 객체에 λŒ€ν•΄ μ—¬λŸ¬ λ³€μˆ˜κ°€ μ°Έμ‘°λ₯Ό 가지고 μžˆμ—ˆλŠ”λ°, κ·Έ 쀑 ν•˜λ‚˜μ˜ λ³€μˆ˜κ°€ null이 λ˜μ–΄λ„, λ‹€λ₯Έ λ³€μˆ˜λ“€μ΄ μ—¬μ „νžˆ κ·Έ 객체λ₯Ό μ°Έμ‘°ν•˜κ³  μžˆλ‹€λ©΄, κ·Έ κ°μ²΄λŠ” GC의 λŒ€μƒμ΄ λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • ν•˜μ§€λ§Œ ν•΄λ‹Ή 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” λͺ¨λ“  λ³€μˆ˜κ°€ null이 λ˜κ±°λ‚˜ λ²”μœ„(scope)λ₯Ό λ²—μ–΄λ‚˜μ„œ μ°Έμ‘°ν•  수 μ—†κ²Œ 되면, κ·Έ κ°μ²΄λŠ” 더 이상 μ ‘κ·Όν•  수 μ—†λŠ” μƒνƒœκ°€ λ˜μ–΄ GC의 λŒ€μƒμ΄ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ λ©”μ»€λ‹ˆμ¦˜μ€ μžλ°”μ˜ 가비지 컬렉터가 "reachability"λΌλŠ” κ°œλ…μ„ 기반으둜 μž‘λ™ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 즉, μ–΄λ–€ 객체가 GC의 λŒ€μƒμ΄ λ μ§€λŠ” κ·Έ 객체에 μ ‘κ·Όν•  수 μžˆλŠ” κ²½λ‘œκ°€ μžˆλŠ”μ§€ 여뢀에 따라 κ²°μ •λ©λ‹ˆλ‹€.

 

*GC의 reachability
:μ–΄λ–€ 객체에 아직 μœ νš¨ν•œ μ°Έμ‘°κ°€ 있으면 'reachable'둜, μ—†μœΌλ©΄ 'unreachable'둜 κ΅¬λ³„ν•˜κ³ , unreachable 객체λ₯Ό garbage둜 κ°„μ£Όν•΄ GCλ₯Ό μˆ˜ν–‰

Comments