개발/Java
[Java의 정석] Chapter 10. 내부 클래스 / inner class
hyosupsong
2021. 2. 15. 01:50
inner class : 내부 클래스
클래스 내에 선언된 클래스
내부 클래스의 장점
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
- 코드의 복잡성을 줄일 수 있다.
1 2 3 4 5 | class A { // 외부 클래스 class B { // 내부 클래스 //... } } | cs |
내부 클래스의 종류와 특징
내부 클래스의 종류는 변수의 선언 위치에 따른 종류와 같다.

내부 클래스의 선언
내부 클래스가 선언된 위치에 따라 종류가 나뉜다.
1 2 3 4 5 6 7 8 | class Outer { class InstanceInner{} static class StaticInner{} void myMethod() { class LocalInner{} } } | cs |
내부 클래스의 제어자와 접근성
1. 내부 클래스도 클래스이기 때문에 abstract나 final과 같은 제어자를 사용할 수 있다.
- 내부 클래스 중에서 스태틱 클래스만 static 멤버를 가질 수 있다.
- final과 static이 동시에 붙은 변수는 상수(constant)이므로 모든 내부 클래스에서 정의가 가능하다.
- 인스턴스 클래스는 외부 클래스의 인스턴스 멤버를 객체생성 없이 바로 사용할 수 있지만,
- 스태틱 클래스는 외부 클래스의 인스턴스 멤버를 객체생성 없이 사용할 수 없다. (내부 클래스의 멤버도 마찬가지)
2. 내부 클래스도 멤버 변수들처럼 private, protected와 같이 접근 제어자도 사용이 가능하다.
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 | class Outer { private int outerIv = 0; static int outerCv = 0; class InstanceInner { int iiv = outerIv; // 외부 클래스의 private 멤버도 접근가능하다. int iiv2 = outerCv; } static class StaticInner { // 스태틱 클래스는 외부 클래스의 인스턴스 멤버에 접근할 수 없다. // int siv = outerIv; static int scv = outerCv; } void myMethod() { int lv = 0; final int LV = 0; class LocalInner { int liv = outerIv; int liv2 = outerCv; // 외부 클래스의 지역변수는 final이 붙은 변수(상수)만 접근가능하다. // int liv3 = lv; 에러 int liv4 = LV; } } } | cs |
익명 클래스
클래스의 선언과 객체의 생성을 동시에 하는 이름이 없는 클래스(하나의 객체만을 생성할 수 있는 일회용 클래스)
- 이름이 없기 때문에 생성자도 없다.
- 오직 하나의 클래스를 상속받거나 하나의 인터페이스만을 구현할 수 있다.
1 2 3 4 5 6 7 8 | class Annonymous { PriorityQueue<Integer> pq = new PriorityQueue<Integer>(new Comparator<Integer>() { // 익명 클래스 @Override public int compare(Integer arg0, Integer arg1) { return Integer.compare(arg0, arg1); } }); } | cs |