인프런 커뮤니티 질문&답변

홍석주님의 프로필 이미지
홍석주

작성한 질문수

스프링 핵심 원리 - 기본편

싱글톤 패턴

스태틱 변수, 메서드에서 인스턴스 생성에 대해 질문드립니다.

작성

·

215

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
안녕하세요 영한님, 좋은 강의 덕분에 재밌게 공부중입니다.
다름이 아니라, 싱글톤 패턴을 적용한 예제 코드를 보면서 하나 궁금한게 있습니다.
private static final SingletonService instance = new SingletonService();
이 라인이 궁금한게, 스태틱 변수에 자기 자신의 인스턴스를 담아서 활용하던데, 스태틱 변수에는 언제 참조가 되어서 인스턴스를 이용할 수 있는걸까요?
생각해보면 public static void main()같은 메인 메서드 블럭에서도 저희는 new 키워드를 통해 자기 클래스 인스턴스를 만들어서 사용하는걸로 기억합니다.
그렇다면 컴파일을 하게 되면 우선 클래스 정보들이 JVM 메서드에 우선적으로 등록이 되고, 이후 static 변수와 메서드들을 처리해서 자기 자신의 인스턴스를 생성해서 이용할 수 있는걸까요?
제가 아직 기본기가 부족하고, 키워드를 찾기가 힘들어서 말론 어떻게 설명드려야할지 어렵네요 ㅠㅠ. 의미 전달이 잘 되었길 바라며, 답변 해주시면 정말 감사하겠습니다!

답변 1

0

안녕하세요, 홍석주 님. 공식 서포터즈 codesweaver 입니다.
.
static 은 애플리케이션 실행시 다른 변수나 메서드보다 먼저 메모리에 올라갑니다(로드).

그리고 메모리는 크게 스택과 힙으로 구분하는데 이 외에 static 메모리를 저장하는 영역이 따로 존재합니다.

그리고 static 영역에 올라간 메모리는 애플리케이션이 종료되기 전까지 계속 메모리에 상주합니다.

..

main() 메서드에 static이 붙은 이유도 위의 특성에서 유추할 수 있습니다.

애플리케이션을 실행한 후 가장 먼저 수행해야 할 코드(엔트리 포인트)가 어디인지를 JVM이 알아야 합니다.

그래서 main() 메서드가 반드시 존재해야 한다고 문법으로 규정하고 있습니다.

.

그런데 main() 메서드가 만약 stiatic 한 메서드가 아니라면?

static이 아닌 main() 메서드를 호출하기 위해 이 main()메서드를 포함한 클래스를 인스턴스로 생성한 뒤 main() 메서드를 호출해야 합니다. 그러면 코드의 시작점(엔트리 포인트)라는 main() 메서드의 존재의의가 없습니다.

.

더 자세한 내용은 지역 변수, 클래스 변수, static 변수 등으로 검색해보시면 답을 찾으실 수 있을거라 생각합니다.

감사합니다.

홍석주님의 프로필 이미지
홍석주
질문자

친절한 답변 감사드립니다.

스태틱들이  먼저 메모리에 올라가게 되면, 자신의 인스턴스 참조는 어떻게 하는지가 좀 이해가 안됩니다.

컴파일이 되면서, 클래스들에 대한 정보도 완성이 되었기에 스태틱 변수가 참조할 수 있었던 걸까요? 

말씀주신 내용들을 더 찾아보면 이해가 될까요 ㅠㅠ

안녕하세요!

static 은 애플리케이션이 실행될 때 메모리에 생성되기에 별도로 사용자가 인스턴스화 할 필요가 없이 사용하면 됩니다.

가령 static 메서드를 사용하기 위해선 {클래스이름}.{스태틱메서드} 로 바로 호출하여 사용할 수 있습니다.

아래의 링크 내용도 참조하시기 바랍니다.

https://vaert.tistory.com/101

 

감사합니다.

홍석주님의 프로필 이미지
홍석주

작성한 질문수

질문하기