[Java] 접근 지정자(Access Level Modifier)

Jaegil Jeong·2022년 3월 2일
0

JAVA

목록 보기
1/1
post-thumbnail

너무나 기초적이지만 두루뭉실하게 알고 있는 개념들이 많은 것 같다.
그 중 하나가 자바의 접근 지정자.
대충 밖에서 쓸거면 public 안에서만 쓸거면 private ~ 하면서 사용해왔던 것 같아서 (나만 그런걸 수도 있다..)

블로그 시작하는 김에 제대로 정리해보려고 한다.

접근 지정자(Access level modifier)란?

Controlling Access to Members of a Class

Access level modifiers determine whether other classes can use a particular field or invoke a particular method. - oracle java document

Java 공식 Document에 따르면, 접근 지정자는 클래스 또는 클래스 내 멤버에 접근 가능한 다른 클래스의 범위를 지정하는 것을 의미한다.

접근 지정자에는 두 계층이 있다.

  • At the top level : public, package-private (no explicit modifier).
  • At the member level: pulbic, private, protected, package-private (no explicit modifier)

Top level modifier

클래스 선언 시 사용되는 지정자로 publicpackage-private 두 종류가 있다.

public으로 지정된 클래스는 어떤 package의 클래스에서든 접근 가능하다.
아래 예시를 보면 쉽게 이해할 수 있다.

package com.example.example.package1;

public class Package1Class {
}
package com.example.package2;

import com.example.example.package1.Package1Class;

public class Package2Class {
	// package2에서 package1에 선언된 클래스를 사용할 수 있다.
    Package1Class c1  = new Package1Class();
}

위 코드와 같이 package1에서 public으로 선언된 Package1Class는 Package2Class에서도 visible한 것을 확인할 수 있다.

package-private는 어떠한 접근 지정자도 명시하지 않는 것이며 같은 package 내에서만 접근 가능함을 의미한다.
아래 코드와 같이 외부 package에서 선언된 package-private 클래스는 visible하지 않기 때문에 선언 시 컴파일 에러가 발생한다.

package com.example.example.package1;

class Package1Class {
}
package com.example.package2;
import com.example.example.package1.Package1Class;

public class Package2Class {
	//컴파일 에러 발생, package-private로 선언된 외부 패키지의 클래스 사용 불가
    Package1Class c1  = new Package1Class();
}

Member level modifier

클래스 내에서 필드 선언 시 사용되는 지정자로 public, private, protected, package-private 네 종류가 있다.

member level에서도 public과 pacakge-private 지정자를 사용할 수 있으며 의미하는 바도 top level과 동일하다.

추가로 privateprotected를 사용할 수 있는데,
그 중 private 지정자는 해당 멤버에 접근 가능한 범위를 같은 클래스로 제한한다.

package com.example.example.package1;

public class Alpha {

    public int a;
    private int b;
    protected int c;

}
package com.example.example.package1;

public class Beta extends Alpha {
    
    Alpha alpha = new Alpha();
    
    int a = alpha.a; //public 선언된 필드로 다른 클래스에서 접근 가능
    int b = alpha.b; //private 선언된 필드로 다른 클래스에서 접근 불가
    int c = alpha.c //Alpha 클래스를 상속한 클래스이므로 protected로 선언된 필드에 접근 가능
}

private으로 선언된 메서드도 마찬가지로 해당 클래스 내에서만 사용이 가능하다.

클래스 내의 변수를 public으로 지정하면 어디서든 해당 변수에 접근, 수정이 가능해서 잘못된 수정이 일어날 수 있다. 게다가 프로젝트 스케일이 커질수록 어디서 수정되었는지 추적하는 것은 매우 어려워진다.
이러한 문제를 사전에 예방하기 위해 멤버 변수를 private으로 선언하는 것이 일반적이다.

protected 지정자는 해당 멤버에 접근 가능한 범위를 해당 클래스를 상속하는 클래스와 같은 패키지 내 클래스로 제한한다.

Access Levels Table

ModifierClassPackageSubclassWorld
publicYYYY
protectedYYYN
no modifierYYNN
privateYNNN

주저리 썼지만 이 표 하나로 정리할 수 있다.


클래스 설계에 있어서 기본적이면서도 중요한 내용을 다뤄봤다.

앞으로 Spring, JPA, 알고리즘, Kafka 등 더 재밌는 백엔드 관련 내용이나 본업인 모빌리티 이야기도 다뤄보려 한다 😁

0개의 댓글