class A {
...
class B {
...
}
...
}
클래스 내에 선언된 클래스
내부 클래스도 일반적인 클래스와 비슷하다
두 클래스의 멤버들 간에 서로 쉽게 접근 가능
캡슐화 : 외부에는 불필요한 클래스를 감춰, 코드의 복잡성 ↓
// 변수의 종류에서
class Outer {
int iv = 0; // 인스턴스 변수
static int cv = 0; // static 변수
void Method() {
int lv = 0; // 지역 변수
}
}
// 클래스의 종류에서
class Outer {
class InstanceInner {} // 인스턴스 클래스
static class StaticInner {} // static 클래스
void Method() {
class LocalInner {} // 지역 클래스
}
}
변수의 종류 (static 변수, 인스턴스 변수, 지역 변수) 에서처럼, 그 성질은 동일하다
변수의 선언 위치 = 내부 클래스의 선언 위치
내부 클래스 = '클래스 + 멤버변수의 성질'을 모두 갖는다
class Outer { // 외부 클래스
class Inner { // 내부 클래스 (인스턴스 클래스)
int iv = 100; // 멤버변수
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer(); // 외부 클래스의 인스턴스 생성
Outer.Inner inner = outer.new Inner(); // 내부 클래스의 인스턴스 생성
System.out.println(inner.iv);
}
}
public class Ex {
class InstanceInner {
int iv = 100;
static int cv = 100; // 에러
}
static class StaticInner { // static 클래스
int iv = 200;
static int cv = 200; // 여기에서만 static 멤버를 정의할 수 있음
}
void method() {
class LocalInner {
int iv = 300;
static int cv = 300; // 에러
final static int CONST = 300; // static이 아닌, final static은 '상수'이므로 허용됨
}
}
}
class Outer { // 외부 클래스
private int outerIv = 0;
static int outerCv = 0; // static 멤버
class InstanceInner {
int iiv = outerIv; // 외부 클래스의 private 멤버에 접근 가능
int iiv2 = outerCv;
}
static class StaticInner { // static 클래스 : 외부 클래스의 static 멤버
int siv = outerIv; // 에러 : static 클래스는 외부 클래스의 인스턴스 멤버에 접근 X
static int scv = outerCv;
}
}
class Outer { // 외부 클래스
static class Inner { // 내부 클래스 (static 클래스)
int iv = 200; // 멤버변수
}
}
public class Main {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner();
System.out.println(inner.iv);
}
}
class Outer { // 외부 클래스
private int outerIv = 0;
static int outerCv = 0; // static 멤버
class InstanceInner {
int iiv = outerIv; // 외부 클래스의 private 멤버에 접근 가능
int iiv2 = outerCv;
}
static class StaticInner { // static 클래스 : 외부 클래스의 static 멤버
int siv = outerIv; // 에러 : static 클래스는 외부 클래스의 인스턴스 멤버에 접근 X
static int scv = outerCv;
}
void Method() {
int lv = 0;
final int LV = 0;
class LocalInner { // 지역 클래스
int liv = outerIv; // 외부 클래스인 인스턴스 멤버와 static 멤버 모두 사용 가능
int liv2 = outerCv; // 외부 클래스인 인스턴스 멤버와 static 멤버 모두 사용 가능
int liv3 = lv;
int liv4 = LV;
}
}
}
// 방법 1 : 단 하나의 클래스를 상속받기
new 부모클래스이름() }
// 멤버 선언
}
// 방법 2 : 단 하나의 인터페이스만 구현하기
new 구현인터페이스이름() {
// 멤버 선언
}
클래스의 선언 + 객체의 생성을 동시에 함
이름없는 클래스
일회용