Static
static은 고정된 이라는 뜻이다. 메모리를 공유하여 사용하기 때문에 필요할때 바로바로 호출하거나 데이터를 가져올 수 있게 된다.
즉, 객체 생성없이 사용할 수 있는 필드와 메소드를 생성하고자 할 때 활용한다.
공용데이터에 해당하거나 인스턴스 필드를 포함하지 않는 메소드를 선언하고자 할 때 이용한다.
Final
final은 최종적인 이라는 의미이다.
즉, 해당 변수는 값이 저장되면 최종적인 값이 되므로, 수정이 불가능하다는 의미이다.
주로 상수로 변수를 사용하기 위해 사용하거나 오버라이딩을 막기 위해 사용한다. 만약 클래스에 final을 사용하면 상속을 막아준다.
따라서 변수, 함수, 클래스의 명시적 제한을 나타내기 위해 사용하며, 이를 통해 다양한 팀 협업시 코드의 가독성을 높여주는 효과를 얻을 수 있다.
Static Final
두개를 합쳐서 생각해보면 고정되어 최종적으로 사용된다고 보면된다.
즉, 클래스 자체에 존재하는 단 하나의 상수이다.(클래스자체로 존재하여 접근가능하고 불변하다)
따라서 클래스의 선언과 동시에 반드시 초기화가 필요한 클래스 상수이다.
메모리상에서의 이슈
실제 JVM위에서 돌아가는 메모리는 각 영역마다 다른 속성들을 저장한다.
메소드 영역 : 클래스에 대한 정보와 함께 클래스 변수가 저장된다. 클래스파일(*.class)를 읽어들여 해당 클래스의 정보를 저장한다.
만약 메소드나 변수에 static키워드를 붙이면 메소드 영역에 해당 데이터가 저장된다. 단, static영역에서는 GC(Garbage Collector)가 작동하지 않아서 시스템 종료시까지 계속 메모리에 남게 되고 시스템에 퍼포먼스 측면에서 악영향을 미칠 수 있다.
힙영역 : 자바 프로그램에서 생성된 모든 인스턴스 변수가 저장된다. new 키워드를 사용하여 인스턴스가 생성되고 힙영역에 저장한다.
스택영역 : 메소드가 실행될때 호출과 관계되는 지역 변수나 매개 변수를 저장한다. 스택은 선입후출로 동작한다. 메모리에는 한계가 있기 때문에 계속해서 재귀(함수안에 함수)를 수행하면 스택에 함수정보가 계속 저장되어 문제가 발생할 수 있다.
래퍼런스
http://www.tcpschool.com/java/java_array_memory
https://mangkyu.tistory.com/47
https://blog.lulab.net/programming-java/java-final-when-should-i-use-it/
'개발' 카테고리의 다른 글
[스프링] DI (Dependency Injection) (0) | 2022.04.18 |
---|---|
JAVA의 스레드를 공부하자 (0) | 2022.02.26 |
[TDD] 자바와 JUnit을 활용한 실용주의 단위 테스트 (작성중) (0) | 2022.02.24 |
[JUnit5] JUnit5를 공부해보자(Spring Boot, REST API) (0) | 2022.02.24 |
JAVA의 Servlet이 뭐지? (0) | 2022.02.19 |