221013 final키워드와 상수
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이니 클래스명으로 호출