내부 클래스는 하나의 클래스 내부에 선언된 또 다른 클래스를 의미한다.
내부 클래스에서 외부 클래스(Outer Class) 멤버에 접근하기 위해 사용한다.
선언된 위치에 따라서 4가지 형태가 존재한다.
( 항상 외부 객체 생성 -> 내부 객체 생성 )
내부 클래스의 장점
1. 내부 클래스는 외부 클래스의 모든 멤버를 자유롭게 사용할 수 있다.
= 코드가 간결해지고 편리하다.
2. 외부에 불필요한 클래스를 감추어서 코드의 복잡성을 줄일 수 있다. (캡슐화)
내부 클래스의 종류
1. 멤버 이너 클래스 (member inner class)
클래스 내부에서 멤버 변수처럼 선언된 이너 클래스다.
인스턴스 멤버 클래스와 정적 멤버 클래스가 존재한다.
( 이너 클래스에서 필드나 메서드의 이름이 동일한 아우터 클래스 멤버를 참조하고 싶으면
아우터 클래스명.this.멤버 <처럼 사용할 수 있다. )
public class InnerExam {
private int a;
private int b;
private static int c;
public InnerExam() {
a = 1;
b = 2;
c = 3;
}
//member inner class
class AInner{
public void disp() {
System.out.println(a); // 원래 접근이 되면 안되지만,
System.out.println(b); // outer의 맴버를 자유롭게 사용가능
System.out.println(c); // outer 객체 생성 후 inner 객체를 생성해야 한다.
} // 단, static은 outer를 생성하지 않고 사용가능
}
public static void main(String[] args) {
// 1.outer 객체 생성 후
// outer객체.inner객체 b = outer레퍼런스.new inner();
InnerExam a = new InnerExam();
InnerExam.AInner b = a.new AInner();
b.disp();
//한 줄로 작성하는 방법
InnerExam.AInner c = new InnerExam().new AInner();
2. 정적 이너 클래스 (static inner class)
static 키워드를 가지고 있는 이너 클래스를 의미한다.
정적 메서드와 동일하게 아우터 클래스의 정적 멤버에만 접근할 수 있다.
정적 이너 클래스도 정적 멤버이므로 객체 생성 없이 클래스명으로 바로 접근할 수 있다.
class A{
static class B{
}
}
A.B b = new A.B();
3. 지역 이너 클래스 (local inner class)
외부 클래스에 메서드나 초기화 블록에 선언된 이너 클래스를 의미한다.
지역 변수처럼 해당 메서드 내부에서만 한정적으로 사용된다.
(지역 변수는 반드시 final로 선언한다. 생략 시 컴파일러가 삽입)
public class InnerExam {
private int a;
private int b;
private static int c;
public InnerExam() {
a = 1;
b = 2;
c = 3;
}
//local inner class
public void output() {
class LocalInner{
public void disp() {
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
LocalInner li = new LocalInner();
li.disp();
}
//local Inner class
//main에서
InnerExam d = new InnerExam();
d.output();
4. 익명 이너 클래스(anonymous class)
익명 클래스는 이름이 존재하지 않는 이너 클래스다.
클래스의 선언과 동시에 객체를 생성한다. 단 하나의 객체만을 생성하는 일회용 클래스다.
따라서 생성자를 생성할 수 없다.
//anonymous inner class
new InnerExam() {
public void disp() {
System.out.println("익명 이너 클래스입니다.");
}
}.disp();
이러한 익명 클래스는 매우 제한적인 용도에 사용되며, 구현해야 하는 메소드가 매우 적은 클래스를
구현할 때 사용된다.
Inner Class는 이벤트 핸들러와 안드로이드에서 자주 사용된다고 한다.
특히 1번과 4번의 형태를 가장 많이 사용한다고 한다.
참고 문헌 : Do it! 자바 완전정복
'Java > 자바 이론' 카테고리의 다른 글
[Java] 자바 컬렉션(Collection) 프레임워크란? (0) | 2022.07.06 |
---|---|
[Java] 자바 쓰레드(Thread) & 동기화 (0) | 2022.07.06 |
[Java] 자바 인터페이스(Interface)란? (0) | 2022.07.05 |
[Java] 추상 클래스와 추상 메서드 (abstract) (0) | 2022.07.04 |
[Java] 메서드 오버로딩과 오버라이딩 (1) | 2022.06.30 |