자바의 final

    Final 필드와 상수


    인스턴스 필드와 static필드는 언제든지 값을 변경할 수 있지만, 경우에 따라서 값을 변경하게 하지 않고 값을 읽는 것까지만 허용해야 할 때가 있습니다. 이러한 경우에 final키워드를 사용해서 final 필드와 상수를 선언해서 사용합니다.

     

     

     

     

     

    Final 지역 변수 선언


    final변수는 초기값이 저장되면 해당 값이 최종값이 되어서 프로그램 도중에 수정이 불가능하게 됩니다. 선언 방식은 다음과 같습니다.

    final int finalValue = 1; // 자료형과 초기값은 다양하게 설정이 가능함

    지역 변수에 final키워드를 사용하게 되면 변수 초기화 시 설정한 값 한 번만 설정할 수 있습니다. 이후에 값을 변경하려고 시도하면 컴파일 오류가 발생합니다.

    public static void main(String[] args) {
    	final int data1; // final 변수 선언
    	data1 = 10; // 최초 한번만 할당 가능
    	data1 = 20; // 이후 변수의 값을 변경하려고 시도 할 시 컴파일 오류 발생함
    }

    메서드에서 매개 변수를 선언할 때도 final변수로 선언이 가능합니다. 해당 매개 변수도 final 변수이기 때문에 매개값을 통해서 할당받은 값을 후에 메서드 내부에서 변경할 수 없습니다.

    public static void main(String[] args) {
    	method(1);
    }
    
    static void method(final int param) {
    	param = 7; // final 매개 변수에 1이 이미 할당 되었으므로 변경 불가
    }

     

     

     

     

     

    final 필드 선언


    클래스영역에서 final 변수를 선언해서 final 필드를 선언할 수 있습니다.

    public class FClass {
        final int fValue; // 컴파일 에러 발생
        final int fValue = 1;
        
        public FClas(int fValue) {
        	this.fValue = fValue; // 필드에서 직접 초기화를 하지 않았을 때 생성자로 초기화 가능
        }
    }

    final 필드를 초기화하기 위해서는 필드 선언과 동시에 초기화를 진행하거나 생성자를 통해서만 초기화가 가능합니다. 위 두 가지 방법을 따르지 않으면 컴파일 오류가 발생합니다. 필드에서 이미 초기화를 진행했을 경우 생성자를 통한 초기화도 진행하지 못합니다.

     

    위와 같이 final 키워드 하나만 이용해서 필드 선언이 가능하지만, 이런 경우 객체 생성 시에 해당 final 필드의 데이터도 힙 영역에 함께 생성됩니다.

     

    final 필드는 항상 같은 값을 가지기 때문에, static 키워드를 활용해서 항상 static영역에 한 번만 생성되게 하여 효율적인 메모리 관리를 위해 대부분의 경우에는 다음과 같이 static 키워드를 활용합니다.

    public class FClass {
    	static final int CONST_VALUE = 1;
    }

     

     

     

     

     

    상수


    위와 같이 static final로 변수 선언을 할 경우 이를 상수(constant)라고 부릅니다. 상수는 변하지 않고, 항상 일정한 값을 가지는 수를 말합니다. 이러한 이유로 static final 키워드를 사용합니다.

     

    상수 역시 static 필드이므로 클래스로 직접 접근해서 읽을 수 있습니다.

    public static void main(String[] args) {
    	System.out.println(FClass.CONST_VALUE); // 1출력
    }

    상수의 특징은 다음과 같습니다.

    • 일반적인 변수와 다른 상수임을 표현하기 위해서 상수의 변수명은 모두 대문자로 작성하고, 띄어쓰기는 카멜 표기법이 아닌 (_) 언더바를 활용합니다.
    • 상수는 값을 변경할 수 없기 때문에 필드에 직접 접근해도 데이터가 변하지 않기 때문에 문제가 발생하지 않습니다.
    • 상수는 프로그램 실행 도중에 변경할 수 없습니다. 따라서 상수를 변경하기 위해서는 프로그램을 종료하고 코드를 직접 변경해야 합니다.

    'Backend > Java' 카테고리의 다른 글

    자바의 상속(inheritance)  (0) 2024.03.02
    자바의 배열(array)  (2) 2024.03.01
    자바의 생성자(constructor)  (0) 2024.02.19
    자바의 패키지(package)  (2) 2024.02.16
    자바의 기본형과 참조형  (0) 2024.02.13

    댓글