❗해당 포스팅은 인프런에서 제공해주는 강의 내용을 개인적으로 정리하였음을 알려드립니다.
final을 지역 변수에 설정할 경우 최초 한번만 할당할 수 있다. 이후 변수 값 변경 시 컴파일 오류 발생❗
public static void main(String[] args) {
//final 지역 변수
final int data1;
data1 = 10; //최초 한번만 할당 가능
//data1 = 20; //컴파일 오류
}
매개변수에 final이 붙으면 메서드 내부에서 매개변수의 값을 변경할 수 없다.
static void method(final int parameter) {
//parameter = 20; //컴파일 오류
}
때론 final을 사용하여 메모리가 낭비 되는 경우도 있다. 다음의 경우를 보자.
public class FieldInit {
final int value = 10;
}
System.out.println("필드 초기화");
FieldInit fieldInit1 = new FieldInit();
FieldInit fieldInit2 = new FieldInit();
FieldInit fieldInit3 = new FieldInit();
System.out.println(fieldInit1.value);
System.out.println(fieldInit2.value);
System.out.println(fieldInit3.value);
모든 인스턴스가 같은 값을 사용하기 때문에 결과적으로 메모리를 낭비하게 된다.
이럴 때 사용하면 좋은 것이 static 영역인데, static을 사용하여 중복과 비효율 문제 모두 해결 가능하다.
상수란 변하지 않는 값을 말하는데, 자바 상수는 static final 키워드를 사용한다.
public class ConstantMain2 {
public static void main(String[] args) {
System.out.println("프로그램 최대 참여자 수 " + 1000);
int currentUserCount = 999;
process(currentUserCount++);
process(currentUserCount++);
process(currentUserCount++);
}
private static void process(int currentUserCount) {
System.out.println("참여자 수:" + currentUserCount);
if (currentUserCount < 1000) {
System.out.println("게임에 참여합니다.");
}else{
System.out.println("대기자로 등록됩니다.");
}
}
}
위와 같은 프로그램이 있을 때 최대 참여자 수를 수정하려고 하면 관리가 어렵다. 이 코드가 생소한 사람에겐 1000이라는 숫자의 의미를 모를 수도 있다. 이것을 매직넘버라 부른다. ㅎ
이러한 문제를 방지하기 위해 static final을 사용한다.
package final1;
public class Constant {
//수학 상수
public static final int MAX_USERS = 1000;
}
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("대기자로 등록됩니다.");
}
}
}
참조형 변수에 final이 붙으면 참조 대상 자체를 다른 대상으로 변경하지 못하는 것이지 참조하는 대상의 값은 변경할 수 있다.
public class FinalRefMain {
public static void main(String[] args) {
final Data data;
data = new Data(); //참조대상을 바꿀 수 없음
//참조 대상의 값은 변경 가능
data.value = 10;
System.out.println(data.value);
data.value = 20;
System.out.println(data.value);
}
}
정리💫
final은 매우 유용한 제약.
final 붙으면 못바꾼다!!
인스턴스 변수에 사용 할 거면 static을 사용해서 메모리를 효율적으로 사용할 필요가 있다.
static final은 상수다.
'Back-end > Java' 카테고리의 다른 글
[Java] static 메서드 (1) | 2024.12.20 |
---|---|
[Java] static 변수 (0) | 2024.12.16 |
[Java] 자바 메모리 구조 (0) | 2024.12.14 |
[Java] 기본형과 참조형 (3) | 2024.12.03 |
[Java] 배열의 도입 (2) | 2024.11.27 |