엔지니어로 가는 길

Java 중첩 클래스 본문

프로그래밍/Java

Java 중첩 클래스

탐p슨 2020. 4. 23. 12:39
728x90

출처: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

 

중첩 클래스란

 

Java에서는 클래스 안에 클래스를 정의할 수 있다. 클래스 안에 정의된 클래스를 nested class(중첩 클래스)

라고 한다. 중첩 클래스는 바깥 클래스의 ‘멤버’이므로 private, protected, public, package-private 모두 가

능하다. (top-level 클래스는 오직 public과 package-private만 가능하다.) 중첩 클래스는 static과 non-static

으로 나눌 수 있는데, static인 경우 static nested class라고 부르고 non-static인 경우 inner class라 부른다.


Non-static nestted classes(inner classes)

 

Non-static nested classes, 즉 inner classes는 바깥 클래스의 인스턴스 멤버(private으로 선언된 멤버 포함)

에 접근할 수 있다. 또한 바깥 클래스의 non-static 멤버이므로 바깥 클래스의 객체와 연관 있기 때문에

static 멤버를 가질 수 없다.

 

클래스 이름이 다음과 같을 때,

 

 

 

 

Inner class 객체는 아래와 같이 먼저 바깥 클래스 객체를 생성한 후에 생성할 수 있다.

 

OuterClass outerObject = new OuterObject();

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

 

Static nested classes

 

static nested classes는 바깥 클래스의 인스턴스 멤버에 직접 접근할 수 없다. 바깥 클래스의 객체를 생성

한 뒤에 ‘.’ 연산자를 통해 접근하는 것만 가능하다. static nested class는 일반적인 top-level 클래스처럼 바

깥 클래스나 다른 클래스와 상호작용이 가능하다. 기능하는 것만 놓고 보자면 static nested class는 top-

level 클래스 속에 중첩되어 있는 top-level 클래스로 볼 수 있다.

 

클래스 이름이 다음과 같을 때,

 

 

 

 

Static nested class는 아래와 같이 생성할 수 있다.

 

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

 

Shadowing

 

다음은 Shadow 테스트 코드이다.

 

 

 

 

출력 결과는 다음과 같다.

 

 

 

 

즉 함수 내에서 인스턴스 변수는 매개변수에 가려질 수 있고, 바깥 클래스의 인스턴스 변수는 중첩 클래스

의 인스턴스 변수에 가려질 수 있다.

 

 

 

 

위에서 볼 수 있듯,

인스턴스 변수 참조 방법: this.~

중첩 클래스 내에서 바깥 클래스의 인스턴스 변수 참조 방법: {바깥 클래스 이름}.this.~

 

왜 중첩 클래스를 쓰는가

 

@ 한 장소에서만 사용되는 클래스를 논리적으로 그루핑 하는 방법이다.

만약 클래스가 오직 다른 하나의 클래스에서만 유용하다면, 그 클래스에 내장하여 두 클래스가 함께 하도

록 하는 것이 논리적이다.

 

@ 캡슐화를 증가시킨다.

A와 B 두 개의 클래스가 있을 때 B가 A의 멤버에 접근해야 하고, A의 멤버가 다른 클래스에는 private 하도록 관리하고 싶은 경우를 생각해보자. 이때 클래스 B를 클래스 A에 숨긴다면(중첩 클래스로 둔다면) A의 멤

버는 private으로 두어 다른 클래스로부터 보호하는 동시에 B가 A의 멤버가 접근할 수 있게 할 수 있다.

 

@ 가독성과 유지보수성을 높인다.

중첩 클래스를 이용하면 사용되는 곳과 코드를 더 가깝게 위치시킬 수 있다.

728x90
Comments