반응형
final 변수와 상수
변수에 final 키워드가 붙으면 더는 값을 변경할 수 없다.
final은 class,method를 포함한 여러곳에 붙을 수 있다.
package final1;
public class FinalLocalMain {
public static void main(String[] args) {
//final 지역 변수1
final int data1;
data1 = 10; //최초 한번만 할당 가능
//data1 = 20; //컴파일 오류
//final 지역 변수2
final int data2 = 10;
//data2 = 20; //컴파일 오류
method(10);
}
//final 매개변수
static void method(final int parameter) {
//parameter = 20; 컴파일 오류
}
}
- final을 지역 변수에 설정할 경우 최초 한번만 할당할 수 있다. 이후에 변수의 값을 변경하려면 컴파일 오류가 발생
- final을 지역변수로 선언시 바로 초기화 한 경우 이미 값이 할당되었기 때문에 값을 할당할 수 없다.
- 매개변수에 final이 붙으면 메서드 내부에서 매개변수의 값을 변경할 수 없다. 따라서 메서드 호출 시점에 사용된 값이 끝까지 사용된다.
final + 필드 초기화를 사용하는 경우 모든 인스턴스가 같은 값을 사용하기 때문에 결과적으로 메모리 낭비하게 된다.
따라서 static을 붙여서 사용하는 것이 효과적이다.
상수
상수란 변하지 않고, 항상 일정한 값을 갖는 수를 말한다.
자바 상수 특징
- static final 키워드를 사용한다.
- 대문자를 사용하고 구분은 _(언더스코어)로 한다.
- 일반적인 변수와 상수를 구분하기 위해 이렇게 사용
- 필드를 직접 접근해서 사용한다.
- 상수는 기능이 아니라 고정된 값 자체를 사용하는 것이 목적이다.
- 상수는 값을 변경할 수 없다. 따라서 필드에 직접 접근해도 데이터가 변하는 문제가 발생하지 않는다.
상수를 사용하면 좋은점
package final1;
public class ConstantMain2 {
public static void main(String[] args) {
System.out.println("프로그램 최대 참여자 수 " + Constant.MAX_USERS);
int currentUserCount = 999;
process(currentUserCount++);
process(currentUserCount++);
process(currentUserCount++);
}
private static void process(int currentUserCount) {
System.out.println("참여자 수:" + currentUserCount);
if (currentUserCount > Constant.MAX_USERS) {
System.out.println("대기자로 등록합니다.");
} else {
System.out.println("게임에 참가합니다.");
}
}
- 프로그램 최대 참여자수를 변경해야할때 상수를 이용하지 않으면 예를들어 100곳에서 숫자를 사용했다면 100곳을 모두 변경해야한다.
- Constant.MAX_USERS 상수를 사용했다. 만약 프로그램 최대 참여자 수를 변경해야 하면 Constant.MAX_USERS 의 상수 값만 변경하면 된다.
- 숫자1000이 아니라 사람이 직관적으로 인지할 수 있게 MAX_USERS라는 변수명으로 이해할 수 있다.
final 변수와 참조
package final1;
public class FinalRefMain {
public static void main(String[] args) {
final Data data = new Data();
//data = new Data(); //final 변경 불가 컴파일 오류
//참조 대상의 값은 변경 가능
data.value = 10;
System.out.println(data.value);
data.value = 20;
System.out.println(data.value);
}
}
참조형 변수 data에 final이 붙어 변수 선언 시점에 참조값을 할당했으므로 더는 참조값을 변경할 수 없다.
그런데 참조 대상의 객체 값은 변경할 수 있다.
참조형 변수에 final이 붙으면 참조 대상 자체를 다른 대상으로 변경하지 못하는 것이지, 참조하는 대상의 값은 변경할 수 있다.
반응형
'코딩' 카테고리의 다른 글
[ Java ] 실전자바-기본편 10.다형성1 (1) | 2024.02.22 |
---|---|
[ Java ] 실전자바-기본편 9.상속 (0) | 2024.02.19 |
[ Java ] 실전자바-기본편 7. 자바 메모리 구조와 static (2) | 2024.02.15 |
[ Java ] 실전자바-기본편 6. 접근 제어자 (0) | 2024.02.14 |
[ Java ] 실전자바-기본편 5. 패키지 (0) | 2024.02.13 |