• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

자신의 클래스에서 자신을 static으로 선언하는 부분 재 질문입니다.

22.03.16 10:42 작성 조회수 399

0

안녕하세요. 앞전에 질문드렸던 내용이 계속 이해되지 않아서 정리 후 재 질문 남깁니다.

먼저 제 생각은 이렇습니다.

애플리케이션이 실행되는 시점에 .java 파일은 .class파일로 바뀌어서 사용되고, static 영역에 static 변수들이 세팅됩니다. 이 두개의 경우 중 적어도 한 경우에 SingletonService 클래스의 private static final SingletonService instance = new SingletonService(); 이 코드가 실행될 수 밖에 없다고 생각합니다.

위의 그림은 해당 코드가 실행될 때를 나타내본 것입니다. 해당 그림의 인스턴스에 들어오는 값들을 보면 static 멤버변수, 메소드, 생성자 등 모든 클래스의 구성요소들이 들어오게 됩니다. 이 중 저는 static 멤버변수 부분이 의아합니다. 

이에 관련되어 두가지 질문사항이 있습니다.

1. static 영역에는 50의 참조값을 가지는 instance 객체가 생성 되었습니다. 하지만 그 인스턴스 실제 값을 보면 private static final SingletonService instance = new SingletonService(); 이 코드가 들어가 있습니다. 이때 저는 `이코드가 무한 반복된다.`, 또는 `이미 instance라는 변수가 static 영역에 선언되어 있기 때문에 에러가 난다.` 두가지 중 하나의 일이 발생할 것으로 추정해 말이 안되는 코드 아닌가라는 의문이 생깁니다. 그럼에도 불구하고 잘 작동하는 것을 보니 제가 생각한 부분이 틀렸고, 모르는 부분이 존재하는 것으로 생각됩니다. 실제로 이 부분이 어떻게 동작하며 실행되는지 자세히 알고 싶습니다.

2. 두번째 질문은 private static final SingletonService instance = new SingletonService(); 이라는 줄이 실행될 때 실행 시점에 관련한 의문입니다. 이 코드가 실행될 시점은 .class 파일을 만들려고 .java 파일을 읽거나 instance 변수를 static 영역에 등록하려고 해당 코드를 실행시키거나 하는 두 시점 중 하나라고 생각이 듭니다. 두 시점 중 해당 코드가 실행되는 순간을 보면, 첫 줄에 멤버변수가 작성되어 있기 때문에 클래스의 뒷 부분인 메소드, 생성자는 아직 존재하지 않는다고 생각합니다. 그렇다면 인스턴스에 값을 채워서 참조값을 올릴때, 인스턴스에 넣을 값이 멤버변수 빼고는 존재하지 않는데 어떻게 코드가 동작하고 있는지에 관련해 의문이 남습니다. 이부분도 제가 모르는 것이 있거나 잘못 알고 있는 부분이 있는 것 같습니다. 관련된 자세한 설명과 동작방식을 알고 싶습니다. 

고맙습니다.

답변 2

·

답변을 작성해보세요.

1

David님의 프로필

David

2022.03.16

안녕하세요. 유진이님, 공식 서포터즈 David입니다.

static 변수의 선언과 초기화, 객체의 생성 과정, 프로그램 코드의 저장 위치에 대한 자세한 내용은 jvm 스펙 문서를 참고해주세요.

감사합니다.

0

유진이님의 프로필

유진이

질문자

2023.12.18

KakaoTalk_20231218_141623328.jpg안녕하세요. 관련 질문을 세 개 정도 올렸었는데, 당시에 이해가 가지 않아서 그냥 넘어갔습니다. 최근 운 좋게 고급 개발자 분의 도움을 받아 어느 정도 이해 된 것 같아 내용을 공유합니다. 제가 제일 이해가 안 갔던 부분은 변수 선언 시 첨부한 그림과 같이 동작할 거라고 생각했기 때문입니다. 즉, 그림 상 보면 private static final SingletonService instance = new SingletonService(); 코드가 무한으로 호출되는 반면, static final로 선언되면 한 번 생성되고 끝이라는 개념이 서로 상충됐습니다. 결과적으로 class안에 instance, getInstance, SingletonService, logic은 마치 묶여있는 것 같지만, 실제로는 각자의 영역에 따로 존재하는 것이기 때문에 private static final SingletonService instance = new SingletonService(); 코드는 한 번 실행되고 더 이상 존재하지 않는 것이라고 이해했습니다. 즉, instance 안에는 getInstance, SingleTonService, logic 세 메서드만 존재한다는 말로 이해했습니다. 더 나아가면 getInstance도 static으로 선언됐으니, 실제로는 instance 객체 안에서 포함된 것은 SingletonService, logic 두 메서드겠죠. 정확한 개념인지는 모르겠지만 제가 이해한 내용이 도움이 될까 해서 공유합니다. 감사합니다.