JAVA

final 필드와 상수

topgon 2021. 8. 6. 14:58

1. final 필드

 

final 은 '최종적' 이라는 뜻을 가지고 있다. 그렇다면 final은 최종적인 필드라는 의미인데, 어떻게 사용될까?

final 필드는 초기값이 저장되면 최종적인 값이 되면서 프로그램 실행 도중에 수정할 수 없다는 것이다. 

 

final 필드의 초기값을 줄 수 있는 방법은 2가지가 있다.

1. 필드 선언시

2. 생성자 생성시

 

단순한 값이라면 필드 선언시에 주는 것이 제일 간단하지만 초기화 코드가 복잡하거나 생성시 외부 데이터로 초기화 해야한다면 생성자에서 초기값을 지정해야한다. 

이해하기 어려울 수 있으니 코드로 알아보겠다.

 

public class Test01{
	
	final String nation = "Korea";
	final String ssn;
	
	String name;
	
	//생성자
	public Test01(String ssn, String name) {
		this.ssn = ssn;
		this.name = name;
	}
}

 

public class Test02 {

	public static void main(String[] args) {
	
		Test01 t1 = new Test01("123456-1234567","gon");
		
		t1.nation = "usa"; //컴파일 에러
		t1.ssn = "22222-222222"; //컴파일 에러
		t1.name = "gon2";
	}
}

 

ssn 필드는 한 번 값이 저장되면 변경할 수 없도록 final필드로 선언했다. 

하지만 ssn은 Test01 객체가 생성될 때 부여되므로 Test01 에서 초기값을 미리 줄 수없다.

그래서 생성자 매개값으로 ssn을 받아서 초기값을 지정했다.

nation은 항상 고정된 값을 갖기 때문에 필드 선언 시 초기값으로 "Korea"를 주었다.

 

 


 

2. 상수

 

일반적으로 불변의 값을 상수 ( static fianl ) 이라고 한다.

수학에서 원주율이나 파이등이 있는데 자바에서도 상수라고 한다. 

final 필드는 한 번 초기화되면 수정할 수 없는 필드라고 했는데 그러면 fianl필드를 상수라고 불러도 되지 않을까?

final 필드는 객체마다 저장되고 생성자를 통해 여러가지 값을 가질 수 있기 때문에 상수가 될 수 없다.

 

그렇기 때문에 상수는 static 이면서 final 이어야 한다. !

 

public class Test01{
	
	//지구의 반지름
	static final double EARTH_RADIUS = 6400;
}

 

public class Test02 {

	public static void main(String[] args) {
	
		System.out.println("지구의 반지름 : " + Test01.EARTH_RADIUS + " km");
	}
}

 

더보기

실행결과 : 지구의 반지름 : 6400.0 km