final 필드

- 초기값이 저장되면 최종값이 되어 프로그램 실행 도중 수정 불가

1) final 필드의 초기값 주는 방법

  - 단순 값일 경우 필드 선언 시 초기화(주로 정적 필드(상수)일 경우)

  - 객체 생성 시 외부 데이터로 초기화 필요한 경우 생성자에서 초기화(주로 인스턴스 필드일 때)

2) 인스턴스 final 필드

  - 객체에 한번 초기화된 데이터를 변경 불가로 만들경우 ex) 주민 번호

  - final 타입 필드 [= 초기값];

  - final 필드의 초기값을 줄 수 있는 방법 2개

     1. 필드 선언 시에 주는 방법

     2. 생성자에서 주는 방법
public class Person {
	final String nation = "Korea";
	final String ssn;
	String name;
	
//생성자
	public Person(String ssn, String name) {
		this.ssn = ssn;
		this.name = name;
	}
}

public class PersonExample {

	public static void main(String[] args) {
		Person p1 = new Person("123456-1234567", "홍길동");
		
		System.out.println(p1.nation);
		System.out.println(p1.ssn);
		System.out.println(p1.name);
		
		//p1.nation = "usa";  final 해줘서 변경할 수 없음
		//p1.ssn = "홍삼원";   final 해줘서 변경할 수 없음
		p1.name = "홍삼원";
    System.out.println(p1.name);
	}

}

3) 정적 final 필드 (관례적으로 모두 대문자로 작성)

  - 일반적으로 불변의 값을 상수(static final)이라고 함 즉, 상수는 static 이면서 final이어야 상수라고 한다. 

  →한 번 초기값이 저장되면 변경할 수 없다.

  -  ( _ )  : 이거는 상수에만 붙여라 
public class Earth {
	static final double PI = 3.14159;
	static final double EARTH_RADIUS = 6400;
	static final double EARTH_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;
}

public class EarthExample {

	public static void main(String[] args) {
		System.out.println("지구의 반지름: " + Earth.EARTH_RADIUS + " km");
		System.out.println("지구의 표면적: " + Earth.EARTH_AREA + " km^2");

	}

}