본문 바로가기

Language/Java

[Java] public, private, protected 접근 제어자란?

반응형

Intro

접근 제어자(access modifier)는 클래스, 메소드 변수 등의 멤버에 대한 접근 권한을 제어하는데 사용됩니다.

접근 제어자의 종류는 public, private, protected 가 있으며 예제와 함께 각각의 접근 제어자에 대해서 설명 드리겠습니다.

 

각 접근 제어자에 대한 설명

1) public 접근 제어자

  • 어떤 클래스, 메소드, 변수에서든지 외부에서 접근 할 수 있도록 해줍니다.
public class MyClass {
    public int publicVar;
    
    public void publicMethod() {
        // 메소드
    }
}

위의 예제에서 'MyClass' 클래스는 public으로 선언되어 어떤 클래스에서든 접근할 수 있습니다.

 

2) private 접근 제어자

  • 동일한 클래스 내에서만 접근할 수 있도록 제한합니다. 외부에서 직접 접근할 수 없습니다.
public class MyClass {
    private int privateVar;
    
    private void privateMethod() {
        // 메소드
    }
}

'privateVar' 변수(필드)와 'privateMethod()' 메소드는 private로 선언되어 있기 때문에 클래스 외부에서는 접근 불가합니다.

 

3) protected 접근 제어자

  • 동일한 패키지 내에서와 해당 클래스를 상속받은 하위 클래스에서 접근할 수 있습니다.
package com.example;

public class ParentClass {
    protected int protectedVar;
    
    protected void protectedMethod() {
        // 메소드
    }
}

package com.example;

public class ChildClass extends ParentClass {
    public void accessParentMember() {
        protectedVar = 10; // 상위 클래스의 protected 변수에 접근 가능
        protectedMethod(); // 상위 클래스의 protected 메소드에 접근 가능
    }
}

'ParentClass'와 'ChildClass'의 경우 protected로 동일한 패키지 내에서 접근 가능하며, ChildClass는 ParentClass를 상속 받았기 때문에 접근 가능합니다.

 

4) default 접근 제어자

  • 별도의 접근 제어자를 지정하지 않은 경우 기본적으로 적용되는 접근 제어자입니다. 동일한 패키지 내에서만 접근할 수 있습니다
package com.example;

class DefaultClass {
    int defaultVar;
    
    void defaultMethod() {
        // 메소드
    }
}

 

protected와 default 접근 제어자의 차이

  • 두 접근 제어자 모두 동일한 패키지 내에서 접근이 가능하다는 점은 같지만, 위에서 설명드린 하위 클래스에서 접근 유무여부에서 차이점이 있습니다.
package com.example;

public class ParentClass {
    protected int protectedVar;
    int defaultVar;
    
    protected void protectedMethod() {
        System.out.println("protected method");
    }
    
    void defaultMethod() {
        System.out.println("default method");
    }
}

package com.example;

public class ChildClass extends ParentClass {
    public void accessParentMember() {
        protectedVar = 10; // 상위 클래스의 protected 변수에 접근 가능
        defaultVar = 20; // 상위 클래스의 default 변수에 접근 가능
        protectedMethod(); // 상위 클래스의 protected 메소드에 접근 가능
        defaultMethod(); // 상위 클래스의 default 메소드에 접근 가능
    }
}

package com.example.other;

import com.example.ParentClass;

public class OtherClass {
    public void accessParentMember() {
        ParentClass parent = new ParentClass();
        parent.protectedVar = 10; // 동일한 패키지가 아니므로 protected 변수에 접근 불가
        parent.defaultVar = 20; // 동일한 패키지가 아니므로 default 변수에 접근 불가
        parent.protectedMethod(); // 동일한 패키지가 아니므로 protected 메소드에 접근 불가
        parent.defaultMethod(); // 동일한 패키지가 아니므로 default 메소드에 접근 불가
    }
}

 

주의점

  • public 접근 제어자는 어디서든 접근할 수 있기 때문에 클래스나 멤버를 외부로 노출시키는 것입니다. 이는 정보 은닉과는 반대되는 개념입니다. 정보 은닉은 클래스의 내부 상태를 외부에 감추고, 오직 정의된 인터페이스를 통해서만 접근하도록 제한하는 것입니다. 정보 은닉을 위해 private 접근 제어자를 사용하여 필요한 멤버에만 접근을 허용하고, 외부로부터의 직접적인 접근을 차단하여야 합니다.

  • 접근 제어자의 선택은 클래스나 멤버의 가시성과 보안에 중요한 영향을 미칩니다. 일반적으로는 가장 제한적인 접근 제어자인 private을 우선적으로 사용하여 정보 은닉을 실현하고, 필요에 따라 protected나 default 접근 제어자를 사용하여 제한적인 접근을 허용하는 것이 좋습니다. public 접근 제어자는 외부에서 자유로운 접근을 허용하는 것이기 때문에 신중하게 사용해야 합니다.

  • 접근 제어자를 적절히 활용하면 클래스와 멤버의 가시성을 제어하고, 정보 은닉과 모듈화를 통해 안정성과 유지 보수성을 높일 수 있습니다.
반응형