정의

클래스, 메소드, 변수 등에 적용되어 접근 범위나 특정한 동작 방식을 정의함

접근 제어자 기타 제어
클래스, 필드, 메서드에 대한 접근 범위를 제어 멤버의 특성을 정의해 멀티스레딩, 상속, 직렬화 등을 제어

👉 제어자를 적절히 활용하면 캡슐화와 멀티스레드 안전성을 강화할 수 있음


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

+ Recent posts