자바 static 정리

자바 static 정리

자바 static 을 간단하게 정리 하고 가야

마음이 편할 거 같아 급하게 정리 해 보려고 한다.

일단 static 은 다양한 곳에 사용할 수 있는데 오늘은

변수와 메서드에 붙은 static 만 말하려고 한다.

어짜피 static 의 특성을 알면 나중에 변수와 메서드 외에

다른 곳에 쓰이는 것을 보아도 금방 이해할 수 있을 것이다.

일단 static 이 붙은 변수나 메서드는 저장되는 영역이 다르다.

원래 변수나 메서드는 객체가 생성 되면 그 때 해당 객체를

이루는 구성요소로 힙 영역에 값이, 그리고 메서드의 실행 주소가

저장 되게 된다.

하지만 static 이 붙는 순간 객체 소속이 아닌 클래스 소속으로

프로그램이 컴파일 된 후 jvm 에 의해 실행되기 전 클래스로더에

의해 class 영역(static 영역) 에 클래스와 함께 올라가게 된다.

즉 객체, 인스턴스 소속이 아닌 클래스 소속이 되는 것이다.

해서 프로그램의 시작과 끝을 클래스와 같이 하게 된다.

특징으로는 모든 스레드가 공유하는 class 영역인 만큼

static 이 붙은 변수와 메서드 역시 모든 스레드가 접근하게 된다.

이는 동시성 문제를 가져올 수도 있다.

그리고 객체.변수, 객체.메서드() 이렇게 접근 하는 것이 아닌

클래스 소속이기 때문에 클래스.변수, 클래스.메서드() 이렇게

접근하게 된다. 해서 객체를 생성 해도 static 변수와 메서드는

전혀 영향을 받지 않게 된다. 객체와는 상관 없어 지는 것이다.

해서 static 메서드를 사용할 때 일반 객체 소속의 필드나

메서드는 사용할 수 없는 것이다. 그 이유는 static 메서드가

실행될 때 객체가 생성이 되지 않았을 수 있기 때문이다.

static 메서드는 프로그램이 실행 되기 전 이미 메모리에

올라와 호출 할 수 있는 상태가 된다.

이 때 그 안에서 일반 메서드를 사용하고 있으면,

컴파일러 입장에서는 메모리에 올라와 있지도 않는

메서드를 찾아 실행할 방법이 없기 때문에 이는 불가능하다.

main 메서드에서 일반 메서드를 호출 할 수 없는 이유와 같다.

static 메서드인 main 메서드 입장에서는 객체가 생성되지 않았다면

실행 시킬 수 없는 것이나 마찬가지이기 때문이다.

그리고 이러한 static 의 특성으로 인해 main 메서드는 static 메서드여야 한다

당연히 프로그램의 시작이어야 하기 때문에 객체가 생성되지 않아도

프로그램이 실행 되기 위해서는 static 메서드여야 가능하기 때문이다.

클래스가 로드 될 때 같이 로드 되어 인터프리터가 실행한다.

정리

1. static 은 클래스 소속으로, 클래스와 그 생명주기를 같이 한다.

2. 그렇기에 클래스는 전역적으로 사용 되며, 언제나, 어디서든 접근 가능하다.

3. 객체와는 상관 없다. 애초에 생성 되는 메모리 영역이 다르고,

객체가 생성 될 때 따라서 생성 되지도 않는다.

4. static 변수와 메서드를 남발 하는 것은 좋지 않다.

동시성 문제를 야기 할 수 있다. 즉 멀티 스레드 환경에서

어떤 스레드가 언제 해당 static 변수의 값을 변경하는지를

찾기 매우 힘든 경우에 해당한다.

5. static 메서드에서 일반 멤버변수 및 메서드를 호출해

사용할 수 없다. 이유는 간단하다. 객체가 생성 되지 않은

상태에서 호출 하거나 접근 할 수 있는 근거가 없다.

알 수가 없다. 객체가 생성 되야 생성 되기 때문에.

6. 이러한 static 의 특성으로 main 메서드는 static 이어야 한다.

가장 먼저, 자신이 소속 된 클래스의 인스턴스화와는 별개로

실행 되어야 하기 때문에. 프로그램의 시작점 이기 때문이다.

오늘은 이정도로 적어 놓으면 마음이 편할 거 같다.

이 뭔가 하지 않으면 오는 강력한 찝찝함 덕분에

몰입 하고 움직이는 거 같다. 중요한 일이라는거겠지.

from http://win-fly.tistory.com/3 by ccl(A) rewrite - 2021-09-17 20:27:45