정의
클래스, 메소드, 변수 등에 적용되어 접근 범위나 특정한 동작 방식을 정의함
접근 제어자 기타 제어 클래스, 필드, 메서드에 대한 접근 범위를 제어 멤버의 특성을 정의해 멀티스레딩, 상속, 직렬화 등을 제어
👉 제어자를 적절히 활용하면 캡슐화와 멀티스레드 안전성을 강화할 수 있음
1. 접근 제어자 (Access Modifiers)
- 클래스와 멤버(변수, 메서드)에 대한 접근 범위를 제어
- 총 4가지 종류가 있음
제어자 동일 클래스 동일 패키지 자식 클래스
(다른 패키지)모든 외부 클래스 public O O O O protected O O O X (default) O O X X private O X X X
1) public
- 어디서든 접근 가능
- 클래스, 메서드, 필드에 사용 가능
class Parent { protected int number = 42; } class Child extends Parent { public void printNumber() { System.out.println(number); } }
2) protected
- 동일 패키지나 상속 관계에서 접근 가능
- 클래스에는 사용할 수 없고, 필드와 메서드에만 사용
class Parent { protected int number = 42; } class Child extends Parent { public void printNumber() { System.out.println(number); } }3) default (아무 것도 명시하지 않을 때)
- 동일 패키지 내에서만 접근 가능
- 패키지 프라이빗(package-private)이라고도 불림
class Example { int value = 5; // default 접근 제어자 }
4) private
- 동일 클래스 내에서만 접근 가능
- 주로 캡슐화(Encapsulation)를 위해 사용
class Example { private int secret = 99; private void displaySecret() { System.out.println(secret); } }
2. 기타 제어자(Non-Access Modifiers)
- 멤버 또는 클래스의 특성을 정의
1) static
- 클래스에 속하는 멤버로, 인스턴스 없이 접근 가능
class Example { static int counter = 0; static void increment() { counter++; } }2) final
- 변경 불가를 의미
- 클래스: 상속 불가
- 메서드: 오버라이딩 불가
- 변수: 초기화 후 변경 불가
final class Example {} // 상속 불가 class Example2 { final int value = 10; final void show() { // 오버라이딩 불가 System.out.println("Final method"); } }3) abstract
- 클래스: 인스턴스화 불가한 추상 클래스
- 메서드: 구현 없이 선언만 하는 메서드
abstract class Animal { abstract void sound(); } class Dog extends Animal { @Override void sound() { System.out.println("Bark"); } }
4) synchronized
- 멀티스레딩 환경에서 한 번에 하나의 스레드만 접근할 수 있도록 보장class Example { synchronized void printNumbers() { for (int i = 1; i <= 5; i++) { System.out.println(i); } } }5) volatile
- 변수의 값이 캐싱되지 않고, 항상 메인 메모리에서 읽고 씀을 보장
class Example { volatile boolean flag = true; }
6) transient
- 직렬화 시 제외할 멤버에 사용
class Example implements java.io.Serializable { transient int tempData; // 직렬화되지 않음 }
사용 예시
다양한 제어자의 조합 사용 예시
public class Example { private static final int MAX_COUNT = 100; // 클래스 상수 public synchronized void increment() { // synchronized로 멀티스레드 환경에서 안전하게 처리 } }
비고
1. 시간 될 때 각 제어자마다 좀 더 뜯어보면 좋겠다. (Java 교재 등)
레퍼런스
1. 멘토링 강의, 구글링, 코드 예시의 경우 ChatGPT
'개발지식 조각 > Java' 카테고리의 다른 글
| [Java] IllegalArgumentException (0) | 2024.10.23 |
|---|---|
| 오버라이딩(Overriding) (0) | 2024.10.23 |
| 상수(Constant) (0) | 2024.10.23 |
| 리터럴(Literal) (0) | 2024.10.22 |
| Google Java Style Guide & 우테코 자바 스타일 가이드 (0) | 2024.10.17 |