개발/자바

Java의 private, private static, private static final 차이점

피터JK 2025. 1. 29. 14:12
728x90

 

Java에서 private, private static, private static final의 차이점을 이해하면 보다 효과적인 객체 지향 프로그래밍을 할 수 있습니다. 각각의 개념을 설명하고, 차이점을 정리해 보겠습니다.


1. private (인스턴스 변수 / 메서드)

  • 정의: private 변수나 메서드는 같은 클래스 내부에서만 접근 가능.
  • 인스턴스 변수: 객체마다 개별적인 값을 가질 수 있음.
  • 메서드: 같은 클래스 내부에서만 호출 가능.

예제

class Example {
    private int value; // 객체마다 독립적인 값

    private void display() { // private 메서드
        System.out.println("This is a private method.");
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

특징

  • value는 객체마다 개별적인 값을 유지.
  • display() 메서드는 같은 클래스 내에서만 사용 가능.

2. private static (정적 변수 / 메서드)

  • 정의: 클래스 내부에서만 접근 가능하며, 모든 객체가 공유하는 정적 변수.
  • 특징:
    • static 키워드가 붙으면 객체가 공유하는 단 하나의 값이 됨.
    • 객체 생성 없이도 접근 가능.

예제

class Example {
    private static int count = 0; // 클래스 변수 (모든 객체가 공유)

    private static void increment() { // 클래스 메서드
        count++;
    }

    public static void increase() {
        increment();
    }

    public static int getCount() {
        return count;
    }
}

특징

  • count 변수는 모든 객체가 공유하는 값.
  • increment() 메서드는 클래스 내부에서만 사용 가능.
  • increase()를 통해 count 값을 증가시킬 수 있음.

3. private static final (상수 선언)

  • 정의: 클래스 내부에서만 접근 가능한 변경 불가능한 상수.
  • 특징:
    • static: 모든 객체가 공유하는 클래스 단위의 변수.
    • final: 초기화 이후 변경 불가 (상수값으로 설정됨).

예제

class Example {
    private static final int MAX_USERS = 100; // 클래스 상수
    private static final String MESSAGE = "Hello, World!";

    public static int getMaxUsers() {
        return MAX_USERS;
    }

    public static String getMessage() {
        return MESSAGE;
    }
}

특징

  • MAX_USERS와 MESSAGE는 모든 객체가 공유하는 불변 값.
  • 프로그램 실행 중 한 번만 초기화되며 변경되지 않음.
  • 상수 값을 설정할 때 자주 사용됨.

4. 추가적인 활용 예제

(1) private static 메서드를 사용하여 캡슐화

class DatabaseUtil {
    private static void connectToDatabase() {
        System.out.println("Connecting to database...");
    }

    public static void initialize() {
        connectToDatabase();
        System.out.println("Database initialized.");
    }
}
  • connectToDatabase()는 내부적으로만 호출되도록 제한됨.

(2) private static final을 이용한 설정 값 관리

class Config {
    private static final String API_KEY = "1234-5678-ABCD";
    private static final int TIMEOUT = 5000;

    public static String getApiKey() {
        return API_KEY;
    }

    public static int getTimeout() {
        return TIMEOUT;
    }
}
  • 변경 불가능한 설정 값을 유지할 때 유용하게 사용됨.

5. 차이점 정리

키워드 메모리 할당 접근 가능 여부 객체 단위 or 클래스 단위 값 변경 가능 여부

private Heap 영역 클래스 내부에서만 접근 가능 객체마다 개별 보유 가능
private static Method(메서드) 영역 클래스 내부에서만 접근 가능 모든 객체가 공유 가능
private static final Method(메서드) 영역 (상수 풀 포함) 클래스 내부에서만 접근 가능 모든 객체가 공유 변경 불가 (상수)

🚀 최종 정리

  • private: 객체마다 독립적인 값을 가지며, 클래스 내부에서만 접근 가능.
  • private static: 클래스가 공유하는 값을 가지며, 객체를 생성하지 않고 사용 가능.
  • private static final: 클래스가 공유하는 값이지만 변경 불가능한 상수.
  • private static 메서드는 클래스 내부에서만 호출할 수 있는 유틸리티 메서드로 활용 가능.
  • private static final은 설정 값 및 상수를 안전하게 관리하는 데 유용.

 

728x90