최종적 이라는 뜻의 final 처럼, final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어 프로그램 실행 도중에 수정할 수 없다는 것이다.
// 선언방법
final 타입 필드 [=초기값];
final 필드의 초기값을 줄 수 있는 방법은 딱 두가지이다.
-첫번째, 필드 선언 시주는 방법
-두번째, 생성자에서 준다
단순값이라면 필드 선언 시 주는 것이 가장 간단하지만, 복잡한 초기화 코드가 필요하거나 객체 생성 시에 외부 데이터로 초기화해야한다면 생성자에서 초기값을 지정해야 한다.
// final 필드 선언과 초기화------------------------------------
// final 필드
// 최종적인 값을 갖고 있는 필드 = 값을 변경할 수 없는 필드
public class Final245 {
final String nation = "Korea";
final String ssn;
String name;
public Final245(String ssn, String name) {
this.ssn = ssn;
this.name=name;
}
// 같은 메소드 내에서도 변경은 불가
void mehtod() {
// nation = "usa";
// ssn = "143566-4315462"
name = "철수";;
}
}
// final 필드 테스트-----------------------------------------
public class Final246 {
public static void main(String[] args) {
Final245 fi = new Final245("123456-1234567", "홍길동");
System.out.println(fi.nation);
System.out.println(fi.ssn);
System.out.println(fi.name);
// final 설정한 필드는 값 수정이 불가하다
// fi.nation = "usa";
// fi.ssn = "143566-4315462"
fi.name = "철수";
System.out.println(fi.name);
}
}
// 단순 값일때
static final 타입 상수 [= 초기값];
// 복잡한 초기화의 경우 정적 블록에서 할 수는 있음
static final 타입 상수;
static {
상수 = 초기값;
}
// 상수 선언
// 일반적으로 불변의 값을 상수라 부른다.
// 지구의 둘레, 은행의 정해진 금리 등
// 불변 값을 캡슐화
// final필드는 객체마다 저장되고,
// 생성자의 매개값을 통해 여러가지 값을 가질 수 있다
// static fianl 필드는 객체마다 저장되지 않고, 클래스에만 포함된다.
// 한 번 초기값이 저장되면 변경할 수 없다
// static 메소드로만 값 설정이 가능하다
public class StaticFinalEx {
static final double EARTh_RADIUS = 6400;
static final double EARTH_SURFACE_AREA;
static {
EARTH_SURFACE_AREA = 4 * Math.PI * EARTh_RADIUS * EARTh_RADIUS;
}
// 아래는 불가능한 모습
// static이 아닌 다른 메소드에서 값을 지정해주는 것은 안됨
// void StaticFinalEx{
// EARTH_SURFACE_AREA = 4 * Math.PI * EARTh_RADIUS * EARTh_RADIUS;
// }
// }
// 상수 사용----------------------------------------------------------------
public class StaticFinalEx1 {
public static void main(String[] args) {
System.out.println("지구의 반지름 : " + StaticFinalEx.EARTh_RADIUS + " km");
System.out.println("지구의 표면적 : " + StaticFinalEx.EARTH_SURFACE_AREA + " km");
}
}