내부 클래스 (Inner Class)
클래스 내에 선언된 클래스
내부 클래스의 장점
1.
내부 클래스에서 외부 클래스의 멤버들에 쉽게 접근 가능
2.
코드의 복잡성을 줄일 수 있음. (캡슐화)
class A { // 외부 클래스
...
class B { // 내부 클래스. 외부 클래스 A 외엔 다른 클래스에선 잘 사용되지 않는 것이어야..
...
}
...
}
Java
내부 클래스의 종류와 특징
•
변수의 선언 위치에 따른 종류와 동일
•
인스턴스 클래스
◦
외부 클래스의 멤버변수 선언 위치에 선언
◦
외부 클래스의 인스턴스 멤버처럼 사용됨.
◦
주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언
•
static 클래스
◦
외부 클래스의 멤버변수 선언 위치에 선언
◦
외부 클래스의 static 멤버처럼 사용됨.
◦
static 메소드에서 사용될 목적으로 선언
•
지역 클래스
◦
외부 클래스의 메소드나 초기화 블럭 안에 선언
◦
선언된 영역 내부에서만 사용 가능
•
익명 클래스
◦
클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스(일회용)
내부 클래스의 선언
•
변수의 선언 위치와 동일하게 내부 클래스를 선언
class Outer {
int iv = 0;
static int cv = 0;
void myMethod() {
int lv = 0;
}
}
class Outer {
class InstanceIneer { }
static class StaticInner { }
void myMethod() {
class LocalInner { }
}
}
Java
내부 클래스의 제어자와 접근성
•
외부 클래스의 멤버변수처럼 내부 클래스도 같은 위치에 선언되므로,
멤버변수처럼 간주되어 규칙을 적용
•
내부 클래스이기 때문에 abstract, final 같은 제어자 사용 가능
•
멤버변수처럼 private, protected 같은 접근 제어자도 사용 가능
class Outer {
private int iv = 0;
protected static int cv = 0;
void myMethod() {
int lv = 0;
}
}
class Outer {
private class InstanceIneer { }
protected static class StaticInner { }
void myMethod() {
class LocalInner { }
}
}
Java
•
내부 클래스 중 static 클래스만 static 멤버 보유 가능
InnerEx1.java
•
인스턴스 클래스는 외부 클래스의 인스턴스 멤버를 객체 생성없이 사용 가능하지만,
static 클래스는 외부 클래스의 인스턴스 멤버를 객체생성 없이 사용 불가
InnerEx2.java
•
내부 클래스에서 외부 클래스의 변수들에 대한 접근성을 보여주는 예제
InnerEx3.java
•
외부 클래스가 아닌 다른 클래스에서 내부 클래스를 생성하고 내부 클래스의 멤버에 접근하는 예제 → 내부 클래스로 선언해서는 안되는 클래스를 내부 클래스로 선언했다는 의미
InnerEx4.java
•
내부 클래스와 외부 클래스에 선언된 변수의 이름이 같을 때
변수 앞에 this 또는 외부 클래스명.this를 붙여서 서로 구별 가능
InnerEx5.java
익명 클래스 (Anonymous Class)
이름이 없는 클래스로, 클래스 선언과 객체 생성을 동시에 하기 때문에
한번만 사용될 수 있고, 오직 하나의 객체만을 생성할 수 있는 일회용 클래스
new 조상클래스이름() {
// 멤버 선언
}
또는
new 구현인터페이스이름() {
// 멤버 선언
}
Java
•
이름이 없기 때문에 생성자를 가질 수 없음.
•
조상클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의
◦
단 하나의 클래스를 상속받거나 단 하나의 인터페이스만 구현 가능
InnerEx6.java
•
익명 클래스는 이름이 없기에, 외부 클래스명$숫자.class 형식으로 클래스파일명이 결정됨.
•
익명 클래스 사용 전
InnerEx7.java
•
익명 클래스 사용 후
InnerEx8.java