불변 변수는 한 번 초기화된 후에는 해당 변수의 값이 변경되지 않는 변수
일반적으로 자바에서는 'final'키워드를 사용하여 변수를 불변으로 선언
불변 변수는 단순히 값을 변경할 수 없는 변수를 의미하고 그 값은 객체일수도 원시 데이터 타입일 수도 있다
final 키워드는 변수, 메서드, 클래스에 사용될 수 있다.
public static void main(String[] args) {
final int immutableValue = 30;
immutableValue = 25;
}

일반적으로 final 변수를 선언하는 이유는 프로그램 전체에 걸쳐 사용되는 경우가 많아서 특정 메소드 내부에서 선언하기 보다 클래스에 static 키워드와 함께 정의되어 사용된다.
public class Fruit{
static final int COUNT = 10;
static final double PI = 3.14;
static final String FILE_NAME = "index.html";
public static void main(String[] args){
}
}
오버라이딩이 불가능하다.
상속 받은 그대로 사용해야 한다
class Parent{
public final void finalMethod(){
System.out.println("final Parent Method");
}
}
class Child extends Parent{
@Override
public final void finalMethod(){
System.out.println("final Child Method");
}
}

상속이 불가능하다.
서브 클래스를 만들 수 없다.
final class FinalClass {
public void someMethod() {
System.out.println("This is a method in the FinalClass.");
}
}
class ChildClass /*extends FinalClass*/ {
// 이 부분에서 컴파일 오류 발생
}
static은 '고정된' 또는 '공통적인'의 의미
즉 모든 객체가 공유하는 값
모든 객체들이 공유해야 하지만, 각 객체마다 가지고 있을 필요는 없는 멤버를 사용해야 할때 사용
(불필요한 메모리 사용을 막기 위해서)
메모리에 고정적으로 할당된다.
: 프로그램이 시작되면 메모리에 static영역에 static 키워드가 붙은 멤버들이 클래스와 함께 자동으로 생성된다.
객체의 생성 없이 사용할 수 있다.
Static 메서드 내에서는 인스턴스 변수를 사용할 수 없다.
public class Static {
public static String classVar = "classVar";
public String instanceVar = "instanceVar";
public static void main(String[] args) {
System.out.println(Static.classVar); // OK
System.out.println(Static.instanceVar); // ERROR
}
}
public class Static {
public static String classVar = "classVar";
public String instanceVar = "instanceVar";
public void ClassMethod() {
System.out.println(classVar); // ok
System.out.println(instanceVar); // ok
}
public static void StaticMethod() {
System.out.println(classVar); // ok
System.out.println(instanceVar); // error
}
불변객체(Immutable Object)
불변 객체는 객체 지향 프로그래밍에서 사용되는 개념으로 객체의 상태를 변경할 수 없는 객체를 나타낸다.
불변 객체는 객체가 한 번 생성되면 그 상태를 변경할 수 없으며, 변경하고자 한다면 변경된 상태의 새 객체를 생성해야 한다.
단순히 final 키워드를 사용한다고해서 불변객체를 만드는 것은 아니다.
(TO DO 불변 객체를 생성하는 방법..)
불변객체 사용지 장점
1. Thread-safe하여 멀티 쓰레드 환경에서 동기화를 고려하지 않아도 된다.
2. 불변객체를 멤버변수로 사용할 때 방어적 복사가 필요없다.
3. 불변객체는 내부 상태가 변경되지 않으므로, Map Key와 Set의 요소로 사용하기 적합하다.
4. 불변객체를 한번 메모리 할당하게 되면 같은 객체를 계속 호출할때 새롭게 할당하지 않아도 되므로 GC의 성능을 높힐 수 있다.