Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java) 접근 제어자와 비접근 제어자의 차이점 완벽 정리

자바 프로그래밍에서 제어자(Modifier)는 클래스, 변수, 메서드, 생성자 등에 추가적인 의미나 규칙을 부여하는 키워드입니다. 제어자는 크게 접근 제어자(Access Modifiers)비접근 제어자(Non-access Modifiers)로 나눌 수 있습니다. 두 제어자의 차이점과 각각의 특징을 자세히 살펴보겠습니다.


1. 접근 제어자(Access Modifiers)

접근 제어자는 클래스, 변수, 메서드, 생성자에 함께 사용되는 키워드로, 해당 멤버에 어디까지 접근할 수 있는지(접근 범위)를 결정합니다. 자바에는 다음과 같이 네 가지 접근 제어자가 있습니다.

  • default (기본 접근 제어자)

    접근 제어자를 아무것도 명시하지 않으면 자동으로 default가 적용됩니다. 이 경우 같은 패키지(package) 내부에서만 접근할 수 있으며, 다른 패키지에서는 접근이 허용되지 않습니다.
  • public

    접근 범위가 가장 넓은 제어자입니다. 같은 프로젝트 내 어디에서든, 심지어 다른 패키지에 속한 클래스에서도 자유롭게 접근할 수 있습니다.
  • private

    접근 범위가 가장 좁은 제어자입니다. 오직 선언된 클래스 내부에서만 접근할 수 있으며, 외부 클래스에서는 접근할 수 없습니다. 주로 객체의 내부 데이터를 보호하는 캡슐화(Encapsulation)에 활용됩니다.
  • protected

    같은 패키지 내의 모든 클래스와, 패키지가 달라도 해당 클래스를 상속받은 하위(자식) 클래스에서 접근할 수 있습니다.

접근 범위 비교 요약

접근 범위를 넓은 순서로 정리하면 public > protected > default > private 순입니다.


2. 비접근 제어자(Non-access Modifiers)

비접근 제어자는 접근 수준과는 직접적인 관련이 없으며, 키워드를 지정함으로써 특별한 기능이나 동작 방식을 부여하는 역할을 합니다. 대표적인 비접근 제어자는 다음과 같습니다.

  • final

    변수, 메서드, 클래스에 모두 사용할 수 있으며, 대상의 변경을 금지합니다. 변수에 선언하면 상수처럼 값을 변경할 수 없고, 메서드에 선언하면 오버라이딩이 불가능하며, 클래스에 선언하면 상속 자체가 차단됩니다.
  • static

    클래스 변수와 클래스 메서드에 사용되며, 인스턴스(객체)를 생성하지 않고도 접근할 수 있습니다. static 변수는 메모리에 단 하나만 존재하며, 모든 객체가 이 저장 공간을 공유합니다. static 메서드의 대표적인 예로는 프로그램의 시작점인 main() 메서드가 있습니다. 또한 static 블록도 선언할 수 있으며, 이 블록은 main() 메서드보다 먼저 실행됩니다.
  • abstract

    클래스와 메서드에 사용할 수 있습니다. 추상(abstract) 클래스는 인스턴스화할 수 없으며, 오직 상속을 통해 확장되는 것만을 목적으로 합니다. 추상 메서드는 구현부(몸통) 없이 선언만 되며 세미콜론(;)으로 끝납니다. 클래스 안에 추상 메서드가 하나라도 있다면 그 클래스 역시 반드시 abstract로 선언해야 하며, 추상 클래스를 상속받는 클래스는 모든 추상 메서드를 반드시 구현(오버라이딩)해야 합니다.
  • synchronized

    메서드에 사용되며, 여러 스레드가 동시에 접근하는 것을 방지합니다. 즉, 해당 메서드는 한 번에 하나의 스레드만 실행할 수 있어 멀티스레드 환경에서 데이터 일관성을 유지하는 데 도움을 줍니다.
  • transient

    인스턴스 변수에 사용되며, 직렬화(Serialization) 과정에서 JVM에게 해당 변수를 제외하도록 지시합니다. 보안상 노출되면 안 되는 데이터나 직렬화가 필요 없는 필드에 주로 적용됩니다.
  • volatile

    변수를 "메인 메모리에 저장"하도록 표시하는 키워드입니다. volatile 변수를 읽을 때는 CPU 캐시가 아닌 메인 메모리에서 직접 읽고, 쓸 때도 메인 메모리에 바로 기록합니다. 이를 통해 멀티스레드 환경에서 모든 스레드가 항상 최신 값을 참조하도록 보장합니다.
  • strictfp

    부동소수점(floating-point) 연산을 수행할 때 CPU 종류나 운영체제와 관계없이 모든 플랫폼에서 동일한 결과값을 얻도록 보장하는 키워드입니다.

마무리 정리

접근 제어자는 멤버의 접근 가능 범위를 결정하고, 비접근 제어자는 접근 범위와 무관하게 특별한 기능을 부여한다는 것이 핵심 차이입니다. 두 제어자는 서로 조합하여 사용할 수도 있는데, 예를 들어 public static final처럼 접근 제어자 하나와 비접근 제어자 여러 개를 함께 붙여 사용할 수 있습니다. 각 제어자의 특성을 정확히 이해하고 상황에 맞게 활용하면 더 안전하고 견고한 자바 코드를 작성할 수 있습니다.