Java Nested - 정적 중첩 클래스 활용
이전 글에서 정적 중첩 클래스를 소개했고 이번에는 예제코드로 활용해보도록 한다.
정적 중첩 클래스 리팩토링 이전의 코드
NetworkMessage.class
public class NetworkMessage {
private String connect;
public NetworkMessage(String connect) {
this.connect = connect;
}
public void print() {
System.out.println(connect);
}
}
Network.class
public class Network {
public void sendMessage(String text) {
NetworkMessage networkMessage = new NetworkMessage(text);
networkMessage.print();
}
}
Main.class
public class Main {
public static void main(String[] args) throws Exception {
Network network = new Network();
network.sendMessage("Hello!!");
}
}
Hello!!
네트워크 구조를 최소화한 코드이다.
요약하면 호출부에서 인스턴스를 생성하고 sendMessage 메소드로 메시지를 출력하는 코드다
만약, 개발자가 한명이 아닌 다른 개발자도 참가하게 된 경우, Network, NetworkMessage 클래스를 바라보게 될 것이다.
참가한 개발자는 NetworkMessage 클래스로 선언해서 바로 써야한다고 생각할 것이고, 추후 알고보니 Network 클래스만 선언해서 사용해도 되구나 깨닫게 된다.
즉, 외부로 공개된 NetworkMessage 클래스가 노출되어 참가한 개발자가 혼동을 주게 만들었다.
정적 중첩 클래스 리팩토링 이후의 코드
Network.class
public class Network {
public void sendMessage(String text) {
NetworkMessage networkMessage = new NetworkMessage(text);
networkMessage.print();
}
private static class NetworkMessage {
private String connect;
public NetworkMessage(String connect) {
this.connect = connect;
}
public void print() {
System.out.println(connect);
}
}
}
Main.class
public class Main {
public static void main(String[] args) throws Exception {
Network network = new Network();
network.sendMessage("Hello!!");
}
}
Hello!!
- NetworkMessage 클래스를 Network 클래스 안에 중첩해서 코드 추가
- 중첩해서 클래스 코드 추가시 private 접근제어자와 static 정적 키워드 추가
- NetworkMessage 외부에서 함부로 호출하지 못하도록 private 접근제어가 설정되었다.
정적 중첩 클래스를 사용하지 않는 곳
Network 바깥클래스에서 NetworkMessage 클래스를 호출하는 것을 볼 수 있다. 만약 NetworkMessage 접근제어자가 private 가 아닌 public 이며 외부에서 호출한 경우 정적 중첩 클래스에 적합하지 않는 것이다.