JAVA

221013 final키워드와 상수

주영재 2022. 10. 13. 14:56

final(변경 금지의 규제)
final 키워드는 클래스, 메서드, 변수에 적용되며 abstract와 동시에 사용될 수 없다.
final이 들어가는 자리는 접근제한자 뒤, static 뒤.

final 클래스-상속 불가
final 메서드-오버라이딩 불가
final 변수-값 변경 불가

final 클래스의 대표적인 예가 String 클래스. 사용자자가 임의로 클래스를 상속받아 메서드를 재정의하는것을 방지하기 위함.
클래스에 final이 붙지 않았다면 상속은 가능. 따라서 자식클래스에서 final메서드의 참조는 가능. 오버라이딩이 안되는 것
final변수는 선언시에 초기화하는 방법, 생성자를 통해 초기화하는 방법이 있음
만약 초기화하지 않으면 컴파일 에러가 발생

 

부모

package day09.final_.method;

public /*final 상속금지*/ class Parent {
	
	public void method01() {}
	
	public final void method02() {}//오버라이딩 금지

}

자식

package day09.final_.method;

public class Child extends Parent{
	
	public void method01() {}
	//public final void method02() {}//오버라이딩 불가. 참조는 가능
	
}

method02는 final이기때문에 오버라이딩이 불가능. but 참조는 가능

 

 

 

 

 

상수(constant-static final)
final은 상수라고 표현하지 않는다.
(자바 상수-불변의 값을 저장하는 필드)
왜? 생성자를 만들면 객체마다 다르게 할 수 있긴 함.

상수는 어떻게 만드는가?
static final
1개만 만든다, 변경을 금지한다

-public까지 붙이는게 관례

public static final
-상수 이름은 모두 대문자로 작성하는 것이 관례. 연결된 단어라면 (_)로 단어들을 연결함

(변수는 소문자로 적었다. 상수<->변수)


ex)
public static final long VERSION=1L;

 

final

package day09.final_.field;

public class Person {
	
	/*
	 * final변수는 값을 변경할 수 없기 때문에 
	 * 직접 초기값을 지정하거나 or 생성자를 통해서 초기화를 해야합니다.
	 */
	
	public final String nation="대한민국";
	public final String ssn;
	public String name;
	
	
	public Person(String ssn, String name){
		this.ssn=ssn;
		this.name=name;
	}
}

상수 constant

package day09.final_.field;

public class Constant {
	
	public static final double PI=3.14;
	public static final long EARTH_RADIUS=6371L;
	public static final int O2=32;
	

}

이 클래스에 있는 변수들은 전부 상수. 

 

main

package day09.final_.field;

public class MainClass {
	public static void main(String[] args) {
		
		Person hong = new Person("123123-123123","홍길동");
//		hong.nation="아메리카";//값의 변경 금지
//		hong.ssn="33333333";//값의 변경 금지
		
		Person park = new Person("222222-222222","박찬호");
		
		System.out.println(hong.ssn);
		System.out.println(park.ssn);
		
		
		//상수의 사용
		System.out.println(Constant.EARTH_RADIUS);
		System.out.println(Constant.PI);
		System.out.println(Math.PI);
		System.out.println(Math.E);

	}

}
123123-123123
222222-222222
6371
3.14
3.141592653589793
2.718281828459045

final은 변경이 불가능하다. 그래서 선언시에 초기화하거나 생성자를 통해 초기화하는 것만 가능

이때 ssn처럼 선언시에 초기화를 하지 않은 건 생성자를 통해 초기화하는것이 가능하므로 객체마다 다름

따라서, final은 상수가 아닌 것.

 

 

상수의 사용은 static이니 클래스명으로 호출