hanker

JAVA - JAVA에서 접근 제어자란 무엇일까? (public / private / protected / default) 본문

JAVA

JAVA - JAVA에서 접근 제어자란 무엇일까? (public / private / protected / default)

hanker 2024. 11. 30. 01:02
반응형

Java에서 접근 제어자(Access Modifiers)는 클래스, 메서드, 필드 등 구성 요소에 대한 접근 권한을 설정하는 키워드이다.

접근 제어자를 통해 코드의 접근 범위를 제한하거나 허용하여 캡슐화와 보안성을 높일 수 있다. Java에서는 네 가지 접근 제어자를 사용할 수 있는데, public, protected, private, 그리고 default (접근 제어자를 명시하지 않았을 때)가 있다.

 

 

각 접근 제어자의 특징을 알아보자!

 


public

 

범위: 모든 클래스에서 접근 가능.

특징: 해당 멤버가 public으로 선언된 경우, 패키지 내외의 모든 클래스에서 접근할 수 있다. 즉, 전역으로 접근을 허용하는 가장 개방적인 접근 제어자이다.

 

사용 예: 주로 공용 API, 유틸리티 메서드 등 외부에서도 사용해야 하는 경우에 사용한다.

 

예제.

package org.example.test1;

public class PublicEx {

    public int value = 10; // 모든 클래스에서 접근 가능

    public void getValue() {
        System.out.println("value : " + value);
    }
}
package org.example;

import org.example.test1.PublicEx;

public class Main {

    public static void main(String[] args) {
        PublicEx publicEx = new PublicEx();

        publicEx.getValue();
    }

}

 


protected

 

범위: 같은 패키지 내의 클래스 + 상속받은 자식 클래스에서 접근 가능

설명: protected로 선언된 멤버는 동일한 패키지 내의 다른 클래스와 해당 클래스를 상속한 자식 클래스에서도 접근할 수 있다.

이 제어자는 상속 관계에서 자주 사용된다.

 

사용 예: 부모 클래스로부터 상속을 받아 자식 클래스에서만 사용하도록 하는 멤버들에 사용

 

예제.

package org.example.test1;

public class ProtectedEx {
    protected static int value = 10; // 같은 패키지 내 또는 상속받은 클래스에서 접근 가능
    protected static void getValue() {
        System.out.println("ProtectedEx value : " + value);
    }
}
package org.example;

import org.example.test1.ProtectedEx;

public class Main extends ProtectedEx {
    public static void main(String[] args) {
        getValue();
    }
}

 


private

 

범위: 같은 클래스 내에서만 접근 가능

설명: private으로 선언된 멤버는 선언된 클래스 내부에서만 접근할 수 있다.

외부에서는 접근이 불가능하므로, 정보 은닉을 위해 사용된다.

 

사용 예: 클래스 내부의 특정 로직에만 사용해야 하는 필드나 메서드를 숨기기 위해 사용

예를 들어, 객체의 상태를 외부로부터 보호하려는 경우 private를 사용한다.

 

예제.

package org.example.test1;

public class PrivateEx {
    private static int value = 10;
    private static void getValue() {
        System.out.println("private Value : " + value); // 같은 클래스 내에서만 접근 가능
    }

    public static void main(String[] args) {
        getValue();
    }
}

 

Default (접근 제어자를 명시하지 않은 경우)

 

범위: 같은 패키지 내의 클래스에서만 접근 가능.

설명: 접근 제어자를 명시하지 않으면 패키지 전용 접근 수준이 된다.

같은 패키지에 속한 클래스들끼리만 접근할 수 있으며, 다른 패키지에서는 접근할 수 없다.

 

사용 예: 특정 패키지 내에서만 사용할 수 있는 멤버들을 정의할 때 사용한다.

package org.example.test1;

class DefaultEx {
    static int value = 10;

    static void getValue() {
        System.out.println("Default value : " + value); // 같은 클래스 내에서만 접근 가능
    }
}
package org.example.test1;

import static org.example.test1.DefaultEx.getValue; // 같은 패키지 내에서 접근 가능

public class MainEx {

    public static void main(String[] args) {
        getValue();
    }
}

 


정리

 

접근제어자 같은 클래스 같은 패키지 하위 클래스 외부 클래스
public O O O O
protected O O O X
default O O X X
private O X X X

 

이러한 접근 제어자를 적절히 사용함으로써 클래스의 내부 구현을 감추고 외부에 노출할 부분만 명확히 정의할 수 있으며, 이를 통해 객체 지향의 중요한 원칙인 캡슐화를 효과적으로 달성할 수 있다.

 

 

끝.

 

반응형