본문 바로가기

프로그래밍언어/Java

[Java 중급] 정적 중첩 클래스의 활용

정적 중첩 클래스의 활용


정적 중첩 클래스로 리팩토링 전


 

NetworkMessage.java

// Network 객체 안에서만 사용
public class NetworkMessage {

    private String content;

    public NetworkMessage(String content) {
        this.content = content;
    }

    public void print() {
        System.out.println(content);
    }
}

 

Network.java

public class Network {

    public void sendMessage(String text) {
        NetworkMessage networkMessage = new NetworkMessage(text);
        networkMessage.print();
    }
}

 

NetWorkMain.java

public class NetworkMain {

    public static void main(String[] args) {
        Network network = new Network();
        network.sendMessage("hello java");
    }
}

 

=> network를 생성하고 sendMessage()를 통해 메시지를 전달한다. 

networkMain은 Network 클래스만 사용할 뿐 NetworkMessage 클래스는 전혀 사용하지 않는다. NetworkMessage는 Network 내부에서만 사용된다. 

 

개발자가 패키지를 열어본다고 가정하자. Network 관련 라이브러리를 사용하기 위해서 패키지를 열어본 개발자는 두 개의 클래스(Network, NetworkMessage) 를 모두 사용하려고 할 것이다. 그러나 실제로는 Network만 사용하면 된다. 

이번에는 코드를 리팩토링 해보자. 

 

정적 중첩 클래스로 리팩토링 후


 

Network.java

public class Network {

    public void sendMessage(String text) {
        NetworkMessage networkMessage = new NetworkMessage(text);
        networkMessage.print();
    }

    private static class NetworkMessage {

        private String content;

        public NetworkMessage(String content) {
            this.content = content;
        }

        public void print() {
            System.out.println(content);
        }
    }
}

 

NetworkMessage 클래스를 중첩해서 생성했다. 

접근제어자를 private으로 설정했기 때문에 외부에서는 NetworkMessage에 접근할 수 없다. 내부에서만 사용하겠다는 의도가 느껴지지 않는가.

 

Main.java

public class NetworkMain {

    public static void main(String[] args) {
        Network network = new Network();
        network.sendMessage("hello java");
    }
}

 

=> 결과는 동일하다. NetworkMessage가 중첩 클래스의 private 접근 제어자로 설정되어 있으므로, 다른 개발자가 로직을 확인할 때 Network 클래스에서만 사용하는 중첩 클래스임을 바로 인지할 수 있다. 

 

 

 

* 인프런 '김영한의 실전 자바 - 중급 1편'을 참고하여 작성하였습니다.