작성
·
142
·
수정됨
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
1.
정적 중첩 클래스를 사용하기 위해 다음과 같은 코드를 강의에서 사용했는데요.
NestedOuter.Nested nested = new NestedOuter.Nested();
static 클래스라면 인스턴스화가 되지 않은 클래스라고 생각하는데, new 생성자를 통해 생성하는 이유가 궁금합니다.
NestedOuter.Nested.print();
다음과 같이 사용해야하지 않을까? 생각도 했습니다만 직접해보았을 때, print() 메서드는 static 메서드가 아니기 때문에 다음과 같이 사용할 수 없었습니다.
2. 그래서 다음과 같은 실험도 해보았습니다.
public static void main(String[] args) {
NestedOuter outer = new NestedOuter();
NestedOuter.Nested nested1 = new NestedOuter.Nested();
NestedOuter.Nested nested2 = new NestedOuter.Nested();
nested1.print();
nested2.nestedInstanceValue = 2;
nested1.print();
nested2.print();
}
print() 메서드는 정적 중첩 클래스의 필드인
nestedInstanceValue 를 출력하고, 초기값으로 1을 넣어두었습니다.
결과는
1
1
2
가 나왔습니다. nested2 에서 필드를 2로 수정을 한 후 nested1 과 nested2 에서 print() 를 호출했는데,
1
2
2
를 예상했지만 1 / 1 / 2 가 나왔습니다.
그렇다면 클래스에 static이 들어간다는 것이 의미하는 것이 무엇인지 궁금합니다.
답변 2
3
안녕하세요. 노동준님, 공식 서포터즈 David입니다.
static 키워드를 사용했을 때 인스턴스화 하지 못한다라기 보다 다음과 같이 접근해 보시면 어떨까요?
static 키워드를 사용하면 인스턴스가 아니라 클래스에 속하게 됩니다.
클래스에 속한다는 말은 인스턴스를 생성하지 않고 클래스를 통해 바로 접근할 수 있게 된다는 말입니다.
예를 들어, static 키워드를 변수, 메서드, 클래스(정적 중첩)에 각각 사용하면 다음과 같을 것입니다.
class FooVariable {
static String barVariable;
}
class FooMethod {
static void barMethod() {};
}
class FooClass {
static BarClass {};
}
FooVariable의 barVariable 변수는 정적 변수입니다. FooVariable 클래스를 통해 variable 변수에 접근할 수 있습니다.
FooMethod의 barMethod 메서드는 정적 메서드입니다. FooMethod 클래스를 통해 barMethod에 접근(호출)할 수 있습니다.
FooClass의 BarClass 클래스는 정적 중첩 클래스입니다. FooClass 클래스를 통해 BarClass 클래스에 접근(사용)할 수 있습니다.
static 키워드를 사용하게 되면 인스턴스에 속하지 않고 클래스에 속하게 됩니다.
따라서, 클래스를 통해 접근이 가능해지게 되고 접근이 가능하다는 말은 변수 사용, 메서드 호출, 클래스 사용을 할 수 있다는 것과 동일합니다.
클래스를 사용한다는 것은 클래스로 할 수 있는 것들을 모두 할 수 있다는 것입니다. 그렇다면 당연히 클래스를 사용하여 해당 클래스의 인스턴스를 만들 수 있는 것입니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
정적 중첩 클래스에 관한 궁금증을 해결해 드리겠습니다.
먼저, 정적 중첩 클래스(static nested class)는 외부 클래스의 인스턴스와 무관하게 독립적으로 존재할 수 있는 클래스입니다. 즉, 외부 클래스의 인스턴스 없이도 정적 중첩 클래스의 인스턴스를 생성할 수 있다는 의미입니다. 정적 중첩 클래스는 외부 클래스 안에 선언되므로, 외부 클래스의 private 멤버를 포함한 모든 멤버에 접근할 수 있습니다. 하지만 정적 중첩 클래스 자체는 외부 클래스의 인스턴스에 종속적이지 않기 때문에, 인스턴스화가 필요합니다. 따라서 new
키워드를 통해 인스턴스를 생성하는 것이 필요한 것입니다.
실험에서 보여주신 결과의 이해를 위해서는 static
키워드가 필드나 메서드에 적용되었을 때의 의미를 구분해야 합니다. 클래스에 static
이라는 키워드가 적용되어 있는 경우에는 그 클래스가 정적 중첩 클래스임을 의미하며, 이는 해당 클래스가 외부 클래스의 인스턴스와 독립적임을 의미합니다. 반면, 클래스 내부의 필드나 메서드에 static
이 적용되는 경우, 해당 필드나 메서드는 클래스 인스턴스들 간에 공유되는 것을 의미합니다.
귀하께서 진행한 실험에서는 NestedOuter.Nested
클래스의 nestedInstanceValue
필드가 정적(static) 필드가 아니기 때문에 각각의 인스턴스(nested1
, nested2
)는 별개의 nestedInstanceValue
값을 가지게 됩니다. 따라서 nested2.nestedInstanceValue = 2;
를 통해 nested2
의 nestedInstanceValue
값을 변경해도 nested1
의 nestedInstanceValue
값에는 영향을 미치지 않습니다. 결과적으로 nested1.print();
는 여전히 초기값인 1
을 출력하게 됩니다.
정적 중첩 클래스나 멤버(static field/method) 사용에 관해선 클래스나 멤버가 어떤 방식으로 접근되고 사용되어야 하는지를 이해하는 것이 중요합니다. 이는 인스턴스간 공유될 필요가 있는 데이터와 메서드를 구분하고, 불필요한 인스턴스 생성을 방지하여 메모리 사용을 최적화하는 데 도움을 줍니다.
명쾌한 답변 감사합니다!