public class Network {
public void sendMessage(String text) {
// 여기서 new NetworkMessage(text) 함
NetworkMessage networkMessage = new NetworkMessage(text);
networkMessage.print();
}
// 중첩 클래스를 static으로 선언함
private static class NetworkMessage {
private String content;
public NetworkMessage(String content) {
this.content = content;
}
public void print() {
System.out.println(content);
}
}
}
헷갈렸던 부분 정리
static 메소드는 '클래스'에 붙는 기능이다.
- static 메소드는 객체(인스턴스)를 만들지 않고도 클래스 이름으로 바로 호출할 수 있는 기능이다.
- 특정 객체의 상태(인스턴스 필드)에 접근할 수 없음. 객체 없이 호출이 가능하기에 어떤 객체의 필드인지 알 수 없기 때문이다.
static 클래스는 '클래스 안에 있는 클래스'에 붙는 속성
- 내부 클래스에 static이 붙은 이유는 바깥 클래스의 '객체(인스턴스)' 없이도 이 안쪽 클래스의 객체를 만들 수 있게 해주려고
- static이 안 붙은 일반 중첩 클래스는 바깥클래스객체.new 안쪽클래스() 이런 식으로 바깥 클래스 객체가 있어야만 안쪽 클래스 객체를 만들 수 있다. 또한 일반 중첩 클래스는 바깥 클래스 객체의 인스턴스 멤버에 접근이 가능하다.
- static 중첩 클래스는 new 바깥클래스이름.정적중첩클래스이름() 또는 바깥 클래스 내부에서 new 정적중첩클래스이름() 이런식으로 바깥 클래스 객체 없이도 바로 객체를 만들 수 있다. 대신 바깥 클래스의 인스턴스 멤버에는 직접 접근하지 못한다.
- 다만 new 바깥클래스이름.정적중첩클래스이름() 이런식으로 호출하고 있다면 이미 잘못된 코드일 가능성이 있다. 이렇게 사용하면 외부에서 사용할 필요가 있다는 것이기에 두 개의 클래스로 분리하는 것이 맞을 것이다.
NetworkMessage는 여전히 하나의 클래스 그리고 print() 메소드는 NetworkMessage 클래스의 인스턴스 메소드야. 인스턴스 메소드는 객체(인스턴스)가 있어야만 호출할 수 있어.
코드 new NetworkMessage(text);는 NetworkMessage 클래스의 '객체'를 새롭게 만드는 코드.
new를 써서 NetworkMessage 객체(networkMessage)를 만들었기 때문에, 그 다음에 networkMessage.print()처럼 그 객체의 인스턴스 메소드를 호출할 수 있는 것
만약 NetworkMessage 클래스 안에 static 메소드가 있었다면 (예: public static void someUtilityMethod()), 그걸 호출할 때는 new NetworkMessage() 할 필요 없이 NetworkMessage.someUtilityMethod() 이렇게 바로 호출했을 거임.
'JAVA' 카테고리의 다른 글
[Spring] 전략 패턴 구현, 스프링 빈 모두 불러오기 활용 (0) | 2025.05.21 |
---|---|
중첩 내부 클래스 (0) | 2025.05.14 |
날짜와 시간 (0) | 2025.05.07 |
SOLID 원칙 (0) | 2025.04.15 |
Optional orElse(), orElseGet() 차이점 (0) | 2025.04.06 |