- 클래스 안에 선언된 클래스
- 특정 클래스 내에서만 주로 사용되는 클래스를 내부 클래스로 선언함
- GUI어플리케이션(AWT, Swing)의 이벤트처리에 많이 사용됨
▶ 내부 클래스의 장점
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있음
- 코드의 복잡성을 줄일 수 있다(캡슐화)
- 내부 클래스의 종류는 변수의 선언위치에 따른 종류와 동일
- 유효범위와 성질도 변수와 유사하므로 비교해보면 이해하기 쉬움
- 내부 클래스의 접근제어자는 변수에 사용할 수 있는 접근제어와 동일하다.
- static클래스만 static멤버를 정의할 수 있다.
- 내부 클래스도 외부 클래스의 멤버로 간주되며, 동일한 접근성을 갖는다
- 외부 클래스의 지역변수는 final이 붙은 변수(상수)만 접근가능하다. 지역 클래스의 인스턴스 소멸된 지역변수를 참조할 수 있기 때문이다.
- 이름이 없는 일회용 클래스
- 선언과 생성을 동시에 함
- 하나의 객체만 생성가능
공장으로 예시를 들어봤다.
주석으로 설명..
// 내부 클래스 중 인스턴스 클래스는 메모리 누수 등
// 문제가 발생할 수 있어서 특별한 경우가 아니면 잘 안쓴다
// 삼성공장
// 갤럭시 공장
class 삼성공장{
// 내부클래스
// static이 없는 인스턴스 클래스
// 스마트폰 설계도
class 갤럭시{
}
class 냉장고{
}
}
public class S09 {
public static void main(String[] args) {
// 공장 설계도에게 폰을 만들어 달라고 하는 느낌
// 만들어지지 않는다
// new 삼성공장.갤럭시();
// 공장을 상상
삼성공장 factory;
// 공장을 짓는다
factory = new 삼성공장();
// 공장에서 새 갤럭시 폰을 만듦
삼성공장.갤럭시 phone = factory.new 갤럭시();
삼성공장.냉장고 ref = factory.new 냉장고();
삼성공장 factory1 = new 삼성공장();
factory1.new 갤럭시();
}
}
종이접기책으로 예시를 들어봤다.
주석으로 설명..
class 종이접기책목차{
// 종이로 학을 접는 방법
// 방법대로 만들면 종이학(인스턴스)
static class 학{
}
}
public class S10 {
public static void main(String[] args) {
// 클래스의 내부 static 클래스가 실제 클래스이고
// 외부의 클래스는 내부 static 클래스에 접근할 경로를 제공하는 느낌
// 외부의 클래스는 내부 static 클래스의 패키지와 비슷
종이접기책목차.학 bird = new 종이접기책목차.학();
}
}