πŸ“š μžλ°” κ°œλ… 정리

CodeByHanΒ·2025λ…„ 8μ›” 19일

μžλ°”

λͺ©λ‘ 보기
4/13

κΈ°λ³Έ κ°œλ…μ€ 항상 κΉŒλ¨Ήμ„ 수 μžˆλ‹€. λ”°λΌμ„œ 정리λ₯Ό 해놓을렀고 ν•˜λŠ”λ° λ¬Έλ‹΅μ‹μœΌλ‘œ 정리할 μ˜ˆμ •μ΄κ³  μ•„ λ§žλ‹€ μ΄λŸ°κ±°μ˜€μ§€! μ •λ„λ‘œλ§Œ 기둝할렀고 ν•œλ‹€.

πŸ“Œ μžλ°”(Java)에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

  • 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° 언어이며 JVM(java virtual machine) μœ„μ—μ„œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— μš΄μ˜μ²΄μ œμ— 독립적이닀.
  • JVM(java virtual machine) μœ„μ—μ„œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— μ‹€ν–‰ 속도가 λŠλ¦¬λ‹€.

JDK, JRE

JDKλŠ” μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜κΈ°μœ„ν•œ 포괄적인 ν‚€νŠΈ, 즉 개발 도ꡬ λͺ¨μŒ, 컴파일러, 디버거, λ‹€μ–‘ν•œ μžλ°” API등이 포함

JREλŠ” μžλ°”λ₯Ό μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•œ μ‹€ν–‰ ν™˜κ²½, JVMκ³Ό μžλ°” 클래슀 λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μžˆλ‹€. μ†ŒμŠ€ μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜κ±°λ‚˜ κ°œλ°œν•˜λŠ” κΈ°λŠ₯은 μ—†μ§€λ§Œ, 이미 컴파일된 μžλ°” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ μ‹œν‚¬ 수 μžˆλ‹€. λ”°λΌμ„œ JDK μ•ˆμ— JRE이 μžˆλ‹€.

-> 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄ λ­”κ°€μš”?

  • ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 데이터λ₯Ό μƒνƒœλ₯Ό κ°€μ§„ 객체둜 λ§Œλ“€κ³  κ·Έ 객체의 μƒν˜Έ μž‘μš©μ„ 톡해 λ‘œμ§μ„ κ΅¬μ„±ν•˜λŠ” 방법을 μ˜λ―Έν•œλ‹€.

  • μΊ‘μŠν™”, λ‹€ν˜•μ„±, 상속, 좔상화 νŠΉμ§•μ„ κ°€μ§€κ³  μžˆλ‹€.

  • μΊ‘μŠν™”: 객체의 속성과 λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜λ‘œ λ¬Άκ³  일뢀λ₯Ό 외뢀에 감좔어 μ€λ‹‰ν•˜λŠ” 것

  • λ‹€ν˜•μ„±: ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬ λ°©μ‹μœΌλ‘œ μž¬μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” κ°œλ…, λŒ€ν‘œμ μœΌλ‘œ μ˜€λ²„λ‘œλ”© , μ˜€λ²„λΌμ΄λ”©

  • 상속: λΆ€λͺ¨ν΄λž˜μŠ€μ— μžˆλŠ” 객체의 속성을 μžμ‹ ν΄λž˜μŠ€μ—μ„œ λΆˆλŸ¬μ™€ μ‚¬μš© κ°€λŠ₯ ν•˜κ²Œ ν•˜λŠ” κ°œλ…

  • 좔상화: 객체의 곡톡적인 속성과 κΈ°λŠ₯을 μΆ”μΆœν•˜μ—¬ μ •μ˜ ν•˜λŠ” 것(좔상 클래슀, μΈν„°νŽ˜μ΄μŠ€)

-> JVM이 λ­”κ°€μš”?

  • Java Virtual Machine, μžλ°” 가상 λ¨Έμ‹ μ˜ μ•½μžλ₯Ό λ”°μ„œ 쀄여 λΆ€λ₯΄λŠ” μš©μ–΄
  • μžλ°” λ°”μ΄νŠΈμ½”λ“œ(.class 파일)λ₯Ό OS에 νŠΉν™”λœ μ½”λ“œλ‘œ λ³€ν™˜ν•˜μ—¬ μ‹€ν–‰
  • GC 및 μŠ€λ ˆλ“œ 관리

-> GC κ°€ λ­”κ°€μš”?

  • Heap λ©”λͺ¨λ¦¬ μ˜μ—­μ— μƒμ„±λœ 객체듀 μ€‘μ—μ„œ 더 이상 μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체듀을 νƒμƒ‰ν•˜μ—¬ μ œκ±°ν•˜λŠ” μ—­ν• 
  • JVM은 λ©”λͺ¨λ¦¬ 관리λ₯Ό μžλ™μœΌλ‘œ ν•΄μ£ΌλŠ” κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬, 더 이상 μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체λ₯Ό λ©”λͺ¨λ¦¬μ—μ„œ μžλ™μœΌλ‘œ 제거

-> GC 과정을 μ„€λͺ…ν•΄μ£Όμ„Έμš”

  1. μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ JVM이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 싀행을 λ©ˆμΆ˜λ‹€.
  2. GCλ₯Ό μ‹€ν–‰ν•˜λŠ” μ“°λ ˆλ“œλ₯Ό μ œμ™Έν•œ λͺ¨λ“  μ“°λ ˆλ“œλ“€μ˜ μž‘μ—…μ„ 쀑단(Stop the world)
  3. μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬ 제거(Mark and Sweep)

GC μ£Όμš” 방법
μ°Έμ‘°κ°€ 0인 객체λ₯Ό νšŒμˆ˜ν•˜λŠ” μ°Έμ‘° μΉ΄μš΄νŒ…, μ‚¬μš©μ€‘μΈ 객체λ₯Ό λ§ˆν¬ν•˜κ³  λ‚˜λ¨Έμ§€λ₯Ό νšŒμˆ˜ν•˜λŠ” λ§ˆν¬μ•€μŠ€μœ„ν”„, ν™œμ„± 객체λ₯Ό λ‹€λ₯Έ μ˜μ—­μœΌλ‘œ λ³΅μ‚¬ν•˜λŠ” 볡사 μˆ˜μ§‘μ΄ μžˆλ‹€.

λ§ˆν¬μ•€μŠ€μœ„ν”„
mark λ‹¨κ³„λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ‚¬μš©λ˜λŠ” λͺ¨λ“  객체λ₯Ό νƒμƒ‰ν•˜κ³ , μ‚¬μš©μ€‘μΈ 객체에 마크λ₯Ό ν‘œμ‹œν•œλ‹€. 이 κ³Όμ •μ—μ„œ μ°Έμ‘° κ·Έλž˜ν”„λ₯Ό 따라가며 μ ‘κ·Ό κ°€λŠ₯ν•œ 객체듀을 μ‹λ³„ν•œλ‹€. Sweep λ‹¨κ³„λŠ” λ§ˆν¬λ˜μ§€ μ•Šμ€ κ°μ²΄λŠ” μ‚¬μš©ν•˜κ±°λ‚˜ μ°Έμ‘° λ˜μ§€μ•ŠλŠ”κ±Έλ‘œ κ°„μ£Όν•œλ‹€. κ°μ²΄λ“€μ˜ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ΄ λ‹€λ₯Έ λͺ©μ μœΌλ‘œ μ‚¬μš©ν•  수 있게 ν•œλ‹€. μˆœν™˜ μ°Έμ‘° 문제 ν•΄κ²° κ°€λŠ₯ -> μ‚¬μš©μ€‘μΈ 객체λ₯Ό μ‹λ³„ν•˜μ—¬ 회수 λŒ€μƒμ—μ„œ 제거

πŸ“Œ μžλ°”μ˜ 컴파일러 과정을 μ„€λͺ…ν•΄μ£Όμ„Έμš”

  1. ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ†ŒμŠ€μ½”λ“œ(.java)λ₯Ό μž‘μ„±ν•œλ‹€.
  2. 컴파일러λ₯Ό 톡해 λ°”μ΄νŠΈ μ½”λ“œ(.class)λ₯Ό μƒμ„±ν•œλ‹€.
  3. 클래슀 λ‘œλ”λ₯Ό 톡해 JVM λ©”λͺ¨λ¦¬ λ‚΄λ‘œ λ‘œλ“œν•œλ‹€.
  4. 컴퓨터가 읽을 수 μžˆλŠ” κΈ°κ³„μ–΄λ‘œ ν•΄μ„λœλ‹€.

-> 클래슀 λ‘œλ”κ°€ λ­”κ°€μš”?

  • JVMμ—μ„œ 클래슀λ₯Ό λ©”λͺ¨λ¦¬μ— λ‘œλ”©ν•˜λŠ” μ—­ν• 
  • class νŒŒμΌλ“€μ„ JVM이 μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° 할당받은 λ©”λͺ¨λ¦¬ μ˜μ—­μΈ Runtime Data Area에 μ μž¬ν•˜λŠ” μ—­ν• 

πŸ“Œ μ˜€λ²„λ‘œλ”©κ³Ό μ˜€λ²„λΌμ΄λ”©μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

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

πŸ“Œ SOLID(객체지ν–₯ 섀계원칙)에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

  1. SRP: ν•œ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ Έμ•Όν•œλ‹€.
  2. OCP: ν™•μž₯μ—λŠ” μ—΄λ €μžˆκ³ , μˆ˜μ •μ—λŠ” λ‹«ν˜€μžˆμ–΄μ•Όν•œλ‹€.(κΈ°μ‘΄ μ½”λ“œ μˆ˜μ • X κΈ°λŠ₯ μΆ”κ°€ κ°€λŠ₯)
  3. LSP: ν•˜μœ„ νƒ€μž…μ€ 항상 μƒμœ„ νƒ€μž…μ„ λŒ€μ²΄ν•  수 μžˆμ–΄μ•Όν•œλ‹€.(μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 역할을 λͺ¨λ‘ ν•  수 μžˆμ–΄μ•Όν•¨)
  4. ISP: μΈν„°νŽ˜μ΄μŠ€ 내에 λ©”μ„œλ“œλŠ” μ΅œμ†Œν•œ 일 수둝 μ’‹λ‹€.(λΆˆν•„μš”ν•˜κ²Œ 큰 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€μ§€ 말고, μ—­ν• λ³„λ‘œ 잘게 μͺΌκ°œλΌλŠ” 원칙)
  5. DIP: μžμ‹ λ³΄λ‹€ λ³€ν•˜κΈ° μ‰¬μš΄ 것에 μ˜μ‘΄ν•˜λ˜ 것을 μΆ”μƒν™”λœ μΈν„°νŽ˜μ΄μŠ€λ‚˜ μƒμœ„ 클래슀λ₯Ό 두어 λ³€ν•˜κΈ° μ‰¬μš΄ κ²ƒμ˜ 변화에 영ν–₯ λ°›μ§€ μ•Šκ²Œ ν•˜λŠ” 원칙

πŸ“Œ μžλ°”μ˜ λ©”λͺ¨λ¦¬ μ˜μ—­μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

  • λ©”μ„œλ“œ μ˜μ—­, μŠ€νƒ μ˜μ—­, νž™ μ˜μ—­μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€.
  • λ©”μ„œλ“œ μ˜μ—­: μ „μ—­ λ³€μˆ˜ , static λ³€μˆ˜ μ €μž₯, ν”„λ‘œκ·Έλž¨ μ‹œμž‘λΆ€ν„° μ’…λ£ŒκΉŒμ§€ λ©”λͺ¨λ¦¬μ— λ‚¨μ•„μžˆλ‹€.
  • μŠ€νƒ μ˜μ—­: μ§€μ—­ λ³€μˆ˜, λ§€κ°œλ³€μˆ˜ 데이터 값이 μ €μž₯λ˜λŠ” 곡간, λ©”μ„œλ“œκ°€ 호좜될 λ•Œ λ©”λͺ¨λ¦¬μ— ν• λ‹Ή 되고 μ’…λ£Œλ˜λ©΄ λ©”λͺ¨λ¦¬κ°€ ν•΄μ œ λœλ‹€.
  • νž™ μ˜μ—­: new ν‚€μ›Œλ“œλ‘œ μƒμ„±λ˜λŠ” 객체(μΈμŠ€ν„΄μŠ€), λ°°μ—΄ 등이 μ €μž₯되며, κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ— μ˜ν•΄ λ©”λͺ¨λ¦¬κ°€ κ΄€λ¦¬λœλ‹€.

νž™ λ©”λͺ¨λ¦¬λŠ” μ–΄μΌ€ κ΅¬μ„±λ˜μ–΄ μžˆμ„κΉŒ?

νž™ λ©”λͺ¨λ¦¬λŠ” 크게 μ„Έ λΆ€λΆ„μœΌλ‘œ λ‚˜λ‰œλ‹€. λ¨Όμ € Young Generation은 μƒˆλ‘œ μƒμ„±λœ 객체듀이 ν• λ‹Ήλ˜λŠ” 곡간이고 주둜 짧은 생λͺ… μ£ΌκΈ°λ₯Ό κ°–λŠ” 객체듀이 λͺ¨μΈλ‹€. μ΄κ³³μ—μ„œ μ‚΄μ•„ 남은 객체듀은 Old Generation 으둜 μ΄λ™ν•˜λŠ”λ° 였래 μ‚¬μš©λ˜λŠ” 객체가 λͺ¨μΈλ‹€. μ˜ˆμ „μ—λŠ” permanation Generation κ°€ λ©”μ„œλ“œμ™€ 클래슀λ₯Ό μ €μž₯ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©λ˜μ—ˆμ§€λ§Œ ν˜„μž¬λŠ” λ©”νƒ€μŠ€νŽ˜μ΄μŠ€λ‘œ λŒ€μ²΄λ˜μ—ˆλ‹€.

각 λ©”λͺ¨λ¦¬ μ˜μ—­μ΄ ν• λ‹Ήλ˜λŠ” μ‹œμ μ€ μ–Έμ œμΈκ°€μš”?

  • λ©”μ„œλ“œ μ˜μ—­: JVM이 λ™μž‘ν•΄μ„œ ν΄λž˜μŠ€κ°€ λ‘œλ”©λ  λ•Œ 생성
  • μŠ€νƒ μ˜μ—­: λ©”μ„œλ“œκ°€ 호좜 될 λ•Œ ν• λ‹Ή
  • νž™ μ˜μ—­: λŸ°νƒ€μž„ μ‹œ

πŸ“Œ Wrapper class에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

  • κΈ°λ³Έ μžλ£Œν˜•μ— λŒ€ν•œ 객체 ν‘œν˜„μ„ μ˜λ―Έν•œλ‹€.
  • κΈ°λ³Έ μžλ£Œν˜• -> Wrapper class : λ°•μ‹±
  • Wrapper class -> κΈ°λ³Έ μžλ£Œν˜• : μ–Έλ°•μ‹±

== 와 equals()

  • ==: μ£Όμ†Œκ°’μ„ λΉ„κ΅ν•œλ‹€. 즉, 두 객체가 같은 λ©”λͺ¨λ¦¬ μœ„μΉ˜λ₯Ό 가리킀고 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.

  • equals(): 객체의 λ‚΄μš©μ„ λΉ„κ΅ν•œλ‹€. 주둜 Stringμ΄λ‚˜ λ‹€λ₯Έ 객체 ν΄λž˜μŠ€μ—μ„œ λ‚΄μš©μ„ 비ꡐ할 λ•Œ μ‚¬μš©λ©λœλ‹€. Stringμ—λŠ” equalsκ°€ μ˜€λ²„λΌμ΄λ”© λ˜μ–΄μžˆλ‹€. equals()λŠ” 객체의 동등성을 μ •μ˜ν•˜λŠ” 방법을 μ œκ³΅ν•˜λŠ” λ©”μ„œλ“œμ΄λ‹€. 기본적으둜 Object ν΄λž˜μŠ€μ— μ •μ˜λ˜μ–΄ 있으며, ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ 객체의 λ‚΄μš©μ„ λΉ„κ΅ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•  수 μžˆλ‹€.
    equals()λ₯Ό μ˜€λ²„λΌμ΄λ”© ν•  λ•ŒλŠ” hashcode()도 같이 μ˜€λ²„λΌμ΄λ”© ν•΄μ•Όν•œλ‹€.

String str1 = new String("hello");
String str2 = new String("hello");

System.out.println(str1 == str2);         // false, μ£Όμ†Œκ°’ 비ꡐ
System.out.println(str1.equals(str2));    // true, λ‚΄μš© 비ꡐ

πŸ“Œ 동기화(Synchronized)에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

  • μ—¬λŸ¬κ°œμ˜ μ“°λ ˆλ“œκ°€ ν•œ 개의 μžμ›μ„ μ‚¬μš©ν•˜κ³ μž ν•  λ•Œ, ν˜„μž¬ 데이터λ₯Ό μ‚¬μš©ν•˜λŠ” μ“°λ ˆλ“œλ₯Ό μ œμ™Έν•˜κ³  λ‚˜λ¨Έμ§€ μ“°λ ˆλ“œλ“€μ€ 데이터에 μ ‘κ·Ό λΆˆκ°€ν•˜κ²Œ ν•˜λŠ” κ°œλ…μ΄λ‹€.
  • μžλ°”μ—μ„œλŠ” Synchronized ν‚€μ›Œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.

-> ν”„λ‘œμ„ΈμŠ€μ™€ μ“°λ ˆλ“œκ°€ λ­˜κΉŒμš”?

  • ν”„λ‘œμ„ΈμŠ€λŠ” μžμ›μ„ ν• λ‹Ήλ°›λŠ” μž‘μ—…μ˜ λ‹¨μœ„, μ“°λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ 할당받은 μžμ›μ„ μ΄μš©ν•˜λŠ” μ‹€ν–‰ λ‹¨μœ„, μŠ€λ ˆλ“œλŠ” μžμ›μ„ κ³΅μœ ν•œλ‹€.

πŸ“Œ Optinal ν΄λž˜μŠ€κ°€ λ­˜κΉŒμš”?

  • Java 8μ—μ„œ λ„μž…λœ Wrapper 클래슀둜 값이 μ‘΄μž¬ν•  μˆ˜λ„ 있고 없을 μˆ˜λ„ μžˆλŠ” μƒν™©μ—μ„œ λͺ…μ‹œμ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 클래슀이며 null 처리λ₯Ό μ•ˆμ „ν•˜κ²Œ 도와쀀닀.

πŸ“Œ μžλ°”μ™€ C/C++ μ°¨μ΄λŠ”?

  • μžλ°”λŠ” 객체지ν–₯적이며 C++은 객체지ν–₯κ³Ό μ ˆμ°¨μ§€ν–₯을 λͺ¨λ‘ μ§€μ›ν•˜λŠ” μ–Έμ–΄κ³ , CλŠ” μ ˆμ°¨μ§€ν–₯적 μ–Έμ–΄λ‹€. C/C++은 λ©”λͺ¨λ¦¬λ₯Ό ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 직접 ν• λ‹Ήκ³Ό ν•΄μ œλ₯Ό ν•΄μ€˜μ•Όν•˜μ§€λ§Œ μžλ°”λŠ” λ©”λͺ¨λ¦¬λ₯Ό GCκ°€ 관리해쀀닀. μžλ°”λŠ” μš΄μ˜μ²΄μ œμ— λ…λ¦½μ μ΄μ§€λ§Œ C/C++λŠ” μš΄μ˜μ²΄μ œμ— μ˜μ‘΄μ μ΄λ‹€.

πŸ“Œ μžλ°”μ˜ 데이터 νƒ€μž…μ„ λ§ν•΄λ³΄μ„Έμš”

  • μžλ°”λŠ” κΈ°λ³Έμžλ£Œν˜•κ³Ό μ°Έμ‘° μžλ£Œν˜•μœΌλ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

  • κΈ°λ³Έ μžλ£Œν˜•(μ •μˆ˜ν˜•): int, long, short, byte

  • κΈ°λ³Έ μžλ£Œν˜•(μ‹€μˆ˜ν˜•): float, double

  • κΈ°λ³Έ μžλ£Œν˜•(λ…Όλ¦¬ν˜•): boolean

  • κΈ°λ³Έ μžλ£Œν˜•(λ¬Έμžν˜•): char

  • κΈ°λ³Έ μžλ£Œν˜•μ€ λ©”λͺ¨λ¦¬μ˜ μŠ€νƒμ— μ €μž₯

  • μ°Έμ‘°μžλ£Œν˜•: 클래슀, μΈν„°νŽ˜μ΄μŠ€, λ°°μ—΄, enum λ“±

πŸ“Œ μžλ°”μ—μ„œμ˜ final ν‚€μ›Œλ“œλŠ” 무엇을 μ˜λ―Έν•˜λ‚˜μš”?

  • final λ³€μˆ˜: 값을 λ³€κ²½ν•  수 μ—†λŠ” μƒμˆ˜λ₯Ό 의미

  • final λ©”μ„œλ“œ: μ˜€λ²„λΌμ΄λ”© ν•  수 μ—†λŠ” λ©”μ„œλ“œ

  • final 클래슀: 상속할 수 μ—†λŠ” 클래슀

πŸ“Œ μžλ°”μ˜ μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 클래슀의 차이점

곡톡점

  • 객체λ₯Ό μΈμŠ€ν„΄μŠ€ν™” ν•  수 μ—†λ‹€.
  • 좔상 λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•œλ‹€.
  • μƒμ†λ°›λŠ” ν΄λž˜μŠ€λŠ” 좔상 λ©”μ„œλ“œλ₯Ό λ°˜λ“œμ‹œ μž¬μ •μ˜ν•˜μ—¬ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

좔상 λ©”μ„œλ“œ
abstract ν‚€μ›Œλ“œμ™€ ν•¨κ»˜ μ›ν˜•λ§Œ μ„ μ–Έλ˜κ³ , μ½”λ“œλŠ” μž‘μ„±λ˜μ§€ μ•Šμ€ λ©”μ„œλ“œ

차이점

1) 좔상 클래슀
  • abstract ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ 클래슀

  • 단일 μƒμ†λ§Œ κ°€λŠ₯

  • μΌλ°˜λ©”μ„œλ“œ + 좔상 λ©”μ„œλ“œ μ‚¬μš© κ°€λŠ₯

  • μ—¬λŸ¬ ν΄λž˜μŠ€λ“€μ˜ κ³΅ν†΅λœ 뢀뢄을 μΆ”μƒν™”ν•˜κ³ , μƒμ†λ°›λŠ” ν΄λž˜μŠ€μ—κ²Œ κ΅¬ν˜„μ„ κ°•μ œν•˜κΈ° μœ„ν•΄ μ‚¬μš©

  • 좔상 클래슀의 좔상 λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€κ°€ κ΅¬μ²΄ν™”ν•˜μ—¬ κΈ°λŠ₯을 ν™•μž₯

2) μΈν„°νŽ˜μ΄μŠ€
  • interface ν‚€μ›Œλ“œλ‘œ μ„ μ–Έ

  • public static final ν•„λ“œλ§Œ κ°€μ§ˆ 수 있음

  • κΈ°λ³Έ λ©”μ„œλ“œλŠ” 좔상 λ©”μ„œλ“œμ§€λ§Œ Java 8μ΄ν›„λ‘œ default, static λ©”μ„œλ“œλ„ κ°€λŠ₯

  • ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•΄μ•Όν•  κΈ°λŠ₯만 μ •μ˜

  • 닀쀑 상속 κ°€λŠ₯

  • κ΄€λ ¨ μ—†λŠ” ν΄λž˜μŠ€λ“€μ—μ„œλ„ κ³΅ν†΅μ μœΌλ‘œ ν•„μš”ν•œ λ™μž‘(λ©”μ„œλ“œ μ›ν˜•)을 μ •μ˜ν•΄ κ°•μ œ κ΅¬ν˜„ν•˜λ„λ‘ 함

μΆ”μƒν΄λž˜μŠ€λŠ” κ³΅ν†΅λœ 속성과 κΈ°λŠ₯을 ν•˜μœ„ ν΄λž˜μŠ€μ— λ¬Όλ €μ£ΌκΈ° μœ„ν•΄μ„œ μ‚¬μš©ν•˜κ³  μΈν„°νŽ˜μ΄μŠ€λŠ” νŠΉμ • κΈ°λŠ₯을 κ°•μ œν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©ν•œλ‹€.

πŸ“Œ 클래슀 , 객체, μΈμŠ€ν„΄μŠ€μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

  • 클래슀: 객체λ₯Ό λ§Œλ“€κΈ° μœ„ν•œ 섀계도

  • 객체: 클래슀λ₯Ό λ°”νƒ•μœΌλ‘œ λ§Œλ“  싀체

  • μΈμŠ€ν„΄μŠ€: λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλœ 객체

πŸ“Œ 컴파일러(Compiler) 와 인터프리터(Interpreter)에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

  • λ‘˜ λ‹€ 컴퓨터가 이해할 수 μžˆλŠ” κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•΄μ€€λ‹€.
  • 컴파일러(Compiler): 전체 μ†ŒμŠ€μ½”λ“œλ₯Ό 보고 λͺ…λ Ήμ–΄λ₯Ό μˆ˜μ§‘ν•˜μ—¬ μž¬κ΅¬μ„±
  • 인터프리터(Interpreter): μ†ŒμŠ€μ½”λ“œμ˜ 각 행을 μ—°μ†μ μœΌλ‘œ 뢄석

πŸ“Œ λ¦¬ν”Œλ ‰μ…˜(Reflection) 에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

  • ꡬ체적인 클래슀 νƒ€μž…μ„ μ•Œμ§€ λͺ»ν•΄λ„ 클래슀의 λ©”μ„œλ“œ, νƒ€μž… , λ³€μˆ˜λ“€μ„ μ ‘κ·Ό κ°€λŠ₯ν•˜κ²Œ ν•΄μ£ΌλŠ” μžλ°” API

  • JVMμ—μ„œ μ‹€ν–‰λ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λŸ°νƒ€μž„ λ™μž‘μ„ κ²€μ‚¬ν•˜κ±°λ‚˜ μˆ˜μ •ν•  수 μžˆλŠ” κΈ°λŠ₯이 ν•„μš”ν•œ ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©

-> λ¦¬ν”Œλ ‰μ…˜(Reflection)을 μ™œ μ‚¬μš©ν• κΉŒμš”?

  • λŸ°νƒ€μž„ μ‹œμ μ—μ„œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³ , μ ‘κ·Ό μ œμ–΄μžμ™€ 관계없이 ν•„λ“œμ™€ λ©”μ„œλ“œμ— μ ‘κ·Όν•˜μ—¬ ν•„μš”ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλŠ” μœ μ—°μ„±μ„ 사지고 μžˆλ‹€.

  • λ‹¨μ μœΌλ‘œλŠ” μΊ‘μŠν™”λ₯Ό μ €ν•΄ μ‹œν‚¨λ‹€.

Static에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

Static ν‚€μ›Œλ“œλ₯Ό 톡해 μƒμ„±λœ 정적 멀버듀은 νž™(Heap) μ˜μ—­μ΄ μ•„λ‹Œ λ©”μ„œλ“œ μ˜μ—­(Method Area)에 μ €μž₯λœλ‹€. 이 λ©€λ²„λŠ” λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ—μ„œ 곡유되며, ν΄λž˜μŠ€κ°€ λ‘œλ“œλ  λ•Œ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜κ³  ν”„λ‘œκ·Έλž¨ μ’…λ£Œ μ‹œκΉŒμ§€ λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλ˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ GC 관리 λŒ€μƒμ΄ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— μ‹œμŠ€ν…œ μžμ› λ‚­λΉ„λ‚˜ λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ μ‚¬μš©μ΄ λ°œμƒν•  수 μžˆλ‹€.

μ œλ„€λ¦­

ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•  λ•Œ, 미리 데이터 νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šκ³  μ‚¬μš©ν•  λ•Œ νƒ€μž…μ„ μ§€μ •ν•  수 있게 ν•΄μ£ΌλŠ” κΈ°λŠ₯

μ½”λ“œ μž¬μ‚¬μš©μ„±μ΄ λ†’μ•„μ§€κ³ , 컴파일 μ•ˆμ •μ„±μ„ λ†’μ—¬μ€€λ‹€.

List, Setλ“±μ˜ 자료ꡬ쑰 ν΄λž˜μŠ€λŠ” λ‹€μ–‘ν•œ νƒ€μž…μ„ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„€κ³„λ˜μ–΄μžˆλ‹€.

Setμ—μ„œ μ–΄μΌ€ μ‚¬μš©?

Set은 μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” 자료λ₯Ό μ €μž₯ν•  λ•Œ μ“°λŠ” 자료ꡬ쑰, Set에 μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ©΄ Set에 μ‚¬μš© κ°€λŠ₯ν•œ 자료의 데이터 νƒ€μž…μ„ λͺ…ν™•ν•˜κ²Œ μ§€μ •ν•  수 μžˆλ‹€. 즉, νŠΉμ • νƒ€μž…μ˜ 객체만 μ €μž₯ν•˜κ²Œ μ§€μ • κ°€λŠ₯

Object λ₯Ό μ“°λ©΄ 될텐데 μ™œ μ œλ„€λ¦­μ„ μ‚¬μš©?
Objectλ₯Ό μ‚¬μš©ν•˜λ©΄ 좔가적인 μž‘μ—…μ΄ ν•„μš”ν•œλ°, 예λ₯Ό λ“€λ©΄ 값이 Integer νƒ€μž…μΈλ° String νƒ€μž…μ΄λ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
좔가적인 μž‘μ—…μ—†μ΄ μ›ν•˜λŠ” νƒ€μž…μ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μ œλ„€λ¦­μ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

싱글톀 νŒ¨ν„΄

  • νŠΉμ • 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό ν•˜λ‚˜λ§Œ μƒμ„±ν•˜κ³  κ·Έ μΈμŠ€ν„΄μŠ€μ— μ „μ—­μ μœΌλ‘œ μ ‘κ·Όν•˜κ²Œ ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄
  • 싱글톀 νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ 이 μΈμŠ€ν„΄μŠ€λ₯Ό μ „μ—­μ μœΌλ‘œ μ‚¬μš©ν•΄μ•Όν•˜λŠ” 이유, 예λ₯Ό λ“€μ–΄ λ‘œκΉ…, 섀정관리, μŠ€λ ˆλ“œν’€, DB μ—°κ²°κ³Ό 같은 경우 μœ μš©ν•˜λ‹€. 이λ₯Ό 톡해 λ¦¬μ†ŒμŠ€λ₯Ό μ ˆμ•½ν•˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 일관성을 μœ μ§€ν•  수 μžˆλ‹€.
  • ν…ŒμŠ€νŠΈμ™€ μ˜μ‘΄μ„± μ£Όμž…μ— λ¬Έμ œκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλ‹€. ν…ŒμŠ€νŠΈμ˜ 독립성이 침해될 수 μžˆλ‹€. mocking ν•΄μ„œ ν•΄κ²° κ°€λŠ₯ν•˜λ‹€.

μžλ°” 버전별 차이 및 νŠΉμ§•

Java 8

  • λŒ€κ·œλͺ¨ 릴리즈, Lambda , Stream API 제곡
  • Optinal, μƒˆλ‘œμš΄ λ‚ μ§œ , μ‹œκ°„ API 제곡(ex.LocalDateTime)

Java 11

  • String κ³Ό File κΈ°λŠ₯ ν–₯상
    • isBlank(), strip(), wrtieString(), readString()
  • var ν‚€μ›Œλ“œ μ‚¬μš© κ°€λŠ₯

Java 17

  • μŠ€ν”„λ§λΆ€νŠΈ 3.x.x 버전은 JDK 17 이상뢀터 지원
  • Switch 에 λŒ€ν•œ νŒ¨ν„΄ λ§€μΉ­, μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ³  효율적으둜 μž‘μ • κ°€λŠ₯

Java 21

  • μŠ€ν”„λ§λΆ€νŠΈ 3.2 λΆ€ν„° 지원
  • 가상 μŠ€λ ˆλ“œ: Java ν”Œλž«νΌμ— κ²½λŸ‰ 가상 μŠ€λ ˆλ“œ λ„μž…
    • 가상 μŠ€λ ˆλ“œμ˜ λ„μž…μœΌλ‘œ λͺ‡κ°œμ˜ 운영 체제 μŠ€λ ˆλ“œλ§Œ μ‚¬μš©ν•˜μ—¬ 수백 만개의 가상 μŠ€λ ˆλ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 것 κ°€λŠ₯
  • UTF - 8이 κΈ°λ³Έκ°’

String, StringBuffer, StringBuilder

String : λΆˆλ³€ 객체, ν•œλ²ˆ μƒμ„±λ˜λ©΄ 값을 λ³€κ²½ λΆˆκ°€λŠ₯, λ¬Έμžμ—΄μ„ μ‘°μž‘ν•  λ•Œλ§ˆλ‹€, μƒˆλ‘œμš΄ String 객체가 μƒμ„±λ˜μ–΄ λ©”λͺ¨λ¦¬ μ°¨μ§€

StringBuffer : κ°€λ³€ 객체, λ¬Έμžμ—΄ μ‘°μž‘μ‹œ κΈ°μ‘΄ 객체 값을 λ³€κ²½, λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ 동기화 지원

StringBuilder : κ°€λ³€ 객체, λ¬Έμžμ—΄ μ‘°μž‘μ‹œμ— κΈ°μ‘΄ 객체 κ°’ λ³€κ²½, 동기화 지원 X

profile
λ…Έλ ₯은 λ°°μ‹ ν•˜μ§€ μ•Šμ•„ πŸ”₯

0개의 λŒ“κΈ€