개발/Java

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

daramii 2022. 2. 20. 22:36

 

 

μ•ˆλ…•ν•˜μ„Έμš”, λͺ½λ°λΈŒμž…λ‹ˆλ‹€.

이번 μ‹œκ°„μ—λŠ” 'μ ‘κ·Όμ œμ–΄μž(access modifier)'에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

처음 μžλ°”λ₯Ό 배울 λ•Œ, ꡉμž₯히 λ³΅μž‘ν•˜κ²Œλ§Œ 느껴쑌던 기얡이 λ‚˜λ„€μš”.

μš”μ¦˜ κΈ°μ΄ˆμ— μ†Œν™€ν–ˆλ˜ 것 κ°™μ•„μ„œ, μ—¬λŸ¬κ°€μ§€ 기초 κ°œλ…λ“€μ„ λ‹€μ‹œ λ³΄λŠ” 쀑에 μžˆμŠ΅λ‹ˆλ‹€.

 

μ—­μ‹œ 이런 기초적인 κ°œλ…μ€ 처음 곡뢀할 λ•Œ, μ œλŒ€λ‘œ μž‘μ•„λ‘λŠ” 것이 쒋은 것 κ°™μŠ΅λ‹ˆλ‹€ :)

 

 

 

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


μ ‘κ·Ό μ œμ–΄μž (access modifier)
μ ‘κ·Ό μ œμ–΄μžλŠ” 멀버 λ³€μˆ˜/ν•¨μˆ˜ ν˜Ήμ€ ν΄λž˜μŠ€μ— μ‚¬μš©λ˜λ©° μ™ΈλΆ€μ—μ„œμ˜ 접근을 μ œν•œν•˜λŠ” μ—­ν• 

 

 

- private : 같은 클래슀 λ‚΄μ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€
- default(nothing) : 같은 νŒ¨ν‚€μ§€ λ‚΄μ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
- protected : 같은 νŒ¨ν‚€μ§€ λ‚΄μ—μ„œ, 그리고 λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ μžμ†ν΄λž˜μŠ€μ—μ„œ 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
- public : μ ‘κ·Ό μ œν•œμ΄ μ „ν˜€ μ—†μŠ΅λ‹ˆλ‹€.

 

μ ‘κ·Ό λ²”μœ„ : (쒁음) private → default → protected → public (λ„“μŒ)

 

 

 

그럼 예제둜 μžμ„Έν•˜κ²Œ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€ :D 

 

예제 확인


νŒ¨ν‚€μ§€ ꡬ쑰

 

λ¨Όμ €, java 폴더 μ•ˆμ— AcceccModifierλΌλŠ” νŒ¨ν‚€μ§€λ₯Ό λ§Œλ“€μ–΄μ„œ, AcceccModifierTest.java ν΄λž˜μŠ€νŒŒμΌμ„ λ§Œλ“€μ–΄ μ€λ‹ˆλ‹€. μ—¬κΈ° 클래슀 νŒŒμΌμ—λŠ” ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ private, public, protected둜 각각 μ„ μ–Έν•˜μ—¬ λ©”μ„œλ“œλ₯Ό λ§Œλ“€μ–΄μ£Όκ² μŠ΅λ‹ˆλ‹€.

 

AccessModifierTest.java

package AccessModifier;

public class AccessModifierTest {

    private void privateM() {
    	System.out.println("private modifier");
    }
    
    public void publicM() {
        System.out.println("public modifier");
        privateM();
    }
    
    protected void protectedM() {
    	System.out.println("protected modifier");
    }

}

 

 

이제 ν…ŒμŠ€νŠΈ 진행을 μœ„ν•΄ Main.java둜 μ΄λ™ν•˜μ—¬, λ‹€μŒκ³Ό 같이 μ½”λ“œλ₯Ό μ§œκ² μŠ΅λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ μ„€λͺ…은 μ£Όμ„μœΌλ‘œ λŒ€μ²΄ν•˜κ² μŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ ChildλŠ” protected의 κ°œλ…μ„ μ„€λͺ…ν•˜κΈ° μœ„ν•΄ AccessModifierTestλΌλŠ” λΆ€λͺ¨ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속을 λ°›κ² μŠ΅λ‹ˆλ‹€.

 

Main.java

import AccessModifier.AccessModifierTest;

class Child extends AccessModifierTest {
	//void μ•žμ— 아무것도 μ—†μœΌλ©΄ default둜 같은 νŒ¨ν‚€μ§€ λ‚΄μ—μ„œλ§Œ μ ‘κ·Όκ°€λŠ₯.
    void callParentProtectedMethod() {
        System.out.println("Call my parent's protected method");
        super.protectedM(); //superλ₯Ό 톡해 λΆ€λͺ¨μ˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.-> protected : 같은 νŒ¨ν‚€μ§€ λ‚΄, λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ μžμ†ν΄λ ˆμŠ€μ—μ„œλ§Œ
    }
}

public class Main {

    public static void main(String[] args) {
    
        AccessModifierTest accessModifierTest = new AccessModifierTest();
        accessModifierTest.outsideM();
        // accessModifierTest.insideM(); // compile error -> private : 같은 클래슀 λ‚΄μ—μ„œλ§Œ
        // accessModifierTest.protectedM(); // compile error -> protected : 같은 νŒ¨ν‚€μ§€ λ‚΄, λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ μžμ†ν΄λ ˆμŠ€μ—μ„œλ§Œ
        Child child = new Child();
        child.callParentProtectedMember();
    }
    
}

 

κ°„λ‹¨ν•œ κ°œλ…μ΄λΌ, 주석 이외에 크게 μ„€λͺ…ν•  뢀뢄은 μ—†μŠ΅λ‹ˆλ‹€. μ½”λ“œλ₯Ό 직접 μ μ–΄λ³΄μ‹œκ³  μ»΄νŒŒμΌν•΄λ³΄μ‹œλ©΄μ„œ ν™•μΈν•˜λ©΄ 쒀더 ν•™μŠ΅ν•˜μ‹œλŠ”λ° 도움이 될 것 κ°™μŠ΅λ‹ˆλ‹€.

 

 

κ·Έλ ‡λ‹€λ©΄, κ·Έλƒ₯ public λ‹€ μ„ μ–Έν•˜κ³  νŽΈν•˜κ²Œ μ“°λ©΄ 쒋을텐데, μ΄λ ‡κ²Œ λ³΅μž‘ν•˜κ²Œλ§Œ λŠκ»΄μ§€λŠ” μ ‘κ·Όμ œμ–΄μžλ₯Ό ꡳ이 μ™œ μ“°λŠ”κ²ƒμΌκΉŒμš”? 

 

 

μ ‘κ·Όμ œμ–΄μžλ₯Ό μ“°λŠ” 이유


- κ°μ²΄λ“€κ°„μ˜ 관계에 λ”°λΌμ„œ μ ‘κ·Ό ν•  수 μžˆλŠ” 것과 μ•„λ‹Œ 것, κΆŒν•œμ„ κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄
- 클래슀 내뢀에 μ„ μ–Έλœ λ°μ΄ν„°μ˜ λΆ€μ μ ˆν•œ μ‚¬μš©μœΌλ‘œλΆ€ν„° λ³΄ν˜Έν•˜κΈ° μœ„ν•΄ -> μΊ‘μŠν™”(encapsulation)

 

객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ 객체듀 κ°„μ˜ μƒν˜Έμž‘μš©μ„ μ½”λ“œλ‘œ ν‘œν˜„ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λ•Œ, κ°μ²΄λ“€κ°„μ˜ 관계에 λ”°λΌμ„œ μ ‘κ·Ό ν•  수 μžˆλŠ” 것과 μ•„λ‹Œ 것에 λŒ€ν•œ κΆŒν•œμ„ ꡬ뢄할 ν•„μš”κ°€ μƒκΉλ‹ˆλ‹€. λ˜ν•œ, 클래슀 내뢀에 μ„ μ–Έλœ λ°μ΄ν„°μ˜ λΆ€μ μ ˆν•œ μ‚¬μš©μœΌλ‘œλΆ€ν„° λ³΄ν˜Έν•˜κΈ° μœ„ν•¨μΈλ°μš”, 이것을 'μΊ‘μŠν™”(encapsulation)'이라고 ν•˜μ£ . 즉, μ ‘κ·Όμ œμ–΄μžλŠ” μ΄λŸ¬ν•œ μΊ‘μŠν™”κ°€ κ°€λŠ₯ν•˜λ„λ‘ λ„μ™€μ£ΌλŠ” 도ꡬ라고 보면 λ˜κ² μŠ΅λ‹ˆλ‹€.

 

 

그럼 λ‹€μŒμ— 또 λ§Œλ‚˜μš” :)