티스토리 뷰

자바

[Java] static 키워드가 뭘까?

김쓰로그 2023. 10. 6. 16:07

출처 : https://devopedia.org/java-modifiers

Java에서 static

Java에서 'static' 키워드는 클래스 레벨에서 사용되며, 해당 클래스의 모든 인스턴스가 공유하는 필드 또는 메서드를 정의하는 데 사용된다. 'static' 필드(정적변수)는 클래스가 로드될 때 한 번 할당되며, 프로그램이 종료될 때까지 메모리에서 해제되지 않는다.

 

그럼 static은 어디서 어떻게 사용될까?

Static 필드(클래스 변수, 정적 변수)

Static 필드는 클래스의 모든 인스턴스에 공유되는 변수이다. 클래스 당 하나를 가지고 있다.

변하지 않는 상수를 지정할 때 위와 같이 static final로 지정해서 사용한다.

그러면 여러 인스턴스가 하나의 클래스변수를 가지며 메모리 사용측면에서 이점을 가질 수 있다.

주의!!

위의 코드처럼 String을 static final로 사용할 때는 public으로 사용해도 된다고 생각한다. 
왜나하면 String은 애초에 불변클래스이고 final을 붙임으로서 외부에서 수정을 할 수 없기 때문이다. 
하지만 다른 클래스의 경우 완전한 불변이 아닌 경우가 있다.(가령 Data 클래스) 
그렇기 때문에 private 접근제어자로 등록하고 해당 필드에 대해 
필요한 작업만을 메서드로 만들어 접근할 수 있도록 하는 것이 좋다.

Static 메서드(정적 메서드)

Static 메서드는 인스턴스를 생성하지 않고도 호출할 수 있는 메서드이다. 주로 유틸리티 메서드 또는 팩토리 메서드로 사용된다. Java에서 지원되는 다양한 클래스에서 찾아볼 수 있다.(Integer, Math 등등..)

Math 클래스의 max 메서드

여기서 중요한 점은 static 메서드는 클래스의 일반적인 내부 필드에는 접근할 수 없다. 왜냐하면 일반 필드는 클래스의 인스턴스가 생성될 때 할당되기 때문이다. 그렇기에 static으로 설정된 필드(클래스 변수) 또는 전달된 파라미터에 대한 접근만 허용된다.

주의사항

JVM의 메서드 영역에 할당되기 때문에 GC(Garbage Collector)의 관리 대상이 아니다. 그래서 무분별한 사용을 하거나 클래스변수가 크기가 큰 객체를 참조한다면 메모리 누수의 원인이 될 수도 있다.

 

또한, 멀티쓰레드 환경에서 동기화 문제가 발생할 수도 있다. 여러 쓰레드가 동시에 접근하고 수정하기 때문에 문제가 발생할 수 있다. 'static' 필드르 수정하는 메서드를 작성할 때는 쓰레드 안정성에 주의해야 한다. 'synchronized' 키워드를 사용하여 수정작업 한 번에 하나의 쓰레드만 접근할 수 있도록 막거나 'java.util.concurrent' 패키지의 동기화 클래스 및 메서드를 사용하여 공유 자원에 대한 동시 접근을 제어해야 한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함