일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- DispatcherServlet
- Spring
- 자바
- 클린코드
- 링킹
- lambda
- 프록시
- 메이븐
- AutoConfiguration
- springwebmvc
- ApplicationContext
- 토비의스프링
- 빌드툴
- 컴퓨터시스템
- Kotlin for Java Developers
- IOC
- hibernate
- 토비의스프링3.1
- ORM
- JPA
- Immutable
- String
- gradle
- java
- springboot
- 링커
- exception
- DesignPattern
- FunctionalInterfaces
- beanfactory
- Today
- Total
엔지니어로 가는 길
Java 중첩 클래스 본문
출처: 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의 멤버가 접근할 수 있게 할 수 있다.
@ 가독성과 유지보수성을 높인다.
중첩 클래스를 이용하면 사용되는 곳과 코드를 더 가깝게 위치시킬 수 있다.
'프로그래밍 > Java' 카테고리의 다른 글
자바 스트림 API (0) | 2020.05.05 |
---|---|
JVM 런타임 메모리 영역 (0) | 2020.05.02 |
Java 접근 제어자와 접근의 의미 (0) | 2020.04.21 |
논리 연산자 &, |와 &&, ||의 차이 (0) | 2020.04.10 |
언어로서의 자바, 플랫폼으로서의 자바 (0) | 2020.03.29 |