[Java] 접근제어자, static

전두엽힘주기·2025년 10월 12일

Java

목록 보기
6/7

접근제어자

public, private, protected, default

default (Package-Private): 키워드가 아니며, 접근 제어자를 아무것도 명시하지 않았을 때 적용되는 기본 접근 수준

같은 패키지 내에서만 접근이 가능

package

관련있는 클래스 파일(컴파일 된 .class)을 저장하는 디렉터리

접근 지정자의 목적

클래스나 일부 멤버를 공개하여 다른 클래스에서 접근하도록 허용

객체 지향 언어의 캡슐화(Encapsulation) 를 지원하여 멤버(변수, 함수)를 보호하고 정보를 은닉(Information Hiding)하는 것이 핵심 목적

최소 권한의 원칙 (Principle of Least Privilege)

외부에 꼭 필요한 부분만 최소한으로 노출

먼저 모든 멤버를 private으로 선언하고, 필요에 따라 점진적으로 default, protected, public 순으로 공개 범위를 넓히는 것을 권장

데이터 보호 (Data Integrity)

멤버 변수를 private으로 지정하고 public 접근 메소드(Getter/Setter)를 제공함으로써, 변수에 잘못된 값이 저장되는 것을 막을 수 있다.

공개범위

클래스 접근 지정

다른 클래스에서 사용하도록 허용할 지 지정

멤버에 접근하는 클래스private디폴트 접근 지정protectedpublic
같은 패키지의 클래스xooo
다른 패키지의 클래스xxxo
접근가능영역클래스 내동일패키지 내동일패키지와 자식클래스모든클래스

클래스 자체의 접근 지정

최상위 클래스(Top-level Class)는 public 또는 default만 가능

public 클래스는 소스 파일의 이름과 반드시 일치해야 하며, 하나의 소스 파일에 하나만 존재 가능

default(아무것도 안 쓴 경우) 클래스는 같은 패키지 내에서만 객체 생성 및 사용이 가능

private, protected는 최상위 클래스에 사용할 수 없다.
내부 클래스(Inner Class) 는 멤버로 취급되므로 4가지 접근 제어자를 모두 사용할 수 있다.

static vs. non-static

non-static 멤버의 특성

공간적 특성: 멤버들은 객체(인스턴스)마다 독립적으로 별도 존재

인스턴스 멤버 (Instance Member):
new 키워드를 통해 객체가 생성된 후에만 사용할 수 있다. 메모리(Heap 영역)에 객체가 실제 생성되어야 그 안의 인스턴스 멤버도 생성된다.

멤버들은 다른 객체에 의해 공유되지 않고 배타적

static

class Sample{
	static int m;
    static void f(){...}
}

객체마다 생기는 것이 아님.

클래스 당 하나만 생성

객체를 생성하지 않고 사용 가능

클래스당 하나만: static 멤버는 객체에 소속된 정보가 아니라, 클래스 자체에 소속된 정보

클래스가 로딩될 때 공간 할당: JVM(자바 가상 머신)이 프로그램을 실행하기 위해 클래스 정보를 읽어들일 때, 메모리의 Method Area(또는 Static Area)에 단 한 번 공간이 할당되고 프로그램이 끝날 때까지 유지

동일한 클래스의 모든 객체에 의해 공유. 한 객체에서 static 변수의 값을 변경하면 다른 모든 객체에서도 변경된 값을 보게 된다.

static member를 객체의 멤버로 접근하는 사례

static member를 class 이름으로 접근하는 사례

static의 활용

전역변수와 전역함수를 만들때 활용

전역변수나 전역함수는 static으로 클래스에 작성

공유멤버를 작성할 때

static필드나 메소드는 하나만 생성. 클래스의 객체들 공유

static 메소드 제약조건

static 메소드는 non-static 멤버에 접근 불가능

이유: static 메소드는 클래스가 메모리에 로딩될 때 바로 사용 가능하지만, non-static 멤버는 객체가 생성되어야만 존재하기 때문. 객체가 하나도 없는 시점에도 static 메소드는 호출될 수 있으므로, 존재하지 않을 수도 있는 non-static 멤버에는 접근할 수 없다.

static 메소드는 this 사용 불가

이유: this는 "메소드를 호출한 객체 자신"을 가리키는 참조변수. static 메소드는 특정 객체에 소속되어 호출되는 것이 아니라 클래스 이름으로 직접 호출되므로, 가리킬 "객체 자신"이 존재하지 않는다.

final class

  1. final 변수
    상수(Constant)를 선언할 때 사용

상수 필드는 선언 시 또는 생성자에서 초기값을 지정

한 번 값이 할당되면 실행 중 값 변경이 불가능

  1. final 메소드
    오버라이딩(Overriding)이 불가능

자식 클래스가 부모 클래스의 핵심적인 메소드 동작을 임의로 변경하는 것을 막고 싶을 때 사용.

  1. final 클래스
    클래스 상속이 불가능

String 클래스가 대표적인 예로, 다른 클래스가 String을 상속받아 핵심 기능을 변경하는 것을 원천적으로 차단하기 위해 final로 선언

2개의 댓글

comment-user-thumbnail
2025년 10월 12일

중간 고사 파이팅

1개의 답글