중첩 클래스 : 다른 클래스 안에 정의된 클래스
중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임이 있으면 중첩 클래스로 구현하면 안된다.
Nested Class를 사용하는 이유
- 소스의 가독성, 유지보수
- 오직 한 곳에서 사용되는 클래스들의 논리적인 그룹핑 방법
- 한 클래스가 다른 하나의 클래스에서만 사용될 경우 → 두 클래스를 함께 두는 것이 논리적임
- 캡슐화 증대
- private으로 다른 클래스들로 부터 감추자
Nested Class의 종류
- static nested class
- local inner class (non-static)
- anonymouse inner class
static nested class
public class University {
static class Student {
}
}
public class HighSchool {
static class Student {
}
}
- 사용 :
HighSchool.Student zinn = new HighSchool.Student();
- HighSchoolStudent, UniversityStudent처럼 하나의 클래스로 선언할 수도 있지만 위처럼 staic nested class로 개발하면 더 명시적이다.
- 각각의 내부 클래스 Student는 서로 멤버가 다르고(내부적 구현이 다름), 각각 University, HighSchool 클래스에서만 사용된다.
- Student클래스 내부에서는 바깥 클래스에 접근할 수 없다.
inner class (non-static)
- 비정적 중첩 클래스는 내부 클래스에서 바깥 클래스에 접근할 수 있다.
-
@Getter public class HighSchool { private final String schoolName; public HighSchool(String schoolName) { this.schoolName = schoolName; } class Student { public String getName() { // 정규화된 this를 이용해서 바깥 클래스의 인스턴스 메소드 사용 return HighSchool.this.getSchoolName(); } } }
-
사용 : HighSchool highSchool = new HighSchool("hangsin"); Student student = highSchool.new Student();
static nested class vs inner class (non-static)
- 멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 static을 붙여서 정적 멤버 클래스로 만들자.
- 즉, 외부 클래스와 독립적으로 존재 가능하다면 static!!
- 이유 : static을 생략하면 바깥 인스턴스로의 숨은 외부 참조를 갖게 되고, 이 때문에 시간과 공간이 소비됨. + 가비지 컬렉션이 바깥 클래스의 인스턴스를 수거하지 못하는 메모리 누수가 발생할 수 있음
반응형
'java' 카테고리의 다른 글
Java 환경변수 설정이 필요한 이유, 설정 방법 (mac) (0) | 2023.02.02 |
---|---|
소나큐브(Sonarqube)와 jacoco로 코드품질 측정, 정적분석 (0) | 2022.09.13 |
[java] File 지우기. delete vs deleteOnExit() (0) | 2022.06.22 |
[Java] Builder Pattern (0) | 2022.01.05 |