πŸ“š[Java] JVM, 래퍼클래슀

텁텁·2025λ…„ 4μ›” 15일

JVM λ©”λͺ¨λ¦¬ μ˜μ—­

  1. Method Area
    • ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λ©΄ μž‘μ„±ν–ˆλ˜ λͺ¨λ“  파일(.java)의 데이터가 Method(static) μ˜μ—­μ— μ €μž₯
    • ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œμ μ— ν•œλ²ˆλ§Œ μ €μž₯
    • Method μ˜μ—­μ— μ €μž₯된 λ°μ΄ν„°λŠ” ν”„λ‘œκ·Έλž¨ μ „μ²΄μ—μ„œ 곡용으둜 ν™œμš© κ°€λŠ₯ν•˜λ‹€.
    • static ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜μ™€ λ©”μ„œλ“œλ“€μ΄ 이 곡간에 μœ„μΉ˜

  1. Heap μ˜μ—­
    • new ν‚€μ›Œλ“œλ‘œ μƒμ„±λœ κ°μ²΄λŠ” Heap μ˜μ—­μ— μ €μž₯λœλ‹€.
    • Stack μ˜μ—­μ˜ λ³€μˆ˜κ°€ Heap μ˜μ—­μ˜ 객체λ₯Ό μ°Έμ‘°
      • 객체λ₯Ό 담은 λ³€μˆ˜μ—λŠ” μ‹€μ œ 객체의 Heap λ©”λͺ¨λ¦¬ μ£Όμ†Œ 값이 μ €μž₯λœλ‹€.
    • Heap μ˜μ—­μ˜ κ°μ²΄λŠ” ν•„μš”μ—†μ–΄μ§€λ©΄ 가비지컬렉터(Garbage Collector)κ°€ μ •λ¦¬ν•œλ‹€.
      • κ°€λΉ„μ§€ 컬렉터(Garbage Collector)
        • μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 객체λ₯Ό μžλ™μœΌλ‘œ μ œκ±°ν•˜λŠ” Java 의 κΈ°λŠ₯
          • λΆˆν•„μš”ν•œ 객체λ₯Ό μžλ™μœΌλ‘œ μ •λ¦¬ν•΄μ„œ λ©”λͺ¨λ¦¬λ₯Ό ν™•λ³΄ν•œλ‹€.

  1. Stack μ˜μ—­
    • λ©”μ„œλ“œκ°€ 호좜될 λ•Œλ§ˆλ‹€ Stack μ˜μ—­μ— λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλœλ‹€.
    • 이 μ˜μ—­μ€ μ ‘μ‹œλ₯Ό μŒ“λ“― LIFO(ν›„μž…μ„ μΆœ) ꡬ쑰
      • λ©”μ„œλ“œκ°€ μ‹œμž‘λ˜λ©΄ μΆ”κ°€λ˜κ³  μ’…λ£Œλ˜λ©΄ 사라짐
    • λ©”μ„œλ“œ λ‚΄μ—μ„œ μ„ μ–Έλœ μ§€μ—­λ³€μˆ˜λ“€μ΄ μ €μž₯λ˜λŠ” 곡간
      • λ³€μˆ˜μ— 객체가 λ‹΄κΈ°λ©΄ 객체의 μ£Όμ†Œκ°’μ΄ μ €μž₯

래퍼클래슀(κΈ°λ³Έν˜• μ°Έμ‘°ν˜•)

κΈ°λ³Έμžλ£Œν˜•μ„ 객체둜 감싼 클래슀


βœ… κΈ°λ³Έ μžλ£Œν˜•κ³Ό 래퍼 클래슀

κΈ°λ³Έ μžλ£Œν˜• (Primitive Type)래퍼 클래슀 (Wrapper Class)
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

λž˜νΌν΄λž˜μŠ€λ„ 객체

  • λž˜νΌν΄λž˜μŠ€κ°€ 담겨 μžˆλŠ” λ³€μˆ˜λ„ μ°Έμ‘°ν˜• λ³€μˆ˜μ΄λ‹€.
  • ν•˜μ§€λ§Œ 좜λ ₯μ‹œ λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°’μ΄ μ•„λ‹Œ κ°’ μžμ²΄κ°€ 좜λ ₯λœλ‹€.
Integer num = 100;
System.out.println(num); // 좜λ ₯ 100
  • System.out.println(num) 은 λ‚΄λΆ€μ μœΌλ‘œ String.valueOf(num)λ₯Ό ν˜ΈμΆœν•¨

  • λͺ¨λ“  μžλ°” κ°μ²΄λŠ” Object ν΄λž˜μŠ€μ—μ„œ 상속받은 κΈ°λ³Έ toString()이 μžˆλ‹€.

    • 기본은 "ν΄λž˜μŠ€μ΄λ¦„@ν•΄μ‹œμ½”λ“œ" ν˜•νƒœμ˜ λ¬Έμžμ—΄μ„ λ°˜ν™˜
  • ν•˜μ§€λ§Œ Integer, String, ArrayList 같은 자주 μ“°λŠ” ν΄λž˜μŠ€λ“€μ€
    toString()을 μ˜€λ²„λΌμ΄λ”©ν•΄μ„œ 값이 잘 보이도둝 κ΅¬ν˜„ν•΄λ‘μ—ˆλ‹€.

    public static String valueOf(Object obj) {
      return (obj == null) ? "null" : obj.toString();
    }
  • μœ„μ˜ ꡬ쑰에 μ˜ν•΄ num.toString() 이 호좜되고 μ˜€λ²„λΌμ΄λ”© 된 Integer 클래슀의 toString()은 λ‹€μŒκ³Ό κ°™λ‹€.

    @Override
    public String toString() {
        return Integer.toString(value);
    }
  • 이둜 인해 내뢀에 μ €μž₯된 κ°’ 100이 좜λ ₯ λœλ‹€.


래퍼클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

  • κΈ°λ³Έν˜•(primitive type)은은 객체가 μ•„λ‹ˆλ‹€.
    • μ†μ„±μ΄λ‚˜ λ©”μ„œλ“œ(κΈ°λŠ₯)λ₯Ό κ°€μ§ˆ 수 μ—†λ‹€.
  • ν•˜μ§€λ§Œ κ°μ²΄λŠ” λ‹€μ–‘ν•œ λ©”μ„œλ“œλ₯Ό 톡해 κΈ°λŠ₯을 μ œκ³΅ν•  수 μžˆλ‹€.
  • λ”°λΌμ„œ κΈ°λ³Έν˜• 데이터λ₯Ό 객체둜 감싸 κΈ°λŠ₯을 μΆ”κ°€ν•˜λ©΄ νŽΈλ¦¬ν•˜κ²Œ 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€.
    Integer num = 123; // 래퍼클래슀
    String str = num.toString(); // βœ… νŽΈλ¦¬ν•œ κΈ°λŠ₯
    
    int a = 100; // κ·Έλƒ₯ 데이터 100
    String str = a.toString(); // ❌ λ³€ν™˜ λΆˆκ°€

μ˜€ν† λ°•μ‹±κ³Ό μ–Έλ°•μ‹±

  1. μ˜€ν† λ°•μ‹±

    • κΈ°λ³Έν˜• -> 래퍼 객체둜 μžλ™ λ³€ν™˜
    int num = 100;
    Integer obj = num; // μ˜€ν† λ°•μ‹±: int β†’ Integer
    
    • ν•΄λ‹Ή μ½”λ“œλ₯Ό μžλ°”μ—μ„œ λ‚΄λΆ€μ μœΌλ‘œ λ³€κ²½
    Integer obj = Integer.valueOf(num);
  2. μ–Έλ°•μ‹±

    • 래퍼 객체 -> κΈ°λ³Έν˜•μœΌλ‘œ μžλ™ λ³€ν™˜
    Integer obj = 100;
    int num = obj; // μ–Έλ°•μ‹±: Integer β†’ int
    
    • μžλ°”κ°€ λ‚΄λΆ€μ μœΌλ‘œ μ•„λž˜μ™€ 같이 처리
    int num = obj.intValue();
  3. μ˜€ν† λ°•μ‹±/언박싱이 μœ μš©ν•œ μƒν™©μ˜ˆμ‹œ

    • μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬λŠ” 객체만 μ €μž₯ν•  수 μžˆκΈ°μ— κΈ°λ³Έν˜•μ„ μžλ™μœΌλ‘œ λ°•μ‹±ν•΄μ£ΌλŠ” κΈ°λŠ₯이 μœ μš©ν•˜λ‹€.
    List<Integer> list = new ArrayList<>();
    list.add(10); // μ˜€ν† λ°•μ‹±: int β†’ Integer
    
    int value = list.get(0); // μ–Έλ°•μ‹±: Integer β†’ int
  4. 주의점

    • null인 래퍼 객체λ₯Ό μ–Έλ°•μ‹±ν•˜λ©΄ NPE(NullPointerException)이 λ°œμƒν•œλ‹€.
    Integer x = null;
    int y = x; // NullPointerException λ°œμƒ

profile
μ°¨κ·Όμ°¨κ·Ό

0개의 λŒ“κΈ€