내부클래스란?
내부 클레스는 클래스 내에 선언된 클래스이다. 클래스에 다른 클래스를 선언하는 이유는 다음과 같다.
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 이싿.
- 코드의 복잡성을 줄 일 수 있다.(캡슐화)
코드 예)
class A {
// ...
}
class B {
// ...
}
// 위의 코드를 내부 클래스로 변환
class A {
// ...
class B {
// ...
}
}
여기서 B는 A의 내부 클래스(inner class)가 되고 A는 B를 감싸고 있는 외부 클래스(outer class)가 된다. 이 때 내부 클래스인 B는 외부 클래스인 A를 제외하고는 다른 클래스에서 잘 사용되지 않는 것이어야 한다.
내부 클래스의 종류와 특징
내부 클래스 | 특징 |
인스턴스 클래스 (instance class) |
외부 클래스의 멤버변수 선언 위치에 선언하며, 외부 클래스의 인스턴스 멤버처럼 다루어진다. 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언된다. |
스태틱 클래스 (static class) |
외부 클래스의 멤버변수 선언 위치에 선언하며, 외부 클래스의 static 멤버처럼 다루어진다. 주로 외부 클래스의 static 멤버, 특히 static 메서드에서 사용될 목적으로 선언된다. |
지역 클래스 (local class) |
외부 클래스의 메서드나 초기화 블럭 안에 선언하며, 선언된 영역 내부에서만 사용될 수 있다. |
익명 클래스 (anonymous class) |
클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스(일회용) |
내부 클래스의 제어자와 접근성
내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일하다. 원래 클래스 앞에 접근 제어자는 public과 default만 가능하지만 내부 클래스는 public, protected, default, private 모두 가능하다.
코드 예제1)
class Ex{
// 인스턴스 내부 클래스
class InstanceInner{
int iv = 100;
static int cv = 100; // 에러! static변수를 선언할 수 없다.
final static int CONST = 100; // final static은 상수이므로 허용
}
// static 내부 클래스
static class StaticInner {
int iv = 200;
static int cv = 200; // static 클래스만 static멤버를 정의할 수 있다.
}
// 지역 내부 클래스
void myMethod() {
class LocalInner {
static int cv = 300; // 에러! static변수를 선언할 수 없다.
final static int CONST = 300; // final static은 상수이므로 허용
}
}
코드 예제2)
class outer {
int value = 10; // outer.this.value
class Inner {
int value = 20; // this.value
void method() {
int value = 30; // value
System.out.println("value :"+value;
System.out.println("this.value :"+this.value;
System.out.println("Outer.this.value :"+Outer.this.value;
}
}
}
class Ex{
public static void main(String args[]){
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.method();
}
}
[참고]
Java의 정석 (남궁성 저)
'공부 > 자바' 카테고리의 다른 글
컬렉션 프레임워크(Collections Framework) (0) | 2024.06.10 |
---|---|
예외 처리(Exception handling) (0) | 2024.06.04 |
인터페이스(interface) (0) | 2024.05.31 |
추상 클래스(abstract class) (0) | 2024.05.31 |
다형성(polymorphism) (0) | 2024.05.31 |