๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Today I Learned(TIL)/Java

Java ๊ธฐ๋ณธํŽธ ๊ฐ•์˜_final

by carrot0911 2024. 11. 28.

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 ๊ฐ’์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.