JAVA의 final 과 static을 클래스, 메소드, 변수에 사용할 때의 차이점과 용도에 관한 정리입니다.
* final 변수란?
변수를 상수화 시킨다. 즉 한번 값이 결정된 변수의 값은 변경이 불가능하다.
* final 클래스란?
클래스를 final로 선언한다면, 이 클래스를 상속하는 것을 허용하지 않겠다는 뜻이다.
대표적으로 String 클래스가 있다.
* final 메소드란?
메소드를 final로 선언한다면, 이 메소드의 오버라이딩을 허용하지 않겠다는 뜻이다. 클래스는 상속이 가능하되 해당 메소드는 오버라이딩이 불가능하다.
* static 변수란?
static 으로 선언된 변수는 메모리 공간에 하나만 존재하며, 어디서나 접근이 가능한 변수이다.
어디서나 접근이 가능하려면 static 변수도 public으로 선언되어야 한다.
- 클래스 내부에서는 얼마든지 직접 접근이 가능하다.
- 클래스 외부에서 인스턴스의 이름이나 클래스의 이름을 통해 접근하는 것도 가능하다. (defalut 변수 일땐 동일한 패키지로 묶였을 경우)
* static 변수의 초기화 시점
static 변수는 인스턴스가 생성되기 이전에 별도의 메모리 공간에 할당되어 초기화까지 완료된다.
초기화되는 시점은 JVM(Java Virtual Machin) 에 의해서 클래스가 메모리 공간에 올라가는 순간이다.
* static 변수 사용 이유
인스턴스 간에 데이터 공유가 필요한 상황에서 static 변수를 선언한다.
* static final 선언
클래스 내부 또는 외부에서 참조의 용도로만 선언된 변수는 static final로 선언한다.
ex ) static final double PI = 3.14;
* static 메소드란?
인스턴스를 생성하지 않아도 static 메소드를 호출할 수 있다.
사용 이유는 객체를 생성할 필요가 없는 메소드에 붙인다. 인스턴스 변수에 접근하지 않는다면 static 메소드로 정의해야 한다.
* public static void main
main 메소드는 인스턴스의 생성과 관계없이 JVM에 의해 호출이 되므로 반드시 static 으로 선언해야 한다.