
final ν€μλλ λ§ κ·Έλλ‘ βλβ μ΄λΌλ λ»μ΄λ€. finalλ‘ λ³μλ₯Ό μ μΈνλ©΄ κ·Έ κ°μ λ μ΄μ λ°κΏ μ μλ€. final ν€μλλ λ³μ, λ©μλ, ν΄λμ€μ μ¬μ©λ μ μμ§λ§, μΌλ¨ μ§κΈμ λ³μμ λΆμ κ²½μ°μ λν΄ μμ보μ.
package final1;
public class FinalLocalMain {
public static void main(String[] args) {
final int data1 = 10;
// Cannot assign a value to final variable 'data1'
// data1 = 20;
finalMethod(30);
}
// Value of parameter 'parameter' is always '30'
static void finalMethod(final int parameter) {
// Cannot assign a value to final variable 'parameter'
// parameter = 20;
}
}
보λ€μνΌ finalμ data1μ²λΌ μ§μ λ³μλ‘ μ€μ ν κ²½μ°, μ΅μ΄ νλ²λ§ ν λΉ κ°λ₯νλ€. μ΄νμ κ·Έ λ³μμ κ°μ λ³κ²½νλ €κ³ νλ€λ©΄ μ»΄νμΌ μ€λ₯κ° λ°μνλ€. λ§μ°¬κ°μ§λ‘, λ§€κ° λ³μμ finalμ΄ λΆμ κ²½μ°μλ λ©μλ λ΄λΆμμ λ§€κ° λ³μμ κ°μ λ³κ²½ν μ μλ€. λ°λΌμ λ©μλ νΈμΆ μμ μ μ¬μ©λ κ°μ΄ λκΉμ§ μ¬μ©λλ κ²μ΄λ€.
Β
λ€μμΌλ‘, finalμ λ©€λ² λ³μμ μ¬μ©ν΄λ³΄μ.
package final1;
public class ConstructInit {
final int value;
// μμ±μλ₯Ό ν΅ν΄ νλ²λ§ μ΄κΈ°ν
public ConstructInit(int value) {
this.value = value;
}
}
μμ²λΌ λ©€λ² λ³μμ finalμ΄ λΆμΌλ©΄ μμ±μλ₯Ό ν΅ν΄μ νλ²λ§ μ΄κΈ°ν λ μ μλ€. κ·Έλ¦¬κ³ static λ³μμμ finalμ μ μΈν μ μλ€.
package final1;
public class FieldInit {
static final int CONST_VALUE = 10; // μ μ μμ
final int value = 10; // μ΄κΈ°νλ μΈμ€ν΄μ€ final λ³μ
// Cannot assign a value to final variable 'value'
public FieldInit(int value) {
this.value = value;
}
}
νμ§λ§, μμ μ½λμμλ value κ°μ μ΄λ―Έ κ°μ΄ ν λΉλμκΈ° λλ¬Έμ, μμ±μμμ λ€μ μ΄κΈ°νλ₯Ό μλνλ©΄ μ€λ³΅λ μ΄κΈ°νκ° λμ΄μ μ»΄νμΌ μλ¬κ° λ°μνλ€. λ°λΌμ λ³μ μ μΈ μ μ΄κΈ°νλ₯Ό νμ§ μκ³ μμ±μμμ μ΄κΈ°νλ₯Ό νλ μ§, μ μΈ μ μ΄κΈ°νλ₯Ό νκ³ μμ±μμμλ λ€μ μ΄κΈ°ννμ§ λ§μμΌ νλ€.
Β
μ΄μ μμ μμ λ€μ μ€μ λ‘ μ¬μ©ν΄λ³΄μ.
package final1;
public class FinalFieldMain {
public static void main(String[] args) {
System.out.println("--μμ±μλ‘ μ΄κΈ°ν--");
ConstructInit c1 = new ConstructInit(10);
ConstructInit c2 = new ConstructInit(20);
System.out.println("μμ±μλ‘ μ΄κΈ°νλ c1 κ°: " + c1.value);
// c1.value = 20; // Cannot assign a value to final variable 'value'
System.out.println("μμ±μλ‘ μ΄κΈ°νλ c2 κ°: " + c2.value);
System.out.println("--νλμμ λ°λ‘ μ΄κΈ°ν--");
FieldInit f1 = new FieldInit();
FieldInit f2 = new FieldInit();
FieldInit f3 = new FieldInit();
System.out.println("λ©€λ² λ³μ f1 κ°: "+ f1.value);
System.out.println("λ©€λ² λ³μ f1 κ°: "+ f2.value);
System.out.println("λ©€λ² λ³μ f1 κ°: "+ f3.value);
System.out.println("--μμ(CONST_VALUE) μΆλ ₯--");
System.out.println(FieldInit.CONST_VALUE);
}
}
/*
--μμ±μλ‘ μ΄κΈ°ν--
μμ±μλ‘ μ΄κΈ°νλ c1 κ°: 10
μμ±μλ‘ μ΄κΈ°νλ c2 κ°: 20
--νλμμ λ°λ‘ μ΄κΈ°ν--
λ©€λ² λ³μ f1 κ°: 10
λ©€λ² λ³μ f1 κ°: 10
λ©€λ² λ³μ f1 κ°: 10
--μμ(CONST_VALUE) μΆλ ₯--
10
*/
μμ ConstructInitκ³Ό κ°μ΄ μμ±μλ₯Ό μ΄μ©ν΄μ final νλλ₯Ό μ΄κΈ°ν νλ κ²½μ°, κ° μΈμ€ν΄μ€λ§λ€ final νλμ κ°κ° λ€λ₯Έ κ°μ ν λΉν μ μλ€. λ¬Όλ‘ μ΄λ―Έ κ°μ ν λΉνλ€λ©΄ κ·Έ κ°μ λ€μ λ³κ²½ν μλ μλ€. νμ§λ§, μ΄λ―Έ λ©€λ² λ³μμμ μ΄κΈ°νκΉμ§ μ§νν FieldInitμ valueλ μΈμ€ν΄μ€λ₯Ό μ무리 λ§μ΄ μμ±ν΄λ μ΄κΈ°νλ κ° 10μΌλ‘ κ³ μ μ μΌλ‘ μΆλ ₯λλ κ²μ νμΈν μ μλ€. μλ κ·Έλ¦Όμ ν΅ν΄ λ μμΈνκ² μ΄ν΄λ³΄μ.

FieldInitκ³Ό κ°μ΄ final νλλ₯Ό νλμμ μ΄κΈ°ννλ©΄, λͺ¨λ FieldInit μΈμ€ν΄μ€μ κ°μ μ΄κΈ°νλ κ°μ κ°λλ€. μλνλ©΄, μμ±μ μ΄κΈ°νμλ λ€λ₯΄κ² λ©€λ² λ³μλ₯Ό μ΄κΈ°ννλ κ²μ μ΄κΈ°ννλ κ°μΌλ‘ λ°λ‘ λ°νλ²λ¦¬λ κ²μ΄κΈ° λλ¬Έμ΄λ€. μ΄λ¬λ©΄ λ¬΄μ¨ λ¬Έμ κ° λ°μν κΉ? μΈμ€ν΄μ€λ 무μ§νκ² λ§μλ° λͺ¨λ κ°μ κ°μ μ¬μ©νκΈ° λλ¬Έμ κ²°κ³Όμ μΌλ‘ 보면 λ©λͺ¨λ¦¬λ₯Ό λλΉνλ κΌ΄μ΄λ€. μ΄μ°¨νΌ λ€ κ°μ΄ 10μΈλ°, μ¬μ§μ΄ λ°λμ§λ μλλ€. μ΄λ° μν©μ λͺ
νν μ€λ³΅μ΄ λ°μν μν©μ΄λ€. λ°λ‘ μ΄λ΄ λ μ¬μ©νλ©΄ μ’μ κ²μ΄ static μμμ΄λ€.
Β
μκΉ CONST_VALUEμ²λΌ static finalμ κ°μ΄ μ¨ μ£Όλ©΄ κ³΅μ© λ³μμΈλ° κ°μ΄ λ°λμ§ μκ² λλ€. μλ€μνΌ static μμμ λ¨ νλλ§ μ‘΄μ¬νλ μμμ΄λ€. λ°λΌμ CONST_VALUE λ³μλ JVM μμμ λ¨ νλλ§ μ‘΄μ¬νλ―λ‘ μ€λ³΅κ³Ό λ©λͺ¨λ¦¬ λΉν¨μ¨ λ¬Έμ λ₯Ό ννΌν μ μλ κ²μ΄λ€.
Β
μ΄λ° CONST_VALUEμ κ°μ κ°μ βμμβ λΌκ³ νλ€. μμλ λ³νμ§ μκ³ , νμ κ°μ κ°μ κ°λ κ²μ λ§νλ€. μλ°μμλ λ¨ νλλ§ μ‘΄μ¬νκ³ λ³νμ§ μλ κ³ μ λ κ°μ μμλΌ νλ€. μ΄λ¬ν μ΄μ λ‘ μμλ static final ν€μλλ₯Ό μ¬μ©νλ€. μμλ κΈ°λ₯μ΄ μλλΌ κ³ μ λ κ° μ체λ₯Ό μ¬μ©νλ κ²μ΄ λͺ©μ μ΄λ€. κ°μ΄ κ³ μ λμ΄ μκΈ° λλ¬Έμ νλμ μ§μ μ κ·Όν΄μ μ¬μ©νλ€.
package final1;
public class Constant {
public static final double PI = 3.141592;
public static final int HOURS_IN_DAY = 24;
public static final int MINUTES_IN_HOUR = 60;
public static final int SECONDS_IN_MINUTE = 60;
public static final int MAX_USERS = 2000;
}
μ΄μ²λΌ μ ν리μΌμ΄μ
μμλ λ€μν μμκ° μ‘΄μ¬ν μ μλ€. μ΄λ° μμλ€μ μ ν리μΌμ΄μ
μ λ°μ κ±Έμ³μ μ¬μ©λ μ μκΈ° λλ¬Έμ λλΆλΆ publicμ λΆμ΄λ κ²μ΄ μ μ νλ€. λν, μμλ λ°νμμ λ³κ²½ν μ μλ€. μμλ₯Ό λ³κ²½νλ €λ©΄ νλ‘κ·Έλ¨μ μ’
λ£νκ³ μ½λλ₯Ό λ³κ²½ν λ€μ, νλ‘κ·Έλ¨μ λ€μ μ€νν΄μΌ νλ€.
Β
κ·Έλ¦¬κ³ μμλ μ€μμμ κ°μ κ΄λ¦¬ν μ μλ€λ μ₯μ μ΄ μλ€. μλ μ½λλ₯Ό 보μ.
package final1;
public class ConstantMain1 {
public static void main(String[] args) {
System.out.println("--νλ‘κ·Έλ¨ μ΅λ μ°Έμ¬μ μ: 1000λͺ
");
int currentUserCount = 999;
process(currentUserCount++);
process(currentUserCount++);
process(currentUserCount++);
process(currentUserCount++);
}
private static void process(int currentUserCount) {
System.out.println("μ°Έμ¬μ μ:" + currentUserCount);
if (currentUserCount > 1000) {
System.out.println("λκΈ°μλ‘ λ±λ‘ν©λλ€...");
} else {
System.out.println("κ²μμ μ°Έμ¬ν©λλ€!");
}
}
}
/*
--νλ‘κ·Έλ¨ μ΅λ μ°Έμ¬μ μ: 1000λͺ
μ°Έμ¬μ μ:999
κ²μμ μ°Έμ¬ν©λλ€!
μ°Έμ¬μ μ:1000
κ²μμ μ°Έμ¬ν©λλ€!
μ°Έμ¬μ μ:1001
λκΈ°μλ‘ λ±λ‘ν©λλ€...
μ°Έμ¬μ μ:1002
λκΈ°μλ‘ λ±λ‘ν©λλ€...
*/
μ΄λ° μ½λμ λ¬Έμ λ, λ§μ½ νλ‘κ·Έλ¨μ μ°Έμ¬ν μ μλ μ ν μΈμμλ₯Ό λ°κΎΈλ €κ³ νλ€λ©΄ μ¬λ¬ μ½λλ₯Ό λ°κΏμΌ ν μ μλ€λ μ μ΄λ€. κ·Έλ¦¬κ³ μ§κΈμ΄μΌ μ€λͺ μ΄ μ ν μμ΄μ λ§μ μ΄μ§, 1000λͺ μ λν μ€λͺ μ΄ μλ€λ©΄ μ²μ μ΄ μ½λλ₯Ό λ³Έ μ¬λμ 1000λͺ μ΄ μ΄λ€ μλ―ΈμΈμ§ μκΈ°κ° νλ€ κ²μ΄λ€. μ΄λ° κ²μ βMagic Numberβ λΌκ³ νλ€.
Β
μ΄λ΄ λ μμλ₯Ό μ¬μ©νλ©΄ κ°μ λ³κ²½ν λ μΌκ΄μ μΌλ‘ κΉλνκ² μ²λ¦¬ν μ μκ³ , μλ―Έλ μμ£Ό μ λ Ήμ μκΈ° λλ¬Έμ μμ£Ό μ’λ€.
package final1;
public class ConstantMain1 {
public static void main(String[] args) {
System.out.println("--νλ‘κ·Έλ¨ μ΅λ μ°Έμ¬μ μ: " + Constant.MAX_USERS + "λͺ
");
int currentUserCount = 999;
process(currentUserCount++);
process(currentUserCount++);
process(currentUserCount++);
process(currentUserCount++);
}
private static void process(int currentUserCount) {
System.out.println("μ°Έμ¬μ μ:" + currentUserCount);
if (currentUserCount > Constant.MAX_USERS) {
System.out.println("λκΈ°μλ‘ λ±λ‘ν©λλ€...");
} else {
System.out.println("κ²μμ μ°Έμ¬ν©λλ€!");
}
}
}
/*
--νλ‘κ·Έλ¨ μ΅λ μ°Έμ¬μ μ: 2000λͺ
μ°Έμ¬μ μ:999
κ²μμ μ°Έμ¬ν©λλ€!
μ°Έμ¬μ μ:1000
κ²μμ μ°Έμ¬ν©λλ€!
μ°Έμ¬μ μ:1001
κ²μμ μ°Έμ¬ν©λλ€!
μ°Έμ¬μ μ:1002
κ²μμ μ°Έμ¬ν©λλ€!
*/
Β
λ³μμλ βκΈ°λ³Έν λ³μβ μ βμ°Έμ‘°ν λ³μβ κ° μμλ€. finalμ κΈ°λ³Έν λ³μμ μ¬μ©νλ©΄ κ°μ λ³κ²½ν μ μκ³ , μ°Έμ‘°ν λ³μμ μ¬μ©νλ©΄ μ°Έμ‘°κ°μ λ³κ²½ν μ μλ κ²μ΄λ€. μλ μμ λ₯Ό μ΄ν΄λ³΄μ.
package final1;
public class Data {
public int value;
}
package final1;
public class FinalRefMain {
public static void main(String[] args) {
final Data data = new Data(); // μ°Έμ‘°ν λ³μμ final μ μΈ
// Cannot assign a value to final variable 'data'
// data = new Data();
// μ°Έμ‘° λμμ κ°μ λ³κ²½ κ°λ₯νλ€.
data.value = 10;
System.out.println("dataκ° μ°Έμ‘°νλ μΈμ€ν΄μ€μ value κ° = " + data.value);
data.value = 20;
System.out.println("dataκ° μ°Έμ‘°νλ μΈμ€ν΄μ€μ value κ° = " + data.value);
}
}
/*
dataκ° μ°Έμ‘°νλ μΈμ€ν΄μ€μ value κ° = 10
dataκ° μ°Έμ‘°νλ μΈμ€ν΄μ€μ value κ° = 20
*/
μ°Έμ‘°ν λ³μμ finalμ΄ λΆμκ³ , μ°Έμ‘°ν λ³μ dataμ μ΄λ―Έ μ°Έμ‘°κ°μ ν λΉνμΌλ―λ‘ μ°Έμ‘°κ°μ λ³κ²½νλ κ²μ λΆκ°λ₯νλ€.
νμ§λ§... βμ°Έμ‘° λμμ κ°μ λ³κ²½μ΄ κ°λ₯νλ€.β
μκ°ν΄λ³΄λ©΄ λΉμ°ν κ²μ΄, μ°Έμ‘°κ°μ΄ κ³ μ λμλ€λ λ§μ λ€λ₯Έ κ°μ²΄λ₯Ό μ°Έμ‘°ν μ μλ€λ λ§μ΄μ§, κ·Έ μμ μΈμ€ν΄μ€ λ³μλ₯Ό λ³κ²½ν μ μλ€λ λ§μ μλλ€.
