🚀 이 주제를 선택한 이유 & 학습 목표
- 선택 배경: 객체 지향 프로그래밍의 핵심인 캡슐화를 공부하던 중,
private키워드와 함께 사용되는static,final의 미묘한 차이가 혼란스러웠습니다. 특히 '어차피 불변인데 공유와 개별의 차이가 무엇인가?'라는 의문을 해결하고, 각 키워드의 역할을 명확히 이해하여 올바른 객체 설계를 하고 싶었습니다. - 학습 목표:
private,static,final각각의 핵심 역할을 자신의 언어로 설명할 수 있다.- 이 키워드들의 조합(
private static,private final,private static final)이 필드의 '성격'을 어떻게 규정하는지 설명할 수 있다. - '개별적인 불변 값(
final)'과 '공유되는 불변 값(static final)'의 차이점을 구체적인 예시로 설명할 수 있다. - 상황에 맞는 적절한 키워드를 선택하여 객체를 설계하는 원칙을 이해한다.
📚 핵심 개념 및 원리
private, static, final은 클래스의 멤버 변수(필드)의 접근 범위, 소유권, 변경 가능성을 제어하는 핵심 키워드입니다.
1. 주요 용어 정의
private(접근 제어): "오직 이 클래스 안에서만!" 가장 엄격한 접근 제어자로, 해당 멤버는 클래스 외부에서 접근이 완벽히 차단됩니다. 이는 객체의 내부 상태를 숨기고 보호하는 캡슐화의 시작점입니다.static(소유권 제어): "객체 개인이 아닌, 클래스 모두의 것!" 이 키워드가 붙은 멤버는 객체(인스턴스)마다 생성되는 것이 아니라, 클래스 자체에 단 하나만 존재하며 모든 객체가 이를 공유합니다. '정적 멤버' 또는 '클래스 멤버'라고 부릅니다.final(변경 가능성 제어): "한 번만 할당 가능, 절대 불변!" 이 키워드가 붙은 변수는 선언 시 또는 생성자에서 단 한 번만 값을 할당할 수 있으며, 그 이후에는 절대 값을 변경할 수 없습니다.
2. 핵심 원리/동작 방식: 키워드 조합으로 필드 성격 규정하기
은행 계좌(Account) 클래스를 예로 들어 각 조합의 역할을 이해할 수 있습니다.
public class Account {
// 1. 개별적이고, 가변적인 상태
// "각 계좌마다 독립적으로 소유하며, 값이 계속 변할 수 있는 잔액"
private int balance;
// 2. 개별적이고, 불변인 상태
// "각 계좌마다 고유하지만, 한 번 발급되면 절대 바뀌지 않는 계좌번호"
private final String accountNumber;
// 3. 공유되고, 불변인 상태 (상수)
// "이 은행의 모든 계좌가 동일하게 공유하며, 절대 바뀌지 않는 은행 코드"
private static final String BANK_CODE = "001";
// 4. 공유되고, 가변적인 상태 (주의해서 사용)
// "모든 계좌가 공유하는 하나의 금고. 한 계좌의 입출금이 모두에게 영향을 줌"
private static int sharedSafeBalance;
public Account(int balance, String accountNumber) {
// 가변/불변 상태 초기화
this.balance = balance;
this.accountNumber = accountNumber; // final 필드는 생성자에서 초기화 가능
}
}💡 장점, 단점 및 고려사항 (개념 비교)
필드의 성격을 결정하는 네 가지 조합을 비교하면 다음과 같습니다.
| 구분 | private (가변, 개별) |
private final (불변, 개별) |
private static (가변, 공유) |
private static final (불변, 공유) |
|---|---|---|---|---|
| 핵심 역할 | 객체의 일반적인 상태 | 객체의 고유한 불변 속성 | 클래스의 공유 상태 | 클래스의 공유 상수 |
| 값의 변경 | 가능 (O) | 불가능 (X) | 가능 (O) | 불가능 (X) |
| 소유권 | 객체(인스턴스) | 객체(인스턴스) | 클래스 | 클래스 |
| 메모리 생성 | new 할 때마다 객체별로 생성 |
new 할 때마다 객체별로 생성 |
클래스 로드 시 단 하나 생성 | 클래스 로드 시 단 하나 생성 |
| 초기화 | 생성자, 메서드 등에서 자유롭게 | 선언 시 또는 생성자에서만 가능 | 선언 시 또는 static 블록에서 | 선언 시 또는 static 블록에서만 가능 |
| 예시 | balance (잔액) |
accountNumber (계좌번호) |
sharedSafeBalance (공용 금고) |
BANK_CODE (은행 코드) |
| 비유 | 개인 지갑 | 주민등록번호 | 가족 공용 생활비 통장 | 우리 집 주소 |
🔧 실제 활용 사례 또는 적용 분야
private: 객체의 내부 상태를 나타내는 대부분의 멤버 변수. (예:User클래스의age,email)private final: 생성된 이후 변하지 않는 객체의 고유 식별자나 속성. (예:User클래스의userId,createdAt)private static final: 프로그램 전역에서 사용되는 상수 값. (예:Math.PI, 설정 값, 기본 에러 메시지)private static: 특정 클래스의 모든 인스턴스가 공유해야 하는 관리 정보. (예: 생성된 객체의 개수를 카운트하는 변수), 또는 싱글턴 패턴(Singleton Pattern)의 유일한 인스턴스를 저장하는 변수.
🤔 나의 이해와 생각 정리 (회고)
- 핵심 요약:
private,static,final은 객체 설계의 의도를 코드에 명시하는 도구다.private으로 외부 접근을 막아 캡슐화를 보장하고,static으로 '공유 여부'를,final로 '변경 가능 여부'를 결정하여 필드의 성격을 명확히 규정할 수 있다. - 새롭게 깨달은 점: '불변(
final)인데 공유(static)와 개별의 차이가 무엇인가?'에 대한 답은 "값의 다양성"에 있었다.final은 객체마다 '다른' 불변 값을 가질 수 있게 하고,static final은 모든 객체가 '동일한' 불변 값을 공유하게 강제한다. 이는 설계상 매우 큰 차이다. - 더 궁금해진 점 / 의문점:
final키워드를 클래스나 메서드에 붙이면 어떤 효과가 있을까? 불변 객체(Immutable Object)를 만드는 것이 동시성 프로그래밍에서 왜 중요한가?
📖 더 학습할 내용 및 참고 자료
- 추가 학습 희망 분야:
- 불변 객체 (Immutable Object): 불변 객체의 장점과 설계 패턴 학습.
- 싱글턴 디자인 패턴 (Singleton Pattern):
private static멤버를 활용하는 대표적인 디자인 패턴. - 접근 제어자 심화:
public,protected,default(package-private)의 정확한 범위와 사용 사례. final키워드의 확장:final클래스(상속 불가),final메서드(오버라이딩 불가)의 역할과 의미.
'Study > CS' 카테고리의 다른 글
| [Java] 제네릭 (0) | 2025.10.15 |
|---|---|
| [소프트웨어 공학] 소프트웨어 개발 방법론 (0) | 2025.09.17 |
| 허프만 부호화 (6) | 2025.08.13 |
| 정렬 3편 (힙(Heap)과 힙 정렬) (2) | 2025.07.29 |
| 정렬 2편 (분할 정복: 병합 정렬, 퀵 정렬) (2) | 2025.07.29 |