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

gogobooly님의 프로필 이미지
gogobooly

작성한 질문수

김영한의 실전 자바 - 중급 1편

열거형 - Enum Type

Enum 클래스- 상수가 인스턴스를 생성할때, 그 인스턴스는 또 상수를 갖고 있고 객체를 생성하고 무한 생성(참조)하지 않나요?

작성

·

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

안녕하세요. gogobooly님, 공식 서포터즈 OMG입니다.

class ClassGrade라는 클래스가 로드 될 때 ClassGrade타입의 정적필드들(BASIC, GOLD, DIAMOND) 한 번만 생성되기 때문에 계속 로드하면서 무한참조하면서 생성하는 것이 아닌 ClassGrade를 딱 한번만 로딩한다고 이해하시면 될 것 같습니다.

 

감사합니다.

gogobooly님의 프로필 이미지
gogobooly
질문자

답변 감사합니다!

ClassGrade를 딱 한번만 로딩 한다고 하셨는데, 이유는 학습한 내용대로 '상수는 메서드 영역에 있기 때문'인가요?

그리고 상수가 생성될 때 생성자가 생성되는데,

ClassGrade() 객체는 정적필드들(BASIC, GOLD, DIAMOND)을 갖고 있습니다.

그런데 이 정적 필드들도 또 ClassGrade() 객체를 생성하는 것이 아니라는 건가요? ClassGrade객체는 정적 필드를 갖고 있잖아요.. 이유가 궁금합니다ㅠ

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 상수의 호출은 그걸로 끝나고 (계속 메모리에 로딩되어 생성되지 않음을 얘기합니다.)

 

gogobooly님의 프로필 이미지
gogobooly

작성한 질문수

질문하기