이것이 자바다 6장 - final, 상수

오늘·2021년 3월 7일
0

Java

목록 보기
14/42
post-custom-banner

final 필드와 상수

final 필드

최종적 이라는 뜻의 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)

  • 일반적으로 불변의 값을 상수라 부른다. final 필드는 객체마다 저장되고, 생성자의 매개값을 통해 다른 값들을 가질 수도 있기 때문에 상수가 될 수 없다. 상수는 static 이면서 final 이여야 한다.
// 단순 값일때
static final 타입 상수 [= 초기값];

// 복잡한 초기화의 경우 정적 블록에서 할 수는 있음
static final 타입 상수;
static {
	상수 = 초기값;
}
  • static final 필드는 객체마다 저장되지 않고, 클래스에만 포함되며, 한 번 초기값이 저장되면 변경할 수 없다.
// 상수 선언
// 일반적으로 불변의 값을 상수라 부른다.
// 지구의 둘레, 은행의 정해진 금리 등
// 불변 값을 캡슐화

// 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");
	}
}
post-custom-banner

0개의 댓글