πŸ“’ Language/πŸ“ Java

[Java] μ œμ–΄μž(modifier)-μ ‘κ·Ό μ œμ–΄μž/κ·Έ μ™Έ μ œμ–΄μž

dana4056 2022. 3. 9. 00:22
320x100

μ œμ–΄μž

λ³€μˆ˜, λ©”μ†Œλ“œ, 클래슀 선언뢀에 ν‘œμ‹œλ˜μ–΄ 뢀가적인 의미λ₯Ό λΆ€μ—¬ν•˜λŠ” ν‚€μ›Œλ“œλ₯Ό λ§ν•œλ‹€. 

μ œμ–΄μž μ’…λ₯˜

μ œμ–΄μžλŠ” μ ‘κ·Ό μ œμ–΄μžμ™€ κ·Έ μ™Έμ˜ μ œμ–΄μž, 두 κ°€μ§€ μ’…λ₯˜λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€. 적용이 λ˜λŠ” ν•˜λ‚˜μ˜ λŒ€μƒμ— μ—¬λŸ¬ μ œμ–΄μžλ₯Ό μ‘°ν•©ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλŠ”λ°, μ ‘κ·Ό μ œμ–΄μžλŠ” ν•˜λ‚˜λ§Œ μ„ νƒν•΄μ„œ μ‚¬μš©ν•΄μ•Όν•œλ‹€.  

 


μ ‘κ·Ό μ œμ–΄μž(access modifier)

클래슀, 멀버 λ³€μˆ˜, λ©”μ†Œλ“œ, μƒμ„±μžμ— μ‚¬μš©λ˜λ©°  ν•΄λ‹Ή λ©€λ²„λ‚˜ ν΄λž˜μŠ€μ— μ ‘κ·Ό κ°€λŠ₯ν•œ μ™ΈλΆ€ λ²”μœ„λ₯Ό μ§€μ •ν•˜λŠ” 역할을 ν•œλ‹€. (즉, ν•΄λ‹Ή λ©€λ²„λ‚˜ 클래슀λ₯Ό μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 μ œν•œ) 보톡 μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” 클래슀 내뢀에 μ„ μ–Έλœ 멀버 데이터λ₯Ό λ³΄ν˜Έν•˜κΈ° μœ„ν•¨μ΄λ‹€. 

public   protected   default   private

μ ‘κ·Ό μ œμ–΄μž λ²”μœ„(μ ‘κ·Ό λ²”μœ„ 넓은 순)
public  μ ‘κ·Ό μ œν•œμ΄ μ—†μŒ (μ™ΈλΆ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯)
protected  κ°™μ€ νŒ¨ν‚€μ§€ λ‚΄μ—μ„œ μ ‘κ·Ό κ°€λŠ₯ / λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ μžμ†ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯
(default)  κ°™μ€ νŒ¨ν‚€μ§€ λ‚΄μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯
private  κ°™μ€ 클래슀 λ‚΄μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯

default
defaultλŠ” μ‹€μ œλ‘œ ν‚€μ›Œλ“œλ₯Ό ν΄λž˜μŠ€λ‚˜ 멀버 μ•žμ— κΈ°μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.


κ·Έ μ™Έ μ œμ–΄μž

static

'정적',β€˜κ³ μ •λœβ€™μ΄λΌκ³  ν•΄μ„λ˜λ©°, '클래슀의' λ˜λŠ” '곡톡적인'μ΄λž€ 의미λ₯Ό μ§€λ‹ˆκ³  μžˆλŠ” μ œμ–΄μžλ‹€. ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ  λ•Œ static ν‚€μ›Œλ“œκ°€ 뢙은 멀버 λ³€μˆ˜λ‚˜ λ©”μ†Œλ“œλŠ” λ©”λͺ¨λ¦¬μ— 처음 ν•œ 번 ν• λ‹Ήλ˜κ³  ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ  λ•ŒκΉŒμ§€ κ·Έ λ©”λͺ¨λ¦¬μ— 값이 μœ μ§€λœλ‹€. λ”°λΌμ„œ ν•΄λ‹Ή 클래슀의 λͺ¨λ“  μΈμŠ€ν„΄μŠ€λŠ” κ·Έ λ©”λͺ¨λ¦¬ 곡간을 κ³΅μœ ν•˜μ—¬ μ ‘κ·Όν•œλ‹€. static이 뢙은 멀버 λ³€μˆ˜μ™€ λ©”μ†Œλ“œλŠ” μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ ν΄λž˜μŠ€μ— κ΄€κ³„λœ 것이기 λ•Œλ¬Έμ— ν•΄λ‹Ή 클래슀의 λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ— κ³΅ν†΅μ μœΌλ‘œ 적용이되며, μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ μ‚¬μš©ν•  수 μžˆλ‹€. λ°˜λŒ€λ‘œ ν΄λž˜μŠ€μ— μ„ μ–Έλœ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•΄μ•Όλ§Œ ν˜ΈμΆœν•  수 μžˆλŠ” λ³€μˆ˜λ‘œ 각 μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ λ…λ¦½λœ λ©”λͺ¨λ¦¬μ— μ μž¬λœλ‹€. 

class TestClass{
    static int classVar = 10; // staticλ³€μˆ˜, static ν•„λ“œ, ν΄λž˜μŠ€λ³€μˆ˜
    int instanceVar = 20;     // μΈμŠ€ν„΄μŠ€λ³€μˆ˜

    public static void StaticPrint(){
        //System.out.println("Static Method"+"i:"+instanceVar); //μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 직접 μ‚¬μš© λΆˆκ°€
        System.out.println("Static Method" + "  s:" + classVar);
    }

    public void InstancePrint(){
        System.out.println("Instance Method" + "  s:" + classVar + "  i:" + instanceVar);
    }
}

public class StaticTest {
    public static void main(String[] args) {
        TestClass.StaticPrint();      // "Static Method  s:10"
        //TestClass.InstancePrint();  // μΈμŠ€ν„΄μŠ€ 생성 없이 호좜 λΆˆκ°€

        TestClass t1 = new TestClass();
        TestClass t2 = new TestClass();

        t1.classVar = 15;
        t1.instanceVar = 25;

        t2.classVar = 20;
        t2.instanceVar = 30;

        t1.InstancePrint();  // "Instance Method  s:20  i:25"
        t2.InstancePrint();  // "Instance Method  s:20  i:30"
    }
}
정리

staticλ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€ 생성 없이 호좜 κ°€λŠ₯
staticλ©”μ„œλ“œμ—μ„œλŠ” μΈμŠ€ν„΄μŠ€ 멀버 직접 μ‚¬μš© λΆˆκ°€
:ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ˜λŠ” μ‹œμ μ—μ„œλŠ” 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ§€ μ•Šμ•„μ„œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.
클래슀의 μΈμŠ€ν„΄μŠ€λ“€μ€ static λ³€μˆ˜ μ‚¬μš©ν•  λ•Œ ν•˜λ‚˜μ˜ λ©”λͺ¨λ¦¬μ— μ ‘κ·Ό(λ©”λͺ¨λ¦¬ 곡유)

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
클래슀 μ˜μ—­μ—μ„œ μ„ μ–Έλ˜λ©°, ν•΄λ‹Ή 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ–„  λ§Œλ“€μ–΄μ§€λŠ” λ³€μˆ˜

클래슀 λ³€μˆ˜
λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅ν†΅μ μœΌλ‘œ 같은 값을 μœ μ§€ν•΄μ•Όν•˜λŠ” λ³€μˆ˜
클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ 'ν΄λž˜μŠ€μ΄λ¦„.ν΄λž˜μŠ€λ³€μˆ˜'와 같은 λ°©μ‹μœΌλ‘œ μ‚¬μš© κ°€λŠ₯
ν•˜λ‚˜μ˜ μ €μž₯곡간을 κ°€μ§€λ©° λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ·Έ μ €μž₯곡간을 κ³΅μœ ν•˜μ—¬ 항상 κ³΅ν†΅μ˜ 값을 κ°–μŒ


final

β€œλ³€κ²½λ  수 μ—†λŠ”β€ μ΄λΌλŠ” 의미λ₯Ό κ°€μ§„ μ œμ–΄μžμ΄λ‹€. ν΄λž˜μŠ€μ— 적용되면 변경될 수 μ—†κ³  ν™•μž₯될 수 μ—†λŠ” ν΄λž˜μŠ€κ°€ λœλ‹€. ν™•μž₯이 λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 건 λ‹€λ₯Έ 클래슀의 쑰상 ν΄λž˜μŠ€κ°€ 될 수 μ—†λ‹€λŠ” λœ»μ΄λ‹€. λ©”μ„œλ“œμ— 적용이 되면 μ˜€λ²„λΌμ΄λ”©μ„ 톡해 μž¬μ •μ˜ 될 수 μ—†λŠ” λ©”μ„œλ“œκ°€ λœλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ λ³€μˆ˜(λ©€λ²„λ³€μˆ˜, μ§€μ—­λ³€μˆ˜)에 적용이되면 값을 λ³€κ²½ν•  수 μ—†λŠ” μƒμˆ˜κ°€ λœλ‹€. λ§Œμ•½ μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ λ‹€λ₯Έ 값을 κ°€μ§„ final λ³€μˆ˜λ₯Ό μƒμ„±ν•˜κ³  μ‹ΆμœΌλ©΄ final λ³€μˆ˜λ₯Ό μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ‘œ μ„ μ–Έν•˜κ³ , μƒμ„±μžλ₯Ό 톡해 μ΄ˆκΈ°ν™”ν•˜λ©΄ λœλ‹€.

μ μš©λŒ€μƒ 의미
클래슀  λ³€κ²½ λΆˆκ°€, ν™•μž₯ λΆˆκ°€ 클래슀
λ©”μ„œλ“œ  μ˜€λ²„라이딩 ν†΅ν•œ μž¬μ •μ˜ λΆˆκ°€
λ³€μˆ˜  κ°’ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ μƒμˆ˜

abstract

β€˜μΆ”μƒμ μΈβ€™, β€˜λ―Έμ™„μ„±μ˜β€™λΌλŠ” λœ»μ„ κ°€μ§„ μ œμ–΄μžλ‘œ μ„ μ–ΈλΆ€λ§Œ 있고 κ΅¬ν˜„λΆ€κ°€ μ—†λŠ” μΆ”μƒλ©”μ†Œλ“œλ₯Ό μ„ μ–Έν•˜λŠ”λ°μ— μ‚¬μš©ν•œλ‹€. ν΄λž˜μŠ€μ— 적용되면 ν•˜λ‚˜ μ΄μƒμ˜ 좔상 λ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” μΆ”μƒν΄λž˜μŠ€λ₯Ό μ˜λ―Έν•œλ‹€. 좔상 ν΄λž˜μŠ€λŠ” λ―Έμ™„μ„±μ˜ λ©”μ†Œλ“œκ°€ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†λ‹€. 좔상 λ©”μ†Œλ“œκ°€ μ—†λŠ” ν΄λž˜μŠ€μ—λ„ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ λͺ»ν•˜κ²Œ abstractλ₯Ό λΆ™μ—¬ 좔상 클래슀둜 μΌλΆ€λŸ¬ λ§Œλ“œλŠ” κ²½μš°λ„ μžˆλ‹€.

λ°˜μ‘ν˜•