[Java] 자바 final 과 static final을 알아보자!

2020-11-21


final 이름에서도 느껴지듯이 자바에서 final이 선언된 값은 프로그램 실행 도중 변경을 할 수 없다. 때문에 초기화 준 값에서 바뀌지 않는다는 것인데, 초기화 방법을 알아보자.


public class tFinal {
	final String name = "홍길동";
	//필드에서 초기화 하는 방법
	final String bloodType;
	
	public tFinal(String bloodType) {
		this.bloodType = bloodType;
	}
	//생성자에서 초기화 하는 방법
	
}

위의 코드에서 볼 수 있듯이 final 을 초기화하는 방법은 필드와 생성자를 통해서만 초기화할 수 있다. 단순한 값이라면 필드에서 선언하는 것이 좋으며, 외부에서 입력받아야만 하는 값이라면, 생성자를 이용해서 초기화하는 것이 효율적이다.

 

(다만 주의할 점은 final 의 경우 해당 필드를 초기화하지 않고 그대로 남겨두면 컴파일 상에 오류가 발생한다.)

아래와 같이 초기화되지 않고 기본생성자만 선언 시 오류가 발생한다.

마찬가지로 메인클래스에서 새로운 객체를 통해 final 값을 변경하려고 해도 오류가 발생한다.


static final은 final 과 다른 점은 객체마다 따로 저장할 필요가 없는 공용성을 가지고 있는 점이다. 때문에 static을 추가적으로 선언을 해줌으로써 객체를 생성시키지 않고도 사용할 수 있다.

 

때문에 생성자를 통한 초기화가 아닌 static을 통해 초기화시켜야 한다. 코드는 아래와 같다. 

(외부로 입력받아 초기화 시킬 수 없기 때문에 this를 통한 초기화가 되지 않는다.)

public class tStaticFinal {
	static final String name = "홍길동";
	//필드에서 초기화 하는 방법
	static final String bloodType;

	static {
		bloodType = "A";
	}
	//static에서 초기화 하는 방법

}

위에 이미지 처럼 객체를 생성하지 않고 사용할 수 있으며, console 창에도 정상적으로 해당 값이 출력되는 것을 확인할 수 있다.