Java 2-5 final

ν† μŠ€νŠΈλΉŒλŸ°Β·2025λ…„ 3μ›” 11일

final

πŸ“šfinal 의 μš©λ„

  • 1. λ³€μˆ˜λŠ” 변경이 λΆˆκ°€λŠ₯ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.

    1οΈβƒ£λ³€μˆ˜μ—μ„œ final

    • λ³€μˆ˜μ— final 을 뢙이면 λ³€μˆ˜λ₯Ό ν•œ 번만 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

      final int a = 100;
      a = 200; // ❌ 였λ₯˜ λ°œμƒ!
  • 2. ν΄λž˜μŠ€λŠ” 상속할 수 μ—†κ²Œ λ§Œλ“­λ‹ˆλ‹€.

    2οΈβƒ£ν΄λž˜μŠ€μ—μ„œ final

    • final 둜 μ„ μ–Έλœ ν΄λž˜μŠ€λŠ” 상속할 수 μ—†μŠ΅λ‹ˆλ‹€.(상속은 좔후에 ν•™μŠ΅ν•©λ‹ˆλ‹€.)

      final class Animal {
          void sound() {
              System.out.println("Animal sound!");
          }
      }
      
      // class Dog extends Animal {} // ❌ 였λ₯˜! final ν΄λž˜μŠ€λŠ” 상속할 수 μ—†μŒ
  • 3. λ©”μ„œλ“œλŠ” μˆ˜μ •ν•  수 μ—†κ²Œ λ§Œλ“­λ‹ˆλ‹€.(μ˜€λ²„λΌμ΄λ”© λΆˆκ°€)

    3️⃣ λ©”μ„œλ“œμ—μ„œ final

    • final 둜 μ„ μ–Έλœ λ©”μ„œλ“œλŠ” μ˜€λ²„λΌμ΄λ”© ν•  수 μ—†μŠ΅λ‹ˆλ‹€. (μ˜€λ²„λΌμ΄λ”©μ€ 좔후에 ν•™μŠ΅ν•©λ‹ˆλ‹€.)

      class Parent {
          final void show() {
              System.out.println("Hello from Parent");
          }
      }
      
      class Child extends Parent {
      		
      		@Override
          void show() { // ❌ 였λ₯˜! final λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•  수 μ—†μŒ
              System.out.println("Hello from Child");
          }
      }

μƒμˆ˜(Constant)

πŸ“šμƒμˆ˜(constant)

  • μƒμˆ˜λŠ” λ³€ν•˜μ§€ μ•Šκ³  항상 μΌμ •ν•œ 값을 κ°–λŠ” 수 μž…λ‹ˆλ‹€.
  • Javaμ—μ„œ μƒμˆ˜λŠ” λŒ€λ¬Έμžλ‘œ ν‘œν˜„ν•˜λŠ” 것이 κ΄€λ‘€μž…λ‹ˆλ‹€.
  • ν”„λ‘œκ·Έλž¨ 싀행쀑에 μ ˆλŒ€ λ³€κ²½λ˜μ„œλŠ” μ•ˆλ˜κΈ° λ•Œλ¬Έμ— static final ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μ„ μ–Έν•©λ‹ˆλ‹€.
  • static 으둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” ν”„λ‘œκ·Έλž¨ μ‹œμž‘μ‹œ ν•œ 번만 μ΄ˆκΈ°ν™”λ˜κ³  λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ—μ„œ 같은 값을 κ³΅μœ ν•©λ‹ˆλ‹€.

πŸ’‘λŒ€ν‘œμ μΈ μƒμˆ˜ μ˜ˆμ‹œ: PI(μ›μ£Όμœ¨)

  • μ›μ˜ 넓이, λ‘˜λ ˆλ₯Ό ꡬ할 λ•Œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©λ˜λŠ” κ°’μž…λ‹ˆλ‹€.(λ³€κ²½λ˜λ©΄ μ•ˆ 됨)
public class Circle {

    final static double PI = 3.14159; // βœ… μƒμˆ˜ μ„ μ–Έ
}
System.out.println("μƒμˆ˜ν™œμš©: " + Circle.PI);

⚠️static 으둜 μ„ μ–Έν•˜λŠ” 이유(볡슡)

  • 보톡 μƒμˆ˜λŠ” μ—¬λŸ¬ κ³³μ—μ„œ 값을 κ³΅μœ ν•΄ 쓰일 λͺ©μ μœΌλ‘œ ν™œμš©λ©λ‹ˆλ‹€.
  • μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό static 없이 μ„ μ–Έν•  경우 μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ PI 값이 쀑볡 μ €μž₯λ©λ‹ˆλ‹€.


λΆˆλ³€κ°μ²΄(Immutable Object)

πŸ“šλΆˆλ³€κ°μ²΄(Immutable Object) 의 νŠΉμ§•

  • λΆˆλ³€κ°μ²΄λŠ” λ‚΄λΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•  수 μ—†λŠ” κ°μ²΄μž…λ‹ˆλ‹€.
  • final 을 속성(property, field) 에 ν™œμš©ν•©λ‹ˆλ‹€.
  • μ„Έν„°(setter) 없이 섀계 ν•©λ‹ˆλ‹€.
  • 변경이 ν•„μš”ν•  경우 μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • 예) String , Integer , 래퍼클래슀 λ“±

🚫잘λͺ»λœ λΆˆλ³€κ°μ²΄ μ‚¬μš©

  • final 은 μ°Έμ‘° 변경을 λ§‰μ§€λ§Œ λ‚΄λΆ€μƒνƒœ 변경은 막지 μ•ŠμŠ΅λ‹ˆλ‹€.
public class Circle {

    final static double PI = 3.14159; // βœ… 직접 λ§Œλ“  μ›μ£Όμœ¨ μƒμˆ˜
    double radius; // ⚠️ final 둜 μ„ μ–Έλ˜μ–΄ μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ™ΈλΆ€μ—μ„œ λ³€κ²½ κ°€λŠ₯

    Circle(double radius)  {
        this.radius = radius;
    }
}
final Circle c1 = new Circle(2);
c1 = new Circle(3); // ❌ final은 λ³€μˆ˜ c1이 ν•œ 번 μ°Έμ‘°ν•œ κ°μ²΄λŠ” λ‹€λ₯Έ 객체둜 변경될 수 μ—†μŒμ„ μ˜λ―Έν•¨ (μ°Έμ‘° λΆˆλ³€)

// ν•˜μ§€λ§Œ 객체 λ‚΄λΆ€μ˜ 속성 값은 λ³€κ²½ κ°€λŠ₯ (λΆˆλ³€ 객체가 μ•„λ‹˜)
c1.radius = 3; // ⚠️ λ‚΄λΆ€ μƒνƒœ λ³€κ²½ κ°€λŠ₯ (객체 μžμ²΄κ°€ λΆˆλ³€μ΄ μ•„λ‹˜)

βœ…μ˜¬λ°”λ₯Έ λΆˆλ³€ 객체 ν™œμš©

  • 속성을 final 둜 μ„ μ–Έν•΄ μ€λ‹ˆλ‹€.
public final class Circle {

    final static double PI = 3.14159; 
    final double radius; // βœ… final 둜 μ„ μ–Έν•΄μ„œ 값이 λ³€κ²½λ˜μ§€ μ•Šλ„λ‘ ν•©λ‹ˆλ‹€.

    Circle(double radius)  {
        this.radius = radius;
    }
}
  • 클래슀 μΊ‘μŠν™”λ₯Ό 배우고 λ‚œ ν›„ ν™œμš©ν•  수 μžˆλŠ” λͺ¨λ²”사둀(참고용)
    public final class Circle { // βœ… ν΄λž˜μŠ€μ— final μ„ μ–Έ (상속 λ°©μ§€)
        
        private static final double PI = 3.14159; // βœ… μƒμˆ˜λŠ” private static final둜 μ„ μ–Έ
        private final double radius; // βœ… ν•„λ“œλ₯Ό private final둜 μ„ μ–Έν•˜μ—¬ μ™„μ „ν•œ λΆˆλ³€μ„± μœ μ§€
    
        public Circle(double radius) { // βœ… μƒμ„±μžλŠ” public으둜 μœ μ§€
            this.radius = radius;
        }
    
        public double getRadius() { // βœ… public λ©”μ„œλ“œλ‘œ λ³€κ²½
            return radius;
        }
    
        public double getArea() { // βœ… public λ©”μ„œλ“œλ‘œ λ³€κ²½
            return PI * radius * radius;
        }
    
        public double getPerimeter() { // βœ… public λ©”μ„œλ“œλ‘œ λ³€κ²½
            return 2 * PI * radius;
        }
    }
    

βš οΈλΆˆλ³€ 객체의 값이 변경이 ν•„μš”ν•œ 경우

  • λΆˆλ³€μ„±μ„ μœ μ§€ν•˜λ©΄μ„œ 값을 λ³€κ²½ν•˜λŠ” 효과λ₯Ό 얻을 λ•Œ ν™œμš©ν•©λ‹ˆλ‹€.
  • κΈ°μ‘΄ 객체의 μƒνƒœλ₯Ό 직접 λ³€κ²½ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  • μƒμ„±μžλ₯Ό μƒˆλ‘œ ν˜ΈμΆœν•˜κ±°λ‚˜ μ•„λž˜μ˜ κΈ°λŠ₯을 ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
public final class Circle {
    public static final double PI = 3.14159;
    private final double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    // βœ… λ°˜μ§€λ¦„μ΄ λ‹€λ₯Έ μƒˆλ‘œμš΄ Circle 생성 (λΆˆλ³€ 객체 μœ μ§€)
    public Circle changeRadius(double newRadius) {
        return new Circle(newRadius); // μƒμ„±μž 호좜: κΈ°μ‘΄ 객체 λ³€κ²½ X, μƒˆ 객체 생성
    }
}

0개의 λŒ“κΈ€