[JAVA] 김영한의 실전 자바 ; FINAL

선뀰·2023년 12월 29일
0

JAVA

목록 보기
16/25

final 변수와 상수

이름 그대로 끝 이라는 뜻이다. 변수에 final 키워드가 붙으면 더는 값을 변경할 수 없다.
class, method를 포함한 여러 곳에 붙을 수 있다.
지역 변수에 설정할 경우 최초 한번만 할당이 가능하다. 이후 변수 값을 변경하면 컴파일 오류가 발생한다.
final 지역 변수 선언시 이미 값이 할당되었기 때문에 값을 할당할 수 없다.
매개변수에 final이 붙으면 메서드 내부에서 매개변수의 값을 변경할 수 없다.
따라서 메서드 호출 시점에 사용된 값이 끝까지 사용된다.

public static void main(String[] args) {
        // final 지역 변수
        final int data1;
        data1 = 10; // 최초 한번만 할당 가능하다.
        //data1 = 20; // 컴파일 오류

        //final 지역 변수2
        final int data2 = 10;
        //data2 = 20; // 컴파일 오류
        method(10);
    }

    static void method(final int parameter) {
        // parameter = 20; 컴파일 오류 
    }

static final int CONST_VALUE = 10; static final 변수는 대문자로 작성해야 한다.

- 필드에서 final 초기화

final 필드를 필드에서 초기화 하는 경우, 모든 인스턴스가 같은 값을 가진다.
필드 초기화는 필드의 코드에 해당 값이 미리 정해져있기 때문이다.
모든 인스턴스가 같은 값을 사용하기 때문에 메모리를 낭비하게 된다. -> 중복이 된다.

= 이때 static final을 사용한다.

- static final

static 영역은 단 하나만 존재하는 영역이다 중복과 메모리 비효율 문제를 모두 해결할 수 있다.
final + 필드 초기화를 사용하는 경우 static을 붙여서 사용하는 것이 효과적이다.

상수 (Constant)

변하지 않고, 항상 일정한 값을 갖는 수 변하지 않는 고정된 값이다.
static final 키워드를 사용한다.

  • 자바 상수
    static final 키워드를 사용, 대문자 사용하고 구분은 _로 한다. (변수와 상수를 구분하기 위해)
    필드를 직접 접근해서 사용한다. 상수는 기능이 아니라 고정된 값 자체를 사용하는 것이 목적이다.
    상수는 값을 변경할 수 없다. 따라서 필드에 직접 접근해도 데이터가 변하는 문제가 발생하지 않는다.
public class Constant {
    public static final double PI = 3.14;
    public static final int HOURS_IN_DAY = 24;
    public static final int MINUTES_IN_HOUR = 60;
    public static final int SECONDS_IN_MINUTE = 60;
    // 수학, 시간 등 사용이 가능하다.
}

MAGIC NUMBER 문제를 해결할 수 있다. 변수 명을 통해 직관적인 추론이 가능하다.
MAX_USERS라는 변수명으로 코드로 이해할 수 있다.

final 변수와 참조

final은 변수의 값을 변경하지 못하게 막는다.
기본형 변수와 참조형 변수가 있다. 기본형 변수는 10, 20같은 값을 보관하고, 참조형 변수는 객체의 참조값을 보관한다.
final을 기본형 변수에 사용하면 값을 변경할 수 없다.
final을 참조형 변수에 사용하면 참조값을 변경할 수 없다.

 public static void main(String[] args) {
        // final reference와 관련된 것이다.
        final Data data = new Data(); // 참조형을 final로 하였기 떄문에 참조 대상을 변경할 수 없다.

        // 참조 대상의 값은 변경 가능
        data.value = 10; // final이 아니라 인스턴스에 있는 것이다. 참조하는 대상의 값은 변경할 수 있다.
        System.out.println(data.value);
        data.value = 20;
        System.out.println(data.value);

        // 참조형 변수 data에 final이 붙었다. 변수 선언 시점에 참조값을 할당했으므로 더는 참조값을 변경할 수 없다.

    }
profile
공부 기록

0개의 댓글