Java static 과 final
static & final
Java의 non-static 멤버와 static 멤버의 차이
non-static 멤버
- 공간적 특성: 멤버는 객체마다 별도로 존재한다.
- 인스턴스 필드는 객체 내부에 생성이 된다. 객체는 저장공간이 힙 메모리에 위치한다.
- 따라서 인스턴스 필드를 사용하기 위해서는 stack 영역에 참조변수를 사용해야한다.
- 시간적 특성: 객체 생성 시에 멤버가 생성된다.
: non-static 맴버란 객체마다 별도로 존재하며 객체 내부에 생성이 됩니다. 객체는 힙 영역에 생성이 되기 때문에 인스턴스 필드를 사용하기 위해서는 stack 영역에 참조변수를 사용해야 합니다.
static 멤버
- 공간적 특성: 멤버는 클래스당 하나가 생성된다.
- static 맴버는 객체 내부에 생성이 되는 것이 아닌 클래스 영역에 생성이 된다.
- 시간적 특성: 클래스 로딩 시에 멤버가 생성된다.
- 객체가 생기기 전에 이미 생성된다.
- 객체가 생기기 전에도 사용이 가능하다. (즉, 객체를 생성하지 않고도 사용할 수 있다.)
- 객체가 사라져도 멤버는 사라지지 않는다.
- 멤버는 프로그램이 종료될 때 사라진다.
- 공유의 특성: 동일한 클래스의 모든 객체들에 의해 공유된다.
: static 맴버는 클래스 당 하나만 생성이 되며 static 맴버는 객체 내부에 생성이 되는 것이 아니라 클래스 영역에 생성이 됩니다. 클래스 로딩 시에 생성이 되고 동일한 클래스의 모든 객체들에 의해 공유 됩니다.
Java의 main메서드가 static인 이유
main 메소드는 Java가 실행되면 가장 먼저 실행되는 메소드입니다.
main 메소드가 실행되기 위해서는 메모리에 미리 올라가야합니다. 따라서 static 을 붙여서 java 프로그램이 실행하기 전에 첫 단계로 메모리에 올리는 것입니다.
Java의 final 키워드 (final / finally / finalize)
- final 키워드
- 개념: 변수나 메서드 또는 클래스가 ‘변경 불가능’하도록 만든다.
- 원시(Primitive) 변수에 적용 시
- 해당 변수의 값은 변경이 불가능하다.
- 참조(Reference) 변수에 적용 시
- 참조 변수가 힙(heap) 내의 다른 객체를 가리키도록 변경할 수 없다.
- 메서드에 적용 시
- 해당 메서드를 오버라이드할 수 없다.
- 클래스에 적용 시
- 해당 클래스의 하위 클래스를 정의할 수 없다.
- finally 키워드
- 개념: try/catch 블록이 종료될 때 항상 실행될 코드 블록을 정의하기 위해 사용한다.
- finally는 선택적으로 try 혹은 catch 블록 뒤에 정의할 때 사용한다.
- finally 블록은 예외가 발생하더라도 항상 실행된다.
- 단, JVM이 try 블록 실행 중에 종료되는 경우는 제외한다.
- finally 블록은 종종 뒷마무리 코드를 작성하는 데 사용된다.
- finally 블록은 try와 catch 블록 다음과, 통제권이 이전으로 다시 돌아가기 전 사이에 실행된다.
- finalize() 메서드
- 개념: 쓰레기 수집기(GC, Garbage Collector)가 더 이상의 참조가 존재하지 않는 객체를 메모리에서 삭제하겠다고 결정하는 순간 호출된다.
- Object 클래스의 finalize() 메서드를 오버라이드해서 맞춤별 GC를 정의할 수 있다