<JAVA> final 이란?
<JAVA> final 이란 ?
변하지 않는 값
1. final 이란 ?
- 일단 초기화 되고 나면 절대 그 값을 변경할 수 없음
 
final String finalStr = "finalStr";
finalStr = "change finalStr"; 			// ** 오류 발생 **
2. 사용될 수 있는 곳
| 이름 | 설명 | 
|---|---|
| 클래스 | 변경될 수 없는 클래스, 확장 될 수 없는 클래스 | 
| 메서드 | 변경될 수 없는 메서드, 상속으로 오버라이딩을 통해 재정의 될 수 없다 | 
| 멤버변수 | 상수 | 
| 지역변수 | 상수 | 
3-1. 클래스
- final 이 붙어 있는 클래스는 상속 불가
 - 다른 클래스에서 상속하여 재정의할 수 없음
 - 보안이나 효율성에서 장점이 있음
 - EX) Integer 과 같은 랩퍼(Wrapper) 클래스
 
final class Test {
}
class Test2 extends Test{ // ** 오류 발생 **
}

3-2. 메서드
- override 제한
 - 상속 받은 클래스가 해당 클래스를 수정하지 못하도록 함
 
class Test {
    void TestMethod() { System.out.printf("TestMethod"); }
    final void testMethod2() { System.out.printf("TestMethod2"); }
}
class Test2 extends Test {
    void TestMethod() { System.out.printf("overriding TestMethod"); }
    void testMethod2() { System.out.printf("overriding TestMethod2"); } // ** 오류 발생 **
}

3-3. 멤버변수 / 지역변수
- 
    
한 번 값을 할당하면 수정할 수 없음
 - 
    
무조건 값이 할당되어야 함. 아니면 에러 발생
 
초기값을 주는 방법
- 변수 선언 시 할당
 - 생성자를 통해 할당
 
class Test {
    final String finalVar1 = "finalVar1"; // 1. 변수 선언시 할당
    final String finalVar2;
    final String finalVar3; // ** 값이 할당되지 않은 경우 에러 발생 **
    
    public Test() {
        finalVar2 = "finalVar2"; // 2. 생성자를 통해 할당 
    }
}
3-4. 파라미터
- 파라미터로 넘어온 값 수정 불가능
 
class Test {
    public String returnStr(final String str) {
        str = "change"; // ** 에러 발생 **
        return str;
    }
}

4. static 과 final
- 모든 객체가 공유하는 불변의 값
 - 보통 같이 많이 사용함
 
EX) PI 값 public static final PI = 3.14;