백엔드 수업 #06 클래스 - 11 final 필드와 상수

sookyoung.k·2022년 11월 22일
0

final 필드

final의 뜻은 아시잖습니까~! '최종적'이라는 뜻이죠. final필드는 최종적인 필드라는 뜻.

final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없다필는 것이다.

final 필드에 초기값을 주는 방법

  1. 필드 선언 시 준다 (단순 값)
  2. 생성자에서 준다 (복잡한 초기화 코드가 필요하거나 객체 생성 시 외부 데이터로 초기화 해야 할 때)
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"를 초기값으로 줬다.

상수(static final) = 불변의 값

불변의 값: 원주율 파이나 지구의 무게 및 둘레 등
불변의 값을 저장하는 필드 = 상수(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);
	}

}
  • 상수: static final
  • 변수명은 대문자, 스네이크로 작성
profile
영차영차 😎

0개의 댓글