본문 바로가기

Java/Study

Ch6 클래스 - final 필드와 상수

final 필드

초기값이 저장되면 이것이 최종값이 되어 프로그램 실행 도중에 수정할 수 없다.

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

 

final 필드의 초기값을 줄 수 있는 방법은 1. 필드 선언 시 2. 생성자에서(복잡한 초기화 코드 혹은 객체 생성 시 외부 데이터로 초기화) 두 가지이다.

만약 초기화되지 않은 final이 남아있으면 컴파일 에러가 발생한다.

객체마다 저장되고, 생성자의 매개값을 통해서 초기값이 여러 가지 값을 가질 수 있다.

 

 

package p4;

public class Person {
	final String nation = "Korea";
	final String ssn;
	String name;
	
	public Person(String ssn, String name) {
		this.ssn = ssn;
		this.name = name;
	}
	void method() {
		/*nation = "usa"; //당연하게 같은 클래스 내에서도 불가.
		ssn = "998";*/
		name = "김연아";
	}
}
==========================================
package p4;

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";
//		p1.ssn = "654321-7654321";
		p1.name = "을지문덕";
	}
}

 

상수(Static final)

변하지 않는 수, static final로 불변의 값을 캡슐화한 것

ex. 은행 대출 - 금리: 1~6         0.014        7~12       0.0157  → 금리를 상수에 저장한다.

 

final 필드와는 달리, 불변의 값 상수는 객체마다 저장할 필요가 없는 공용성을 띠고 있으며 여러가지 값으로 초기화될 수 없다.

객체마다 저장되지 않고, 클래스에만 포함된다. 한 번 초기값이 저장되면 변경할 수 없다.

static final의 초기값을 주는 방법은 1.필드선언 시 2.정적블록 두 가지이다.

static final 타입 상수;              //상수 이름은 대문자 여러 단어라면 _로 연결한다.
static {
     상수 = 초기값;
}

 

오류 예시

package p5;

public class Earth {
	final static double EARTH_RADIUS = 6400; //fianl과 static위치는 바뀌어도 상관없음
	static final double EARTH_SURFACE_AREA; //상수화. 값도 안넣었는데 상수처리하니까 에러

	void mm() {
		 EARTH_SURFACE_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;
	} //상수화부터 하고 값을 바꿀 수 없음
    
}

 에러 수정

package p5;

public class Earth {
	final static double EARTH_RADIUS = 6400;
	static final double EARTH_SURFACE_AREA; 

	static {
		EARTH_SURFACE_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;
	}
}

=================================

package p5;

import java.util.Calendar;

public class EarthExample {

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

		Calendar.getInstance();
		System.out.println(Calendar.YEAR); //YEAR 상수처리되어있음
		System.out.println(Calendar.AM_PM);
	}
}

 

'Java > Study' 카테고리의 다른 글