1. final
- final 키워드가 붙으면 더 이상 변경 불가능 함!
- 클래스, 메서드 포함 여러곳에 사용 가능
1-1. final 변수
1-1-1. final 지역 변수 (매개변수)
public static void main(String[] args) {
// final 지역 변수
final int data1;
data1 = 10;
~~data1 = 20;~~ // final 변수 값을 변경하면 컴파일 오류 발생!
// final 지역 변수
final int data2 = 10;
~~data2 = 20;~~ // final 변수 값을 변경하면 컴파일 오류 발생!
}
// final 매개 변수
static void method(final int parameter) {
~~parameter = 20;~~ // final 변수 값을 컴파일 변경하면 오류 발생!
}
- data1
- 선언 이후 초기화, 최초 1회만 값 설정 가능
- data2
- 선언과 동시에 초기화
- parameter
- 메서드 호출 시점에 대입된 값이 메서드 종료 까지 계속 유지됨
1-1-2. final 멤버 변수 (필드)
- 초기화 방법 1 - 생성자 통해 초기화
public class Test {
final int value;
// 생성자로 한번만 초기화 가능
public Test(int value) {
this.value = value;
}
}
public class Main {
public static void main(String[] args) {
// 생성자로 final 멤버 변수 초기화
Test test1 = new Test(10);
}
}
- 초기화 방법 2 - 필드에서 초기화
public class Test {
// static 변수에도 final 선언가능
static final int CONST_VALUE = 10;
// 필드 초기화
final int value = 10;
}
📌 final
모든 인스턴스에 대해 같은 (여기서는 10) 필드 값을 가짐
힙 영역에 모든 객체마다 value 저장하므로 메모리 낭비
또한 같은 값 계속 생성 ⇒ (개발자 입장) 중복 ⇒ static (final) 사용!
📌 static final ⇒ “바뀌지 않는 공용 변수 선언”
static final 로 선언 ⇒ static 영역에 존재 + final (값 변화 x)
static 영역 : 딱 1개만 존재하는 영역 ⇒ 메모리 낭비 해결!
1-2. 상수
- 변하지 않고 일정한 수
- 장점
- 중앙 관리 가능 ⇒ 코드 1개 (상수 값) 만 수정하면 모두 반영됨
- 매직 넘버 문제 해결 가능 ⇒ 매직 넘버(: 어떤 문맥으로 사용되었는지 모르는 수)
- static final 키워드
- 대문자 사용, 구분은 _ (언더스코어) → (관례)
static final int FULL_SCORE = 100;
static final int ZERO_SCORE = 0;
- 필드 직접 접근
- 상수는 고정된 값 자체를 사용
- 직접 접근해도 값 변경 불가능 ⇒ 캡슐화가 깨지지 않음
public class Constant { static final double PI_VALUE = 3.14; } public class Main { public static void main(String[] args) { // 필드 직접 접근 System.out.println("파이 값 = " + Constant.PI_VALUE); } }
1-3. final 변수와 참조
- final - 기본형 변수 : 값 변경 x
- final - 참조형 변수 : 마찬가지로 참조 값 변경 x ( = “참조하는 대상 변경 x”)
public class Data {
int value;
}
public class Main {
public static void main(String[] args) {
// data : final 참조변수
final Data data = new Data();
~~data = new Data();~~ // final 참조변수이므로 새 참조값 할당 불가! => 에러
// 참조 대상의 값은 변경 가능!
data.value = 10; // 참조 대상을 변경하는 것 x => 대상 내부의 필드 값 변경 가능!
}
}
'Java' 카테고리의 다른 글
[Java] 입출력(I/O), 스트림, 버퍼 (0) | 2024.07.28 |
---|---|
[Java] 자바 메모리 구조 (0) | 2024.07.09 |
[Java] static (0) | 2024.07.09 |
[Java] 객체 지향 프로그래밍 - 추상화 (Abstraction) (0) | 2024.07.09 |
[Java] 객체 지향 프로그래밍 - 다형성 (Polymorphism) (0) | 2024.07.09 |