JAVA

중첩클래스 활용

Ark B 2025. 5. 7. 12:28
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() 이렇게 바로 호출했을 거임.