inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

열거형 - Enum Type

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

319

gogobooly

작성한 질문수 1

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)를 또 갖고있는데, 그 상수가 인스턴스를 무한 생성하게 되지 않나요? 않는다면 이유는 뭔가요?

java 객체지향

답변 1

1

OMG

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

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

 

감사합니다.

0

gogobooly

답변 감사합니다!

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

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

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

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

0

OMG

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

 

인과 관계가 "A이기 때문에 B이냐" 라기 보다는 B는 A에 포함되는 대상 으로 이해하는게 맞을 것 같아요.

상수는 메서드 영역에 있기 때문이 라기 보다는 메서드 영역에 저장되는 항목에 static 으로 생성한 인스턴스가 포함된다가 더 맞는 인과관계로 생각합니다 😀

 

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

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

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

영한님의 스프링 강의 질문이지만, static을 이해함에 있어 많은 도움이 되실 것 같아 첨부드립니다. 클래스 소유의 개념을 이해하시면 좋을 것 같아요 😀

https://www.inflearn.com/questions/240845/memorymemberrepository-line-number-7

 

0

OMG

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

 

문제와 풀이

0

26

1

섹션 2 퀴즈 9번

0

34

2

강의노트 내용이 이해가 되지 않아서 문의드립니다.

0

48

1

중급1편, 래퍼클래스 문제와풀이2 로또제너레이터 질문

0

68

1

setVlaue질문

0

95

3

안녕하세요 코딩테스트와 병행하고 싶어서 질문드립니다.

0

95

1

findValue의 파라메터까지 래퍼클래스 배열인 이유가 있을까요?

0

76

1

아래 글처럼 toString() 강의부터 화면이 안보여요

0

99

2

TemporalAdjusters의 lastDayOfNextMonth(), lastDayOfNextYear() 메서드 지원 안함

0

84

2

오타 제보도 되나요?

0

91

2

지역 클래스 예제3 지역변수 질문

0

69

2

래퍼클래스 박싱 출력

0

60

1

자바 equals() 메소드에 대한 물리적 동일성, 논리적 동등성 질문

0

107

3

강의록 오타 제보

0

69

2

자바의 기본 클래스들에 관하여

0

71

1

실무에서 중첩(내부) 클래스 사용하나요?

0

81

1

지역 클래스 - 지역 변수 캡처3

0

57

1

12:30 의 newClassGrade 질문이 있습니다.

0

57

1

날짜와 시간 문제풀이가 막히는데

0

100

2

내부 클래스의 바깥 클래스 참조

0

68

1

스트링 풀, new String()

0

105

3

정적 중첩 클래스 사용 이유

0

97

1

status.getCode() 대신 status.code 사용

1

82

1

메서드의 지역변수명과 내부클래스의 멤버메서드에서의 지역변수명의 중복관련

0

75

1