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 | 외부 인스턴스 필요 없음 |
'Java' 카테고리의 다른 글
[Java] 자바에서 기본 생성자의 자동 생성 여부와 사용 조건 (0) | 2025.04.08 |
---|---|
[Java] Java의 키워드들과 JVM 메모리 영역의 관계 정리 (0) | 2025.04.08 |
[Java] Java 키워드 정리 (0) | 2025.04.08 |
[Java] static 키워드의 메모리 구조, 사용 시기, 고전적 관점 vs 현대적 관점 (0) | 2025.04.08 |
[Java] 자바 클래스 자기참조 개념 정리 (0) | 2025.04.06 |
댓글