final
final은 상수이다. 변수에 final이 붙으면 더는 값을 변경할 수 없다.
class, method를 포함한 여러 곳에 붙일 수 있다.
final을 지역변수에 설정할 경우 최초 한번만 할당이 가능하다. 이후에 변수 값을 변경하려고 하면 컴파일 에러가 발생한다.
final - 필드 (멤버 변수)
public class ConstructInit {
final int value;
public ConstructInit(int value) {
this.value = value;
//final을 필드에서 사용하는 경우에 생성자를 만들어 사용할 수 있다.
}
}
fianl을 필드에 사용할 경우 해당 필드는 생성자를 통해서 한번만 초기화 될 수 있다
package final1;
public class FieldInit {
static final int CONST_VALUE = 10;
final int value = 10;
// public FieldInit(int value) {
// this.value = value;
// 이미 값이 초기화 되었기 때문이 당연히 안됨
}
final 필드를 필드에서 초기화하면 이미 값이 설정되어있기 때문에 생성자를 통해서도 수정할 수 없다.
final은 static변수에도 사용할 수 있다.
위 코드처럼 필드에서 초기화하는 경우, 모든 인스턴스가 힙 영역에 10의 값을 가진 상태로 생성이 된다.
final 변수를 가진 인스턴스를 여러개 만들경우, 중복이 발생하기 때문에 (모든 값이 10으로 고정되어 있으니까) static을 사용하면 좋다.
final 변수와 참조
final은 변수의 값을 변경할 수 없다. 여기서 변수는 크게 기본형 변수(10, 20)와 참조형 변수(참조값을 보관하는)가 있다.
package final1;
public class Data {
public int value;
}
final이 아닌 public int로 변수를 선언했다.
package final1;
public class FinalRefMain {
public static void main(String[] args) {
final Data data = new Data();
//data = new Data(); //이미 참조값을 해당했기때문에 변경할 수 없다
//참조 대상의 값은 변경 가능
data.value = 10;
System.out.println(data.value);
data.value = 20;
System.out.println(data.value);
}
}
이 코드에서 핵심은 final Data data에 참조값을 할당했기때문에 더이상 참조값을 변경할 수 없다.
(주석처리 되어있는 new Data는 컴파일에러가 발생한다.)
하지만 fianl로 참조형 변수를 선언했지만, value의 값은 변경된다. 이유는 value는 final이 아닌 가변(mutable)변수이기 때문이다.
정리: 자바에서는 값을 고정할 땐 final을 사용한다.
java의 fianl == kotlin의 val
java의 static final == kotlin의 companion object { const val }
'Java' 카테고리의 다른 글
다형성 (캐스팅, 메서드 오버라이딩) (1) | 2024.06.10 |
---|---|
상속 (0) | 2024.06.07 |
접근 제어자 (0) | 2024.05.28 |
생성자 (0) | 2024.05.15 |
객체 지향 프로그래밍 (1) | 2024.05.08 |