본문 바로가기
Java

[Java] Java 키워드 조합 의미

by clolee 2025. 4. 8.

Java 키워드 조합 의미

각 키워드 (public, private, static, final) 의 조합에 대한 의미, 접근 범위, 사용 목적, 메모리 구조, 예시 코드를 함께 설명.


✅ Java 키워드 public, private, static, final 총정리

📘 키워드 핵심 비교표

키워드 의미 접근 범위 메모리 위치 사용 목적
public 외부 접근 허용 어디서든 해당 대상에 따라 다름 외부에서 자유롭게 접근
private 내부만 접근 가능 같은 클래스 내부 인스턴스(Stack/Heap), 정적(Method Area) 은닉, 내부 관리
static 클래스 단위 공유 클래스명으로 접근 Method Area 메모리 절약, 공유 자원
final 변경 금지 선언된 곳 기준 Stack(원시), Heap(객체), Method Area(정적) 불변성 유지, 상수 정의

✅ 키워드별 + 대상별 정리 (설명 + 예시코드 포함)


✅ 1. public static final – 전형적인 상수 선언 방식

public class Constants {
    public static final int MAX_USERS = 100;
    public static final String APP_NAME = "MyApp";
}

🔍 설명:

  • public: 어디서든 접근 가능
  • static: 객체 생성 없이 클래스명으로 접근 가능
  • final: 값이 한 번만 초기화되고, 값 변경 불가능
  • 사용 목적: 전역 상수, 공통 설정 값, 공유 기준값

📌 상수는 대문자 + 언더스코어 표기 관례: MAX_LENGTH, DEFAULT_PORT

🔁 접근 방법:

System.out.println(Constants.APP_NAME);

🧠 메모리 구조:

  • 클래스 로딩 시 Method Area에 저장 → 메모리에 1회만 로딩되고 모든 인스턴스가 공유함 (객체와 무관)
  • 따라서 → 클래스 전체에서 공통으로 사용하는 상수값을 정의할 때 사용

📌 이 조합은 메모리 절약 + 값 보호라는 이점이 있으며, 실제로 모든 자바 상수는 이 조합을 사용합니다.


✅ 2. private static – 클래스 내부 공유 자원, 외부 비공개

public class Logger {
    private static Logger instance = null;

    private Logger() {}  // 생성자도 private

    public static Logger getInstance() {
        if (instance == null) {
            instance = new Logger();  // 최초 1회만 생성
        }
        return instance;
    }
}

🔍 설명:

  • private: 외부에서 직접 접근 불가 (캡슐화)
  • static: 클래스 단위로 1개 존재
  • 사용 목적: 싱글턴 패턴, 공통 객체 은닉

🧠 메모리 구조:

  • instance 변수는 Method Area에 저장되고,
  • 외부에서는 Logger.instance 에 직접 접근 불가 → getInstance()를 통해 제한된 접근 제공

✅ 3. private final – 생성 후 변경 불가한 값, 외부 노출 안됨

public class User {
    private final String name;

    public User(String name) {
        this.name = name;  // 한 번만 초기화 가능
    }

    public String getName() {
        return name;
    }
}

🔍 설명:

  • private: 외부에서 직접 접근 불가
  • final: 한 번 초기화된 이후 변경 불가
  • 사용 목적: 불변 객체 만들기, 정보 은닉, 안정성 확보

✅ 4. public static – 외부에서 객체 없이 호출하는 유틸 메서드

public class MathUtil {
    public static int square(int x) {
        return x * x;
    }
}

🔍 설명:

  • public: 외부 접근 허용
  • static: 객체 생성 없이 호출 가능
  • 사용 목적: 헬퍼 기능 제공, 공통 연산 처리

🧠 호출 예:

int result = MathUtil.square(4);  // 객체 없이 클래스명으로 호출

✅ 5. private static final – 외부에서 접근 불가한 상수

public class ConfigLoader {
    private static final String CONFIG_PATH = "/etc/app/config.json";

    public static String getPath() {
        return CONFIG_PATH;
    }
}

🔍 설명:

  • private: 외부 클래스에서 직접 접근 불가
  • static: 클래스 당 1개
  • final: 값 변경 불가
  • 사용 목적: 내부용 상수, 외부 노출 X, 보안 유지

✅ 6. final class – 상속 금지 클래스

public final class SecurityUtils {
    public static void encrypt() {
        // 암호화 처리
    }
}

🔍 설명:

  • 더 이상 상속되지 않도록 하기 위한 제한
  • 보안 또는 로직 무결성 유지를 위해 사용
  • 사용 목적: 중요한 핵심 클래스 보호, 하위 재정의 방지

✅ 7. final method – 오버라이딩 금지 메서드

public class BaseService {
    public final void log() {
        System.out.println("공통 로깅 수행");
    }
}

🔍 설명:

  • 자식 클래스에서 이 메서드를 재정의(override) 할 수 없음
  • 사용 목적: 공통 로직 강제 유지

✅ 8. static class – 외부 클래스의 정적 내부 클래스

public class Outer {
    static class Inner {
        static void hello() {
            System.out.println("Hello from static inner class");
        }
    }
}

🔍 설명:

  • static 내부 클래스는 외부 인스턴스 없이 사용 가능
  • 외부 클래스와 논리적으로 관련되지만 물리적으로 독립적인 구조 설계에 유용
  • 사용 목적: 유틸 모듈화, 메모리 최적화

🧠 호출:

Outer.Inner.hello();  // Outer 인스턴스 없이 호출 가능

✅ 9. 인터페이스 내 키워드 조합 (public static final, static method)

public interface Shape {
    double PI = 3.14;  // public static final 자동 적용

    static void printInfo() {
        System.out.println("Shape interface");
    }

    double getArea();  // public abstract 자동 적용
}

🔍 설명:

  • 인터페이스의 필드는 무조건 public static final
  • static 메서드는 Java 8부터 가능, 유틸 기능 제공
  • 사용 목적: 공통 상수 정의, 기본 유틸 제공

🧠 JVM 메모리 구조와 키워드 관계

구분 저장 위치 설명
static Method Area 클래스 로딩 시 저장, 공유 자원
일반 변수 Heap or Stack 인스턴스마다 별도 존재
final Stack(primitive) / Heap(reference) 참조/값 고정
static final Method Area 변경 불가 + 공유 자원 (상수 최적화)

✅ 결론 요약

조합 사용 목적 메모리 설명
public static final 글로벌 상수, 유틸 Method Area 어디서든 접근 가능한 상수
private static 싱글턴, 내부 공유 자원 Method Area 외부 접근 차단, 클래스 공유
private final 불변성 유지 Heap 변경 금지 + 외부 은닉
static final 상수 Method Area 메모리 절약 + 값 보호
final class 상속 금지 클래스 영역 핵심 로직 보호
final method 오버라이딩 금지 메서드 영역 자식이 수정 못하게 막음
static class 독립적 내부 구조 Method Area 외부 인스턴스 필요 없음

댓글