Java에서 정적, 전역이란 의미로 사용된다. static으로 선언된 값은 Method memory에 할당되며 프로그램이 끝날 때 까지 계속 유지된다. static이란 키워드로 static변수(정적 필드, 클래스 변수)와 static메소드(정적 메소드)를 만들 수 있고 이 둘을 합쳐 정적 멤버(=클래스 멤버)라고 한다.
정적필드와 정적메소드는 객체에 소속된 멤버가 아니라 클래스에 고정된 멤버이다. 컴파일 이후 클래스가 바이트코드로 바뀐 후 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리된다. 따라서 클래스의 로딩이 끝나는 즉시 사용할 수 있다.
- 인스턴스를 생성하면, 각 인스턴스들은 서로 다른 독립적인 메모리를 할당받기 때문에 서로 다른 값을 가진다.
- 인스턴스들이 공통적인 값이 유지되어야 하는 경우에 static을 사용한다.
- 이미 메소드 메모리에 올라가 있기 때문이다.
- static이 붙은 메소드에서 인스턴스 변수 사용을 허용하지 않는다. -> 메소드를 호출할 때 인스턴스가 생성되어 있는지 아닌지 확신할 수 없기 때문이다.
- 하지만 반대로 인스턴스 변수, 인스턴스 메소드에서는 static이 붙은 멤버들을 사용가능하다.
- 메소드 호출시간이 짧아지기 때문에 좋다.
Java에서 final은 변수, 메소드, 클래스에 사용할 수 있다. final은 단 한 번만 할메모리가 할당 될 수 있다는 뜻이다. 그래서 final == 상수는 옳지 않다.
해당 변수는 생성자나 대입연산자를 통해 한 번만 초기화가 가능하다는 것을 의미한다.
상속 시 해당 메소드를 재정의(override) 할 수 없다.
해당 클래스를 상속할 수 없다. String 클래스 처럼 상속 계층 구조에서 마지막 클래스가 된다.
유지보수 차원에서 좋다.
static final사용해 상수를 만들면 클래스에 존재하는 단 하나의 상수라는 뜻이다.
Java Compiler가 compile시에 static을 보면 해당 변수, 메소드, 클래스에 대해서 초기화를 강제한다. Application 런타임 동안 바뀌지 않을 변수에 대해 초기화를 강제하는 것이다. 여기에 final까지 붙이면 Application 런타임 동안 맨 처음 초기화된 값이 바뀌지 않는걸 보장한다.
그래서 상수다.
이것을 사용할 때는 생성자를 막아놔야 한다. 기본 생성자를 private으로 선언한다.
왜냐하면 사용자에게 정적 팩토리 메소드로 인스턴스를 생성할 수 밖에 없게끔 강제하고 싶기 때문이다.
이 정적 팩토리 메소드는 디자인 패턴의 팩토리 메소드와는 다른 것이다.
정적 팩토리 메소드는 생성자에 대한 내용이고, 디자인 패턴의 팩토리 메소드는 클래스에 대한 내용이다.