final 키워드와 static,상수

Do_It·2024년 3월 27일

final 키워드

  • final을 지역 변수에 설정할 경우 최초 한번만 할당할 수 있다.
  • final 지역 변수 선언시 바로 초기화 한 경우 이미 값이 할당되었기 때문에 값을 할당할 수 없다.
  • 매개변수에 final이 붙으면 메서드 안에서 매개변수의 값을 변경할 수 없다. 따라서 호출 시점에 사용된 값이 끝까지 사용된다.
  • 자바에서는 static final이 붙은 변수는 상수라고 하며 대문자로 적어줌

static final을 쓰는 이유

public class FieldInit{
static final int CONST_VALUE = 10;
final int value = 10;
}

이 경우 클래스로부터 여러개의 인스턴스를 생성한다고 하면 힙 영역에서 같은 필드값을 가진 여러개의 인스턴스가 생성된다.

각각의 인스턴스가 가진 value의 값은 10이며 바꿀 수 없다. 바뀌지 않는 필드 값을 인스턴스가 생길때마다 생성하는 것은 메모리 측면에서도 낭비이기 때문에 메소드 영역에 static final 변수를 만들어서 클래스로부터 만들어진 모든 인스턴스들이 CONST_VALUE 값을 공유하면 되는 것이다.

정리하자면 변하지 않는 필드값 + 모든 인스턴스가 공유 해야하는 조건이라면 static + final 키워드를 쓰면 것이 효과적이다..

상수(CONSTANT)

상수는 변하지 않고 항상 일정한 값을 갖는 수를 말한다. 자바에서는 보통 단 하나만 존재하는 변하지 않는 고정된 값을 상수라 한다.
이런 이유로 상수는 static final 키워드를 사용한다.

자바 상수 특징

  • static final 키워드를 사용한다.
  • 대문자를 사용하고 구분은 언더스코어로 CONST_VALUE. 왜냐하면 일반적인 변수와 상수를 구분하기 위함이다.
  • 필드를 직접 접근해서 사용한다.
    -> 상수는 기능이 아니라 고정된 값 자체를 사용하는 것이 목적
    -> 상수는 값을 변경할 수 없다. 따라서 필드에 직접 접근해도 데이터가 변하는 문제가 발생하지 않는다.
  • 상수를 쓰게 되면 중앙에서 값을 제어할 수 있는 장점이 있다. - 상수를 사용해서 단순한 값이 아닌 읽는 문맥으로 만들어서 매직넘버의 문제를 해결할 수 있다.

final 참조변수라면?

public class Data{
public int value;
}

public class FinalTest{
public static void main(String[] args){
final Data data = new Data(); // data = x001 ;
Data data2 = new Data(); // data2 = x002 ;

 // 다른 참조값 할당은 불가 
 // data = data2;  

data.value = 10; // x001.value
data.value = 20; // x001.value
}
}

참조형 변수에 final이 붙으면 참조 대상 자체를 다른 대상으로 변경하지 못한다는 것이다. 따라서 참조 대상의 값은 변경할 수 있다.

data에는 final 키워드가 붙었기에 data2가 가리키는 참조값을 할당할 수 없다는 뜻이다.
그러나 data이 가리키는 참조값의 인스턴스에 접근하여 value값은 변경할 수 있다는 것이다.

정리

항상 제약이 중요하다. 제약을 통해서 의도를 알 수 있기 때문이다.

profile
오늘의 노력이 내일의 성장으로 이어지고 있음을

0개의 댓글