static과 final

이원석·2022년 4월 19일
0

Java

목록 보기
2/9
post-thumbnail

1. static


static 멤버는 클래스에 딱 하나만 생성됩니다. 이때 static 멤버는 객체 내부가 아닌 별도의 공간(method area)에 생성이 되며, 클래스 멤버라고 부릅니다. 일반 객체 내부에 있는 변수가 초기화 될 때는 메서드 영역(Method Area)에 생성이됩니다.

static 멤버는 객체가 생성되기 전 클래스 로딩 시에 멤버가 생성되며, 객체를 생성하지 않아도 사용할 수 있습니다.

객체가 사라져도 static 멤버는 사라지지 않으며 프로그램이 종료될 때 사라집니다.

하나의 클래스에서 생성되는 모든 객체는 static 멤버를 공유합니다.

또한, 클래스는 자바에서 정적으로 선언되지 않으며, 항상 인스턴스화하여 사용됩니다. 따라서 class에는 static 선언이 불가능합니다.





2. java의 main 메소드


public static void main(String[] args){...}

자바의 main 메소드를 보면 static 선언이 되어있는데, main 메서드는 프로그램이 시작될 때 JVM에 의해 호출되어야 하므로, static으로 선언되어야 합니다. 또한, static 멤버는 클래스 로딩(프로그램 시작)시에 메모리에 로드되기 때문에 인스턴스를(객체)를 생성하지 않아도 호출이 가능합니다.

이는 JVM 로딩단계와 관련이있는데, 처음 사용자가 작성한 코드를 실행하면 Compiler가 .java코드를 클래스 파일로(Bytecode)로 변환합니다. 클래스 로더가 클래스 파일을 메모리 영역(RuntimeDataArea)에 로드합니다. RuntimeDataArea 중 MethodArea에서 Class변수가 저장되는데, Static변수 또한 여기에 저장됩니다.





3. final


final 키워드는 변수나 메소드 또는 클래스가 변경 불가능하도록 만듭니다.

  • 변수에 적용 시 : 해당 변수의 값은 변경 불가
  • 참조 변수에 적용 시 : 참조 변수가 힙 내의 다른 객체를 가리키도록 변경할 수 없다.
  • 메서드에 적용시 : 해당 메서드를 오버라이드 할 수 없다.
  • 클래스에 적용 시 : 해당 클래스의 하위 클래스를 정의할 수 없다.

finally

finally라는 키워드도 있는데 보통 try/catch 구문이 종료될 때 항상 실행될 코드블록을 정의하기 위해 사용됩니다. 예를들어 try/catch 구문에서 예외가 발생하여 구문이 종료될 때, 중요한 작업을 종료하지 못한채 구문이 종료될 수 있기 때문에 뒷 마무리를 하는 코드로 작성하는데 사용된다.


finalize()

finalize 메서드는 Garbage Collector가 더 이상 참조되지 않는 객체를 메모리에서 삭제한다고 결정하는 순간 호출된다.

Object 클래스의 finalize() 메소드를 오버라이딩 하여 활용할 수 있다.






[참고문헌]
https://github.com/WeareSoft/tech-interview/blob/master/contents/java.md

0개의 댓글