[JAVA] static, final 차이


Contents


static

멀버λ₯Ό μ„ μ–Έν•  λ•ŒλŠ” μΈμŠ€ν„΄μŠ€ 멀버와 클래슀 λ©€λ²„λ‘œ μ„ μ–Έν•  수 μžˆλ‹€.

  • μΈμŠ€ν„΄μŠ€ 멀버 : 객체가 λ§Œλ“€μ–΄μ Έμ•Ό μƒκΈ°λŠ” 멀버듀
    • 객체(μΈμŠ€ν„΄μŠ€)κ°€ μƒμ„±λ˜λ©΄ κ°μ²΄λ§ˆλ‹€ μžλ™μœΌλ‘œ μƒμ„±λ˜λŠ” 멀버
    • κ°μ²΄λ§ˆλ‹€ κ°œλ³„μ μœΌλ‘œ κ°€μ Έλ˜λŠ” 속성일 λ•Œ μ„ μ–Έν•œλ‹€.
  • 클래슀 멀버 = static 멀버 : μΈμŠ€ν„΄μŠ€μ™€ 상관없이 μ‚¬μš©μ΄ κ°€λŠ₯ν•œ 멀버
    • ν΄λž˜μŠ€κ°€ λ‘œλ”©λ˜λ©΄ μžλ™μœΌλ‘œ μƒμ„±λœλ‹€.
    • 각 κ°μ²΄λ§ˆλ‹€ μ‘΄μž¬ν•  ν•„μš”κ°€ μ—†κ³  λͺ¨λ“  객체가 ν•˜λ‚˜μ˜ κ³΅ν†΅λœ 속성을 κ°€μ§ˆ κ²½μš°μ— μ„ μ–Έν•œλ‹€.
    • 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ 클래슀λͺ…μœΌλ‘œ λ°”λ‘œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

static λ³€μˆ˜

static ν‚€μ›Œλ“œλ₯Ό 톡해 μƒμ„±ν•œ λ³€μˆ˜λŠ” κΈ°μšΈμ–΄μ Έμ„œ ν‘œκΈ°λœλ‹€.

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— thisλ₯Ό 톡해 ꡬ별이 κ°€λŠ₯ν•˜λ‹€.

클래슀 λ©€λ²„λŠ” ν•œ ν΄λž˜μŠ€μ— ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— this둜 κ΅¬λΆ„ν•˜μ§€ μ•ŠλŠ”λ‹€.
ν•˜μ§€λ§Œ 클래슀 멀버에 thisλ₯Ό μ‚¬μš©ν•΄λ„ μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

class Ex {
    int a; // μΈμŠ€ν„΄νŠΈ λ³€μˆ˜
    static int b; // 클래슀 λ³€μˆ˜

    void print(){
        System.out.println("a: " + this.a + ", b: " + b);
        // this.b둜 μ‚¬μš©ν•΄λ„ μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠμŒ
    }
}

System.out.println(Ex.b); // 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ 객체둜 λ°”λ‘œ 접근이 κ°€λŠ₯


static λ©”μ„œλ“œ

클래슀만 λ‘œλ”©λœ μƒνƒœμ—λŠ” μΈμŠ€ν„΄μŠ€ 멀버가 μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— static 멀버가 μΈμŠ€ν„΄μŠ€ 멀버에 μ ‘κ·Όν•  경우 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

μΈμŠ€ν„΄μŠ€ 멀버와 클래슀 λ©€λ²„λŠ” λ©”λͺ¨λ¦¬μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•œ μ‹œμ μ΄ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— ν•¨κ»˜ μ‚¬μš©μ΄ λΆˆκ°€λŠ₯ν•˜λ‹€.

(μΈμŠ€ν„΄μŠ€ 멀버가 μ„ μ–Έλ˜κΈ° μ „μ—λŠ”) static λ©”μ„œλ“œλŠ” 였직 static λ©€λ²„λ§Œ μ ‘κ·Όν•  수 μžˆλ‹€.

class Test {
    int a;
    static int b;

    static int getB() {
        return Test.b;
    }

    // μΈμŠ€ν„΄μŠ€ λ³€μˆ˜κ°€ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
    static int getAB() {
        return a + b;
    }
}




final

final ν‚€μ›Œλ“œλŠ” 클래슀, λ©”μ†Œλ“œ, ν•„λ“œμ— 뢙일 수 μžˆλ‹€.

  • final 클래슀 : 상속이 λΆˆκ°€λŠ₯ν•œ 클래슀
  • final λ©”μ†Œλ“œ : μž¬μ •μ˜(μ˜€λ²„λΌμ΄λ”©)κ°€ λΆˆκ°€λŠ₯ν•œ λ©”μ†Œλ“œ
  • final ν•„λ“œ : μƒμˆ˜ μ„ μ–Έ

final 클래슀

final둜 μ„ μ–Έλœ ν΄λž˜μŠ€λŠ” 상속이 λΆˆκ°€λŠ₯ν•˜λ‹€.

final class A { ... }

class ASub extends A { ... }

μœ„μ™€ 같이 μž‘μ„±ν•  경우 μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ λ‹€μŒκ³Ό 같은 문ꡬ가 λ‚˜μ˜¨λ‹€.

The type ASub cannot subclass the final class A


final λ©”μ†Œλ“œ

class B {
    final void method() {
        System.out.println("hi");
    }
}

class BSub extends B {
    void method() {
        System.out.println("bye");
    }
}

B 클래슀λ₯Ό μƒμ†λ°›λŠ” BSub 클래슀λ₯Ό μƒμ„±ν•œ λ’€ B ν΄λž˜μŠ€μ— method λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©μ„ μ˜€λ²„λΌμ΄λ”© ν•΄λ³΄μ•˜λ‹€.

ν•˜μ§€λ§Œ method λ©”μ†Œλ“œλŠ” final둜 μ„ μ–Έλ˜μ—ˆκΈ° λ•Œλ¬Έμ— μž¬μ •μ˜κ°€ λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

final ν•„λ“œ

ν•„λ“œλ₯Ό final둜 μ„ μ–Έν•˜λ©΄ μƒμˆ˜κ°€ λœλ‹€.

class C {
    final int A = 2;    
}