작성
·
233
0
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
public class ClassGrade {
public static final ClassGrade BASIC = new ClassGrade();
public static final ClassGrade GOLD = new ClassGrade();
public static final ClassGrade DIAMOND = new ClassGrade();
}
안녕하세요. 열거형 파트 부분에서 상수가 인스턴스를 생성할때
public static final ClassGrade BASIC = new ClassGrade(); 이렇게 생성하면,
그 BASIC 이 참조하는 인스턴스는 내부에 상수(BASIC, GOLD, DIAMOND)를 또 갖고있는데, 그 상수가 인스턴스를 무한 생성하게 되지 않나요? 않는다면 이유는 뭔가요?
답변 1
1
ClassGrade를 딱 한번만 로딩 한다고 하셨는데, 이유는 학습한 내용대로 '상수는 메서드 영역에 있기 때문'인가요?
인과 관계가 "A이기 때문에 B이냐" 라기 보다는 B는 A에 포함되는 대상 으로 이해하는게 맞을 것 같아요.
상수는 메서드 영역에 있기 때문이 라기 보다는 메서드 영역에 저장되는 항목에 static 으로 생성한 인스턴스가 포함된다가 더 맞는 인과관계로 생각합니다 😀
그리고 상수가 생성될 때 생성자가 생성되는데,
ClassGrade() 객체는 정적필드들(BASIC, GOLD, DIAMOND)을 갖고 있습니다.
그런데 이 정적 필드들도 또 ClassGrade() 객체를 생성하는 것이 아니라는 건가요? ClassGrade객체는 정적 필드를 갖고 있잖아요.. 이유가 궁금합니다ㅠ
영한님의 스프링 강의 질문이지만, static을 이해함에 있어 많은 도움이 되실 것 같아 첨부드립니다. 클래스 소유의 개념을 이해하시면 좋을 것 같아요 😀
https://www.inflearn.com/questions/240845/memorymemberrepository-line-number-7
public class Grade {
public static final Grade A = new Grade();
public static final Grade B = new Grade();
public static final Grade C = new Grade();
public Grade() {
System.out.println("생성자 호출");
}
}
다음과 같은 Grade 클래스가 존재합니다.
public static void main(String[] args) {
Grade grade = new Grade();
}
다음의 main을 실행하면 생성자 호출은 4번 발생합니다.
만약 main에서 grade 인스턴스를 추가로 생성한다면,
public static void main(String[] args) {
Grade grade1 = new Grade();
Grade grade2 = new Grade();
}
생성자 호출은 5번이 됩니다.
Grade라는 클래스를 읽어들일 때, {A, B, C}가 생성이 되고, Grade클래스의 static 상수의 호출은 그걸로 끝나고 (계속 메모리에 로딩되어 생성되지 않음을 얘기합니다.)
답변 감사합니다!
ClassGrade를 딱 한번만 로딩 한다고 하셨는데, 이유는 학습한 내용대로 '상수는 메서드 영역에 있기 때문'인가요?
그리고 상수가 생성될 때 생성자가 생성되는데,
ClassGrade() 객체는 정적필드들(BASIC, GOLD, DIAMOND)을 갖고 있습니다.
그런데 이 정적 필드들도 또 ClassGrade() 객체를 생성하는 것이 아니라는 건가요? ClassGrade객체는 정적 필드를 갖고 있잖아요.. 이유가 궁금합니다ㅠ