final의 뜻은 아시잖습니까~! '최종적'이라는 뜻이죠. final필드는 최종적인 필드라는 뜻.
final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없다필는 것이다.
final 필드에 초기값을 주는 방법
public class Korea {
// final 필드 (저장된 값들을 절대로 변경할 수 없다. 최종값)
final String nation = "대한민국"; // 1. 초기값을 얘처럼 필드에서 선언하면서 바로 주기
final String ssn; // 주민번호 (-> 초기값 없으면 에러납니다. 생성자에서라도 줘야 함)
// 인스턴스 필드
String name;
// 생성자 (생성자는 객체 인스턴스가 실행될 때 실행되는 코드...?) (클래스명과 같게 만들어주세요)
Korea(String ssn, String name) { // 2. 생성자에서 주기
// 초기값 주는 방법은 인스턴스와 똑같음!
this.ssn = ssn;
this.name = name;
}
}
public class KoreaEX {
public static void main(String[] args) {
Korea k1 = new Korea("123456-1234567", "김자바");
// 생성자를 만들어놨기 때문에 매개변수를 두 개 줘야 한다. (ssn, name)
k1.name = "비둘기"; // 인스턴스 필드라 초기값 변경 가능
// k1.nation = "미국"; // 얜 fianl 필드라 안돼요
System.out.println(k1.name);
System.out.println(k1.nation);
System.out.println(k1.ssn);
}
}
[출력 결과]
비둘기
대한민국 (필드에서 준 초기값대로 출력)
123456-1234567 (생성자에서 준 초기값 출력)
주민등록번호 필드(ssn)은 한 번 값이 저장되면 변경할 수 없도록 final 필드로 선언했다.
하지만 주민등록번호는 Korea 객체가 생성될 때 부여된다! 그래서 Korea 클래스 설계할 때 초기값을 줄 수 없었음. → 생성자 매개값으로 받아서 초기값 지정!
nation은 고정된 값을 갖기 때문에 필드 선언 시 "Korea"를 초기값으로 줬다.
불변의 값: 원주율 파이나 지구의 무게 및 둘레 등
불변의 값을 저장하는 필드 = 상수(constant)
불변의 값은 객체마다 저장할 필요가 없는 공용성, 여러가지 값으로 초기화 될 수 없다.
final 필드는 객체마다 저장되고, 생성자의 매개값을 통해서 여러 가지 값을 가질 수 있다. 그래서 상수가 될 수는 없다.
상수 = static이면서 final
객체마다 저장되지 않고, 클래스에만 포함된다.
public class Earth {
// 상수 (변수명은 대문자로 쓴다, 스네이크로 쓴다)
// final: 절대 변경 x, static: 전역 변수
static final double EARTH_RADIUS = 6400; // 지구 둘레
static final double EARTH_SURFACE_AREA; // 지구 면적
// static 블록: static 필드를 초기화 해줄 때 사용
static {
EARTH_SURFACE_AREA = 4 * Math.PI * EARTH_RADIUS;
}
}
public class EarthEX {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 정적 필드를 불러오는 방법: 클래스명.변수명
System.out.println("지구 반지름: " + Earth.EARTH_RADIUS);
System.out.println("지구 표면적: " + Earth.EARTH_SURFACE_AREA);
}
}