-
내부 스태틱 클래스(static nested class)를 사용하는 이유와 그 동작 방식자바웹프로그래밍/JAVA 2024. 7. 25. 14:00728x90반응형
내부 스태틱 클래스(static nested class)를 사용하는 이유
- 논리적인 그룹화: 내부 스태틱 클래스는 외부 클래스와 밀접한 관련이 있는 클래스를 논리적으로 그룹화하는 데 유용합니다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있습니다.
- 캡슐화: 내부 스태틱 클래스는 외부 클래스의 private 멤버에 접근할 수 있기 때문에, 외부 클래스의 구현 세부 사항을 캡슐화하는 데 도움이 됩니다.
- 외부 클래스와의 결합도 낮추기: 내부 클래스(non-static inner class)와 달리, 내부 스태틱 클래스는 외부 클래스의 인스턴스에 대한 참조를 갖지 않기 때문에 외부 클래스와의 결합도가 낮아집니다. 이는 내부 스태틱 클래스의 독립성을 높입니다.
내부 스태틱 클래스의 메모리 관리
내부 스태틱 클래스는 외부 클래스의 인스턴스와 독립적으로 존재하며, 외부 클래스의 인스턴스에 대한 참조를 가지지 않습니다. 이는 다음과 같은 의미를 가집니다:
- 클래스 로딩: 내부 스태틱 클래스는 그 자체로 클래스이기 때문에, 외부 클래스와 별도로 로딩됩니다. 즉, 내부 스태틱 클래스가 처음으로 참조될 때 클래스 로더에 의해 로딩되고 메모리에 올라갑니다.
- 공유: 내부 스태틱 클래스의 정적 멤버는 해당 클래스 로더가 로드된 모든 컨텍스트에서 공유됩니다. 이는 외부 클래스의 인스턴스와 관계없이 내부 스태틱 클래스의 정적 멤버가 동일하게 유지됨을 의미합니다.
- 인스턴스 멤버: 내부 스태틱 클래스의 인스턴스 멤버는 외부 클래스와 독립적으로 관리됩니다. 즉, 외부 클래스의 인스턴스를 새로 생성해도, 기존의 내부 스태틱 클래스의 인스턴스는 영향을 받지 않습니다. 새롭게 생성된 외부 클래스 인스턴스는 내부 스태틱 클래스의 인스턴스를 새로 생성할 수 있지만, 이는 기존 인스턴스와는 별개의 것입니다.
내부 스태틱 클래스에 전역 변수 동작
내부 스태틱 클래스(static nested class)도 스태틱 클래스의 성격을 지니고 있기 때문에, 해당 클래스 내의 정적 변수는 일반 스태틱 클래스의 정적 변수와 마찬가지로 전역적으로 공유됩니다. 이 말은 내부 스태틱 클래스의 정적 변수는 어디에서든 변경되면 다른 곳에서도 동일한 값으로 공유된다는 뜻입니다. 즉, 내부 스태틱 클래스의 정적 변수는 여전히 공유 상태에 있으므로, 여러 곳에서 접근하고 수정할 때 주의가 필요합니다.
하지만, 내부 스태틱 클래스의 인스턴스 변수는 공유되지 않습니다. 이는 외부 클래스의 여러 인스턴스가 내부 스태틱 클래스의 인스턴스를 독립적으로 가질 수 있음을 의미합니다. 내부 스태틱 클래스의 인스턴스 변수는 그 클래스의 인스턴스마다 독립적으로 존재합니다.
예제 코드
다음 예제는 내부 스태틱 클래스의 정적 변수와 인스턴스 변수가 어떻게 동작하는지를 보여줍니다:
public class OuterClass { private int outerInstanceVar = 0; public static class StaticNestedClass { private static int staticVar = 0; private int instanceVar = 0; public void incrementVars() { staticVar++; instanceVar++; } public void printVars() { System.out.println("Static var: " + staticVar); System.out.println("Instance var: " + instanceVar); } } public static void main(String[] args) { OuterClass.StaticNestedClass nested1 = new OuterClass.StaticNestedClass(); OuterClass.StaticNestedClass nested2 = new OuterClass.StaticNestedClass(); nested1.incrementVars(); nested1.printVars(); nested2.incrementVars(); nested2.printVars(); // 두 객체의 인스턴스 변수는 독립적이지만, 정적 변수는 공유됨 OuterClass.StaticNestedClass nested3 = new OuterClass.StaticNestedClass(); nested3.printVars(); } }
이 코드를 실행하면 다음과 같은 출력이 발생합니다:
Static var: 1 Instance var: 1 Static var: 2 Instance var: 1 Static var: 2 Instance var: 0
위 출력에서 볼 수 있듯이, staticVar는 모든 StaticNestedClass 인스턴스에서 공유되며, 한 곳에서 변경하면 다른 곳에서도 동일하게 반영됩니다. 반면, instanceVar는 각 인스턴스마다 독립적으로 유지되므로 다른 인스턴스의 변경과 상관없이 개별적으로 관리됩니다.
요약
- 내부 스태틱 클래스의 정적 변수: 전역적으로 공유되므로 어느 한 메소드에서 변경하면 다른 곳에서도 동일하게 반영됩니다.
- 내부 스태틱 클래스의 인스턴스 변수: 각 인스턴스마다 독립적으로 존재하며, 다른 인스턴스와 공유되지 않습니다.
따라서 내부 스태틱 클래스의 정적 변수 사용 시에는 전역 공유 변수와 동일한 주의가 필요합니다. 그러나 인스턴스 변수는 인스턴스마다 독립적이므로 이러한 문제는 발생하지 않습니다.
728x90반응형'자바웹프로그래밍 > JAVA' 카테고리의 다른 글
BufferedOutputStream를 사용하면 성능이 좋아지는 이유 및 자세한 설명 with FileDescriptor (2) 2024.07.24 InputStream 과 OutputStream에 차이 ! (0) 2024.07.24 org.springframework.core.io.Resource란 무엇인가 !!? (0) 2024.07.15 JVM의 메모리 영역에 대한 이해와 예시와 reflection의 이해 (0) 2024.07.11 jvm 클래스 로더 작동방식 (0) 2024.07.11