πŸ“– Java & Spring & Kotlin/πŸ’Š Java

Java 기본편 κ°•μ˜_final

carrot0911 2024. 11. 28. 19:56

final

 

final λ³€μˆ˜μ™€ μƒμˆ˜

final ν‚€μ›Œλ“œλŠ” 이름 κ·ΈλŒ€λ‘œ 끝! μ΄λΌλŠ” λœ»μ΄λ‹€.
λ³€μˆ˜μ— final ν‚€μ›Œλ“œκ°€ λΆ™μœΌλ©΄ λ”λŠ” 값을 λ³€κ²½ν•  수 μ—†λ‹€.

참고둜 final은 class, methodλ₯Ό ν¬ν•¨ν•œ μ—¬λŸ¬ 곳에 뢙을 수 μžˆλ‹€.

final - 지역 λ³€μˆ˜

package final1;

public class FinalLocalMain {

    public static void main(String[] args) {
        // final 지역 λ³€μˆ˜
        final int data1;
        data1 = 10;  // 졜초 ν•œλ²ˆλ§Œ ν• λ‹Ή κ°€λŠ₯
        //data1 = 20;  // 컴파일 였λ₯˜ λ°œμƒ

        // final 지역 λ³€μˆ˜ 2
        final int data2 = 10;
        //data2 = 20;  // 컴파일 였λ₯˜ λ°œμƒ

        method(10);
    }

    static void method(final int parameter) {
        //parameter = 20;  // 컴파일 였λ₯˜ λ°œμƒ
    }
}
  • final을 지역 λ³€μˆ˜μ— μ„€μ •ν•  경우 졜초 ν•œλ²ˆλ§Œ ν• λ‹Ήν•  수 μžˆλ‹€. 이후에 λ³€μˆ˜μ˜ 값을 λ³€κ²½ν•˜λ €λ©΄ 컴파일 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
  • final을 지역 λ³€μˆ˜ μ„ μ–Έ μ‹œ λ°”λ‘œ μ΄ˆκΈ°ν™”ν•œ 경우 이미 값이 ν• λ‹Ήλ˜μ—ˆκΈ° λ•Œλ¬Έμ— 값을 ν• λ‹Ήν•  수 μ—†λ‹€.
  • λ§€κ°œλ³€μˆ˜μ— final이 λΆ™μœΌλ©΄ λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ λ§€κ°œλ³€μˆ˜μ˜ 값을 λ³€κ²½ν•  수 μ—†λ‹€. λ”°λΌμ„œ λ©”μ„œλ“œ 호좜 μ‹œμ μ— μ‚¬μš©λœ 값이 λκΉŒμ§€ μ‚¬μš©λœλ‹€.

final - ν•„λ“œ(멀버 λ³€μˆ˜)

package final1;

// final ν•„λ“œ - μƒμ„±μž μ΄ˆκΈ°ν™”
public class ConstructInit {
    final int value;

    public ConstructInit(int value) {
        this.value = value;
    }
}
  • final을 ν•„λ“œμ— μ‚¬μš©ν•  경우 ν•΄λ‹Ή ν•„λ“œλŠ” μƒμ„±μžλ₯Ό ν†΅ν•΄μ„œ ν•œλ²ˆλ§Œ μ΄ˆκΈ°ν™”λ  수 μžˆλ‹€.
package final1;

public class FieldInit {

    static final int CONST_VALUE = 10;
    final int value = 10;

    public FieldInit(int value) {
        //this.value = value;  // μ΄ˆκΈ°κ°’μ΄ μžˆλŠ” 경우 λΆˆκ°€λŠ₯
    }
}
  • final ν•„λ“œλ₯Ό ν•„λ“œμ—μ„œ μ΄ˆκΈ°ν™”ν•˜λ©΄ 이미 값이 μ„€μ •λ˜μ—ˆκΈ° λ•Œλ¬Έμ— μƒμ„±μžλ₯Ό ν†΅ν•΄μ„œλ„ μ΄ˆκΈ°ν™”ν•  수 μ—†λ‹€.
  • static λ³€μˆ˜μ—λ„ final을 μ„ μ–Έν•  수 μžˆλ‹€.
package final1;

public class FinalFieldMain {

    public static void main(String[] args) {

        // final ν•„λ“œ - μƒμ„±μž μ΄ˆκΈ°ν™”
        System.out.println("μƒμ„±μž μ΄ˆκΈ°ν™”");
        ConstructInit constructInit1 = new ConstructInit(10);
        ConstructInit constructInit2 = new ConstructInit(20);
        System.out.println(constructInit1.value);
        System.out.println(constructInit2.value);

        // final ν•„λ“œ - ν•„λ“œ μ΄ˆκΈ°ν™”
        System.out.println("ν•„λ“œ μ΄ˆκΈ°ν™”");
        FieldInit fieldInit1 = new FieldInit();
        FieldInit fieldInit2 = new FieldInit();
        FieldInit fieldInit3 = new FieldInit();
        System.out.println(fieldInit1.value);
        System.out.println(fieldInit2.value);
        System.out.println(fieldInit3.value);

        // μƒμˆ˜
        System.out.println("μƒμˆ˜");
        System.out.println(FieldInit.CONST_VALUE);
    }
}

static final

  • FieldInit.MY_VALUEλŠ” static μ˜μ—­μ— μ‘΄μž¬ν•œλ‹€. 그리고 final ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ μ΄ˆκΈ°ν™” 값이 λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • static μ˜μ—­μ€ 단 ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•˜λŠ” μ˜μ—­μ΄λ‹€. MY_VALUE λ³€μˆ˜λŠ” JVM μƒμ—μ„œ ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•˜λ―€λ‘œ 쀑볡과 λ©”λͺ¨λ¦¬ λΉ„νš¨μœ¨ 문제λ₯Ό λͺ¨λ‘ ν•΄κ²°ν•  수 μžˆλ‹€.

 

μƒμˆ˜(Constant)

μƒμˆ˜λŠ” λ³€ν•˜μ§€ μ•Šκ³ , 항상 μΌμ •ν•œ 값을 κ°–λŠ” μˆ˜μ΄λ‹€.
μžλ°”μ—μ„œλŠ” 보톡 단 ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•˜λŠ” λ³€ν•˜μ§€ μ•ŠλŠ” κ³ μ •λœ 값을 μƒμˆ˜λΌκ³  ν•œλ‹€.

μžλ°” μƒμˆ˜ νŠΉμ§•

  • static final ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
  • λŒ€λ¬Έμžλ₯Ό μ‚¬μš©ν•˜κ³  ꡬ뢄은 _(μ–Έλ”μŠ€μ½”μ–΄)둜 ν•œλ‹€. (κ΄€λ‘€)
    • 일반적인 λ³€μˆ˜μ™€ μƒμˆ˜λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ μ΄λ ‡κ²Œ ν•œλ‹€.
  • ν•„λ“œλ₯Ό 직접 μ ‘κ·Όν•΄μ„œ μ‚¬μš©ν•œλ‹€.
    • μƒμˆ˜λŠ” κΈ°λŠ₯이 μ•„λ‹ˆλΌ κ³ μ •λœ κ°’ 자체λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 λͺ©μ μ΄λ‹€.
    • μƒμˆ˜λŠ” 값을 λ³€κ²½ν•  수 μ—†λ‹€. λ”°λΌμ„œ ν•„λ“œμ— 직접 접근해도 데이터가 λ³€ν•˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.
package final1;

// μƒμˆ˜
public class Constant {
    // μˆ˜ν•™ μƒμˆ˜
    public static final double PI = 3.14;
    // μ‹œκ°„ μƒμˆ˜
    public static final int HOURS_IN_DAY = 24;
    public static final int MINUTES_IN_HOUR = 60;
    public static  final  int SECONDS_IN_HOUR = 60;
    // μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ • μƒμˆ˜
    public static final int MAX_USERS = 1000;
}
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ•ˆμ—λŠ” λ‹€μ–‘ν•œ μƒμˆ˜κ°€ μ‘΄μž¬ν•  수 μžˆλ‹€. μˆ˜ν•™, μ‹œκ°„ λ“±λ“± μ‹€μƒν™œμ—μ„œ μ‚¬μš©ν•˜λŠ” μƒμˆ˜λΆ€ν„°, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ‹€μ–‘ν•œ 섀정을 μœ„ν•œ μƒμˆ˜λ“€λ„ μžˆλ‹€.
  • 보톡 이런 μƒμˆ˜λ“€μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ—μ„œ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— public을 자주 μ‚¬μš©ν•œλ‹€. λ¬Όλ‘  νŠΉμ • μœ„μΉ˜μ—μ„œλ§Œ μ‚¬μš©λœλ‹€λ©΄ λ‹€λ₯Έ μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.
  • μƒμˆ˜λŠ” μ€‘μ•™μ—μ„œ 값을 ν•˜λ‚˜λ‘œ 관리할 수 μžˆλ‹€λŠ” μž₯점도 μžˆλ‹€.
  • μƒμˆ˜λŠ” λŸ°νƒ€μž„μ— λ³€κ²½ν•  수 μ—†λ‹€. μƒμˆ˜λ₯Ό λ³€κ²½ν•˜λ €λ©΄ ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•˜κ³ , μ½”λ“œλ₯Ό λ³€κ²½ν•œ λ‹€μŒμ— ν”„λ‘œκ·Έλž¨μ„ λ‹€μ‹œ μ‹€ν–‰ν•΄μ•Ό ν•œλ‹€.

μΆ”κ°€λ‘œ μƒμˆ˜λŠ” μ€‘μ•™μ—μ„œ 값을 ν•˜λ‚˜λ‘œ 관리할 수 μžˆλ‹€λŠ” μž₯점도 μžˆλ‹€.

 

final λ³€μˆ˜μ™€ μ°Έμ‘°

final은 λ³€μˆ˜μ˜ 값을 λ³€κ²½ν•˜μ§€ λͺ»ν•˜κ²Œ λ§‰λŠ”λ‹€. μ—¬κΈ°μ„œ λ³€μˆ˜μ˜ κ°’μ΄λΌλŠ” 것은 뭘까?

  • λ³€μˆ˜λŠ” 크게 κΈ°λ³Έν˜• λ³€μˆ˜μ™€ μ°Έμ‘°ν˜• λ³€μˆ˜κ°€ μžˆλ‹€.
  • κΈ°λ³Έν˜• λ³€μˆ˜λŠ” 10, 20 같은 값을 λ³΄κ΄€ν•˜κ³ , μ°Έμ‘°ν˜• λ³€μˆ˜λŠ” 객체의 참쑰값을 λ³΄κ΄€ν•œλ‹€.
    • final을 κΈ°λ³Έν˜• λ³€μˆ˜μ— μ‚¬μš©ν•˜λ©΄ 값을 λ³€κ²½ν•  수 μ—†λ‹€.
    • final을 μ°Έμ‘°ν˜• λ³€μˆ˜μ— μ‚¬μš©ν•˜λ©΄ 참쑰값을 λ³€κ²½ν•  수 μ—†λ‹€.
  • μ°Έμ‘° λŒ€μƒμ˜ 객체 값은 λ³€κ²½ν•  수 μžˆλ‹€.
    • μ°Έμ‘°ν˜• λ³€μˆ˜μ— final이 λΆ™μœΌλ©΄ μ°Έμ‘°ν˜• λ³€μˆ˜μ— λ“€μ–΄μžˆλŠ” 참쑰값을 λ‹€λ₯Έ κ°’μœΌλ‘œ λ³€κ²½ν•˜μ§€ λͺ»ν•œλ‹€.
      이제 λ‹€λ₯Έ 객체λ₯Ό μ°Έμ‘°ν•  수 μ—†λ‹€λŠ” λœ»μ΄λ‹€.
      ν•˜μ§€λ§Œ μ°Έμ‘°ν˜• λ³€μˆ˜μ— λ“€μ–΄μžˆλŠ” μ°Έμ‘°κ°’λ§Œ λ³€κ²½ν•˜μ§€ λͺ»ν•˜κ³  value 값은 λ³€κ²½ν•  수 μžˆλ‹€.