[Java] static κ³Ό instanceμ μ°¨μ΄
μλ‘
staticκ³Ό instanceμ μ°¨μ΄μ λν΄μ νλ² μ 리νμ¬ μ§κ³ λμ΄ κ°λ €κ³ ν©λλ€.
λͺ©μ°¨
1. ν΄λμ€(static) λ³μμ μΈμ€ν΄μ€ λ³μμ μ°¨μ΄
2. ν΄λμ€(static) λ©μλμ μΈμ€ν΄μ€ λ©μλ μ°¨μ΄
3. ν΄λμ€(static) λ©€λ²μ μΈμ€ν΄μ€ λ©€λ² κ°μ μ°Έμ‘°μ νΈμΆ
1. ν΄λμ€(static) λ³μμ μΈμ€ν΄μ€ λ³μμ μ°¨μ΄
λ©€λ² λ³μ μ€ staticμ΄ λΆμ κ²μ ν΄λμ€ λ³μ, λΆμ§ μμ κ²μ μΈμ€ν΄μ€ λ³μμ λλ€. μλ μ½λλ₯Ό 보며 μ 리ν΄λ³΄κ² μ΅λλ€.
public class Test {
int instanceValue; // μΈμ€ν΄μ€ λ³μ
static int classValue; // ν΄λμ€ λ³μ
void method() {
int stackValue = 0; // μ§μ λ³μ
}
}
μ μ½λμλ 3κ°μ intν λ³μκ° μ μΈλμ΄ μλλ°, instanceValueμ classValueλ ν΄λμ€ μμ μμ μ μΈλμ΄μμΌλ―λ‘ λ©€λ² λ³μμ λλ€. κ·Έμ€ classValueλ μμ static λΆμ΄μ μ μΈλμ΄ μμΌλ―λ‘ ν΄λμ€ λ³μμ΄λ©°, instanceValueλ μΈμ€ν΄μ€ λ³μμ λλ€. κ·Έλ¦¬κ³ stackValueλ λ©μλμΈ method()μ λ΄λΆ, μ¦ 'λ©μλ μμ'μ μ μΈλμ΄ μμΌλ―λ‘ μ§μλ³μμ λλ€.
λ³μμ μ’ λ₯ | μ μΈ μμΉ | μμ± μκΈ° |
ν΄λμ€ λ³μ(class variable) | ν΄λμ€ μμ | ν΄λμ€κ° λ©λͺ¨λ¦¬μ μ¬λΌκ° λ |
μΈμ€ν΄μ€ λ³μ(instance variable) | μΈμ€ν΄μ€κ° μμ±λμμ λ | |
μ§μ λ³μ(local variable) | ν΄λμ€ μμ μ΄μΈμ μμ(λ©μλ, μμ±μ, μ΄κΈ°ν λΈλ λ΄λΆ) | λ³μ μ μΈλ¬Έμ΄ μνλμμ λ |
μΈ κ°μ§ λ³μμ μ’ λ₯λ₯Ό μμΈνκ² μ΄ν΄λ³΄κ² μ΅λλ€.
1) μΈμ€ν΄μ€ λ³μ(instance variable)
ν΄λμ€ μμμ μ μΈλλ©°, ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±ν λ λ§λ€μ΄μ§λλ€. κ·Έλ κΈ° λλ¬Έμ μΈμ€ν΄μ€ λ³μμ κ°μ μ½μ΄ μ€κ±°λ μ μ₯νκΈ° μν΄ μλ λ¨Όμ μΈμ€ν΄μ€λ₯Ό μμ±ν΄μΌ ν©λλ€.
μ): Test test = new Test();
μΈμ€ν΄μ€λ λ 립μ μΈ μ μ₯곡κ°μ κ°μ§λ―λ‘ μλ‘ λ€λ₯Έ κ°μ κ°μ§ μ μμ΅λλ€. μΈμ€ν΄μ€λ§λ€ κ³ μ ν μνλ₯Ό μ μ§ν΄μΌ νλ μμ±μ κ²½μ°, μΈμ€ν΄μ€ λ³μλ‘ μ μΈν©λλ€.
2) ν΄λμ€ λ³μ(calss variable)
ν΄λμ€ λ³μλ₯Ό μ μΈνλ λ°©λ²μ μΈμ€ν΄μ€ λ³μ μμ staticμ λΆμ΄κΈ°λ§ νλ©΄ λ©λλ€. μΈμ€ν΄μ€λ§λ€ λ 립μ μΈ μ μ₯곡κ°μ κ°λ μΈμ€ν΄μ€ λ³μμλ λ¬λ¦¬, ν΄λμ€ λ³μλ λͺ¨λ μΈμ€ν΄μ€κ° 곡ν΅λ μ μ₯ 곡κ°(λ³μ)μ 곡μ νκ² λ©λλ€. ν ν΄λμ€μ λͺ¨λ μΈμ€ν΄μ€λ€μ΄ 곡ν΅μ μΈ κ°μ μ μ§ν΄μΌ νλ μμ±μ κ²½μ°, ν΄λμ€ λ³μλ‘ μ μΈν΄μΌ ν©λλ€.
ν΄λμ€ λ³μλ μΈμ€ν΄μ€ λ³μμ λ¬λ¦¬ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μκ³ λ μΈμ λΌλ μλμ κ°μ΄ λ°λ‘ μ¬μ©ν μ μλ€λ νΉμ§μ΄ μμ΅λλ€.
μ:) Test.λ³μλͺ
ν΄λμ€κ° λ©λͺ¨λ¦¬μ λ‘λ©(loading)λ λ μμ±λμ΄ νλ‘κ·Έλ¨μ΄ μ’ λ£λ λκΉμ§ μ μ§λλ©°, publicμ μμ λΆμ΄λ©΄ κ°μ νλ‘κ·Έλ¨ λ΄μμ μ΄λμλ μ κ·Όν μ μλ 'μ μ λ³μ(global variable)'μ μ±κ²©μ κ°μ΅λλ€.
3) μ§μ λ³μ(local variable)
λ©μλ λ΄μ μ μΈλμ΄ λ©μλ λ΄μμλ§ μ¬μ© κ°λ₯νλ©°, λ©μλκ° μ’ λ£λλ©΄ μλ©Έλμ΄ μ¬μ©ν μ μκ² λ©λλ€. forλ¬Έ λλ whileλ¬Έκ³Ό κ°μ΄ λΈλ λ΄μ μ μΈλ μ§μλ³μλ, μ§μλ³μκ° μ μΈλ λΈλ{} μμμλ§ μ¬μ© κ°λ₯νλ©°, λΈλ{}μ λ²μ΄λλ©΄ μλ©Έλμ΄ μ¬μ©ν μ μκ² λ©λλ€.
2. ν΄λμ€(static) λ©μλμ μΈμ€ν΄μ€ λ©μλ μ°¨μ΄
λ³μμμ κ·Έλ¬λ κ²κ³Ό κ°μ΄, λ©μλ μμ staticμ΄ λΆμ΄ μμΌλ©΄ ν΄λμ€ λ©μλμ΄κ³ , λΆμ΄μμ§ μμΌλ©΄ μΈμ€ν΄μ€ λ©μλμ λλ€. ν΄λμ€ λ©μλλ ν΄λμ€ λ³μμ²λΌ, κ°μ²΄λ₯Ό μμ±νμ§ μκ³ λ νΈμΆμ΄ κ°λ₯νμ§λ§ λ°λ©΄μ μΈμ€ν΄μ€ λ©μλλ λ°λμ κ°μ²΄λ₯Ό μμ±ν΄μΌλ§ νΈμΆν μ μμ΅λλ€.
1) ν΄λμ€λ₯Ό μ€κ³ν λ, λ©€λ² λ³μ μ€ λͺ¨λ μΈμ€ν΄μ€μ 곡ν΅μΌλ‘ μ¬μ©νλ κ²μ staticμ λΆμΈλ€.
- μμ±λ κ° μΈμ€ν΄μ€λ μλ‘ λ 립μ μ΄κΈ° λλ¬Έμ κ° μΈμ€ν΄μ€ λ³μλ μλ‘ λ€λ₯Έ κ°μ μ μ§ν©λλ€. κ·Έλ¬λ λͺ¨λ μΈμ€ν΄μ€μμ κ°μ κ°μ΄ μ μ§λμ΄μΌ νλ λ³μλ staticμ λΆμ¬μ ν΄λμ€ λ³μλ‘ μ μν΄μΌ ν©λλ€.
2) ν΄λμ€ λ³μ(staticλ³μ)λ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μμλ μ¬μ©ν μ μλ€.
- staticμ΄ λΆμ λ³μ(ν΄λμ€ λ³μ)λ ν΄λμ€κ° λ©λͺ¨λ¦¬μ μ¬λΌκ° λ μ΄λ―Έ μλμ μΌλ‘ μμ±λκΈ° λλ¬Έμ λλ€.
3) ν΄λμ€ λ©μλ(staticλ©μλ)λ μΈμ€ν΄μ€ λ³μλ₯Ό μ¬μ©ν μ μλ€.
- μΈμ€ν΄μ€ λ³μλ μΈμ€ν΄μ€κ° λ°λμ μ‘΄μ¬ν΄μΌλ§ μ¬μ©ν μ μλλ°, ν΄λμ€ λ©μλ(static)λ μΈμ€ν΄μ€ μμ± μμ΄ νΈμΆ κ°λ₯νλ―λ‘ ν΄λμ€ λ©μλκ° νΈμΆλμμ λ μΈμ€ν΄μ€κ° μ‘΄μ¬νμ§ μμ μλ μμ΅λλ€. κ·Έλμ ν΄λμ€ λ©μλμμ μΈμ€ν΄μ€ λ³μμ μ¬μ©μ κΈμ§ν©λλ€.
- λ°λ©΄μ μΈμ€ν΄μ€ λ³μλ μΈμ€ν΄μ€ λ©μλμμλ staticμ΄ λΆμ λ©€λ²λ€μ μ¬μ©νλ κ²μ΄ μΈμ λ κ°λ₯ν©λλ€. μΈμ€ν΄μ€ λ³μκ° μ‘΄μ¬νλ€λ κ²μ staticλ³μκ° μ΄λ―Έ λ©λͺ¨λ¦¬μ μ‘΄μ¬νλ€λ κ²μ μλ―ΈνκΈ° λλ¬Έμ λλ€.
4) λ©μλ λ΄μμ μΈμ€ν΄μ€ λ³μλ₯Ό μ¬μ©νμ§ μλλ€λ©΄, staticμ λΆμ΄λ κ²μ κ³ λ €νλ€.
- λ©μλμ μμ λ΄μ© μ€μμ μΈμ€ν΄μ€λ₯Ό νμλ‘ νλ€λ©΄, staticμ λΆμΌ μ μμ΅λλ€.
- λ°λλ‘ μΈμ€ν΄μ€ λ³μλ₯Ό νμλ‘ νμ§ μλλ€λ©΄ staticμ λΆμ΄λ κ² λ©μλ νΈμΆμκ°μ΄ 짧μμ§λ―λ‘ μ±λ₯ ν₯μμ μ’μ΅λλ€.
- μ΄μ λ staticμ μ λΆμΈ λ©μλ(μΈμ€ν΄μ€ λ©μλ)λ μ€ν μ νΈμΆλμ΄μΌ ν λ©μλλ₯Ό μ°Ύλ κ³Όμ μ΄ μΆκ°μ μΌλ‘ νμνκΈ° λλ¬Έμ μκ°μ΄ λ μ€λ 걸리기 λλ¬Έμ λλ€.
μλ μμ μ½λλ₯Ό 보μλ©΄ μ΄ν΄κ° λ μ λμ€ κ² κ°μ΅λλ€.
class MyMath2 {
long a, b;
// μΈμ€ν΄μ€λ³μ a, bλ§μ μ΄μ©ν΄μ μμ
νλ―λ‘ λ§€κ°λ³μκ° νμμλ€.
long add() { return a + b; } // a, bλ μΈμ€ν΄μ€λ³μ
long subtract() { return a - b; }
long multiply() { return a * b; }
double divide() { return a / b; }
// μΈμ€ν΄μ€λ³μμ κ΄κ³μμ΄ λ§€κ°λ³μλ§μΌλ‘ μμ
μ΄ κ°λ₯νλ€.
static long add(long a, long b) { return a + b; } // a, bλ μ§μλ³μ
static long subtract(long a, long b) { return a - b; }
static long multiply(long a, long b) { return a * b; }
static double divide(double a, double b) { return a / b; }
}
class MyMathTest2 {
public static void main(String args[]) {
// ν΄λμ€λ©μλ νΈμΆ. μΈμ€ν΄μ€ μμ±μμ΄ νΈμΆκ°λ₯
System.out.println(MyMath2.add(200L, 100L));
System.out.println(MyMath2.subtract(200L, 100L));
System.out.println(MyMath2.multiply(200L, 100L));
System.out.println(MyMath2.divide(200.0, 100.0));
MyMath2 mm = new MyMath2(); // μΈμ€ν΄μ€λ₯Ό μμ±
mm.a = 200L;
mm.b = 100L;
// μΈμ€ν΄μ€λ©μλλ κ°μ²΄μμ± νμλ§ νΈμΆμ΄ κ°λ₯ν¨.
System.out.println(mm.add());
System.out.println(mm.subtract());
System.out.println(mm.multiply());
System.out.println(mm.divide());
}
}
3. ν΄λμ€(static) λ©€λ²μ μΈμ€ν΄μ€ λ©€λ² κ°μ μ°Έμ‘°μ νΈμΆ
κ°μ ν΄λμ€μ μν λ©€λ²λ€ κ°μλ λ³λμ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μκ³ λ μλ‘ μ°Έμ‘° λλ νΈμΆμ΄ κ°λ₯ν©λλ€. λ¨, ν΄λμ€ λ©€λ²κ° μΈμ€ν΄μ€ λ©€λ²λ₯Ό μ°Έμ‘° λλ νΈμΆνκ³ μ νλ κ²½μ°μλ μΈμ€ν΄μ€λ₯Ό μμ±ν΄μΌ ν©λλ€.
κ·Έ μ΄μ λ μΈμ€ν΄μ€ λ©€λ²κ° μ‘΄μ¬νλ μμ μ ν΄λμ€ λ©€λ²λ νμ μ‘΄μ¬νμ§λ§, ν΄λμ€ λ©€λ²κ° μ‘΄μ¬νλ μμ μλ μΈμ€ν΄μ€ λ©€λ²κ° μ‘΄μ¬νμ§ μμ μλ μκΈ° λλ¬Έμ λλ€.
class Test{
void instanceMethod(){} // μΈμ€ν΄μ€ λ©μλ
static void staticMethod(){} // static λ©μλ
void instanceMethod2(){ // μΈμ€ν΄μ€ λ©μλ
instanceMethod(); // λ€λ₯Έ μΈμ€ν΄μ€λ©μλλ₯Ό νΈμΆνλ€.
staticMethod(); // static λ©μλλ₯Ό νΈμΆνλ€.
}
static void staticMethod2(){ // static λ©μλ
instanceMethod(); // μλ¬!(λΆκ°λ₯) μΈμ€ν΄μ€ λ©μλ νΈμΆ λΆκ°λ₯
staticMethod(); // static λ©μλλ νΈμΆ ν μ μλ€.
}
}
μμ μ½λλ κ°μ ν΄λμ€ λ΄μ μΈμ€ν΄μ€ λ©μλμ staticλ©μλ κ°μ νΈμΆμ λν΄μ μ 리νμ΅λλ€. κ°μ ν΄λμ€ λ΄μ λ©μλλ μλ‘ κ°μ²΄μ μμ±μ΄λ μ°Έμ‘° λ³μ μμ΄ μ§μ νΈμΆμ΄ κ°λ₯νμ§λ§ staticλ©μλλ μΈμ€ν΄μ€ λ©μλλ₯Ό νΈμΆν μ μμ΅λλ€.
μ΄λ²μ λ³μμ λ©μλ κ°μ νΈμΆμ λν΄μ μμλ³΄κ² μ΅λλ€. λ©μλ κ°μ νΈμΆκ³Ό λ§μ°¬κ°μ§λ‘ μΈμ€ν΄μ€ λ©μλλ μΈμ€ν΄μ€ λ³μλ₯Ό μ¬μ©ν μ μμ§λ§, static λ©μλλ μΈμ€ν΄μ€ λ³μλ₯Ό μ¬μ©ν μ μμ΅λλ€.
class MemberCall {
int iv = 10;
static int cv = 20;
int iv2 = cv;
// static int cv2 = iv; // μλ¬. ν΄λμ€λ³μλ μΈμ€ν΄μ€ λ³μλ₯Ό μ¬μ©ν μ μμ.
static int cv2 = new MemberCall().iv; // μ΄μ²λΌ κ°μ²΄λ₯Ό μμ±ν΄μΌ μ¬μ©κ°λ₯.
static void staticMethod1() {
System.out.println(cv);
// System.out.println(iv); // μλ¬. ν΄λμ€λ©μλμμ μΈμ€ν΄μ€λ³μλ₯Ό μ¬μ©λΆκ°.
MemberCall c = new MemberCall();
System.out.println(c.iv); // κ°μ²΄λ₯Ό μμ±ν νμμΌ μΈμ€ν΄μ€λ³μμ μ°Έμ‘°κ°λ₯.
}
void instanceMethod1() {
System.out.println(cv);
System.out.println(iv); // μΈμ€ν΄μ€λ©μλμμλ μΈμ€ν΄μ€λ³μλ₯Ό λ°λ‘ μ¬μ©κ°λ₯.
}
static void staticMethod2() {
staticMethod1();
// instanceMethod1(); // μλ¬. ν΄λμ€λ©μλμμλ μΈμ€ν΄μ€λ©μλλ₯Ό νΈμΆν μ μμ.
MemberCall c = new MemberCall();
c.instanceMethod1(); // μΈμ€ν΄μ€λ₯Ό μμ±ν νμμΌ νΈμΆν μ μμ.
}
void instanceMethod2() { // μΈμ€ν΄μ€λ©μλμμλ μΈμ€ν΄μ€λ©μλμ ν΄λμ€λ©μλ
staticMethod1(); // λͺ¨λ μΈμ€ν΄μ€ μμ±μμ΄ λ°λ‘ νΈμΆμ΄ κ°λ₯νλ€.
instanceMethod1();
}
}
ν΄λμ€ λ©€λ²(ν΄λμ€ λ³μμ ν΄λμ€ λ©μλ)λ μΈμ λ μ°Έμ‘° λλ νΈμΆμ΄ κ°λ₯νκΈ° λλ¬Έμ μΈμ€ν΄μ€ λ©€λ²κ° ν΄λμ€ λ©€λ²λ₯Ό μ¬μ©νλ κ²μ μλ¬΄λ° λ¬Έμ κ° λμ§ μμ΅λλ€. ν΄λμ€ λ©€λ² κ°μ μ°Έμ‘° λλ νΈμΆ μμ μλ¬΄λ° λ¬Έμ κ° μμ΅λλ€.
κ·Έλ¬λ, μΈμ€ν΄μ€ λ©€λ²(μΈμ€ν΄μ€ λ³μμ μΈμ€ν΄μ€ λ©μλ)λ λ°λμ κ°μ²΄λ₯Ό μμ±ν νμλ§ μ°Έμ‘° λλ νΈμΆμ΄ κ°λ₯νκΈ° λλ¬Έμ ν΄λμ€ λ©€λ²κ° μΈμ€ν΄μ€ λ©€λ²λ₯Ό μ°Έμ‘°, νΈμΆνκΈ° μν΄μλ κ°μ²΄λ₯Ό μμ±νμ¬μΌ ν©λλ€.
νμ§λ§, μΈμ€ν΄μ€ λ©€λ² κ°μ νΈμΆμλ μλ¬΄λ° λ¬Έμ κ° μμ΅λλ€. νλμ μΈμ€ν΄μ€ λ©€λ²κ° μ‘΄μ¬νλ€λ κ²μ μΈμ€ν΄μ€κ° μ΄λ―Έ μμ±λμλ€λ κ²μ μλ―Ένλ©°, μ¦ λ€λ₯Έ μΈμ€ν΄μ€ λ©€λ²λ€λ λͺ¨λ μ‘΄μ¬νκΈ° λλ¬Έμ λλ€.