Language/Java
내부 클래스
Jinn
2024. 1. 6. 23:15
class A { // 외부 클래스
// 내부 클래스
class B { // 인스턴스 클래스 }
static class C { // 스태틱 클래스 }
void methodA() {
class D { // 지역 클래스 }
}
}
내부 클래스는 말 그대로 클래스 안의 클래스를 의미한다.
class A {
int num = 10;
}
class B {
void printA() {
A a = new A();
System.out.println(a.num);
}
}
public class Main {
public static void main(String[] args) {
B b = new B();
b.printA(); // 10
}
}
B 클래스에서 A 클래스의 멤버를 사용하려면 B 클래스 안에서 A 객체를 생성해서 사용해야 한다.
class A {
int num = 10;
class B {
void printA() {
System.out.println(num);
}
}
}
public class Main {
public static void main(String[] args) {
B b = new B();
b.printA(); // 10
}
}
B 클래스가 A 클래스의 내부 클래스가 되면서 A 클래스의 멤버를 객체 생성 없이 바로 사용할 수 있게 되었다.
또한 다른 클래스에서 B 클래스의 멤버에 바로 접근할 수 없다. (캡슐화)
클래스는 default, public 제어자만 사용할 수 있지만 내부 클래스는 private, protected 제어자도 사용 가능하다.
class A {
private class InstanceInner {}
protected static class StaticInner{}
void foo() {
class LocalInner {}
}
}
static 멤버는 static 클래스만 정의할 수 있다.
class Outer {
int outerIv = 100; // static 내부 클래스에서 접근 불가능
class InstanceInner {
int iv = 10; // instance 변수 가능
static int cv = 10; // static 변수 선언 불가능
final static int CONST = 10; // final static은 상수이므로 가능
}
static class StaticInner {
int iv = 10; // instance 변수 가능
static int cv = 10; // static 변수 가능
final static int CONST = 10; // final static 가능
}
void foo() {
class LocalInner {
int iv = 10; // instance 변수 가능
static int cv = 10; // static 변수 선언 불가능
final static int CONST = 10; // final static은 상수이므로 가능
}
int iv = LocalInner.CONST; // 가능
}
public static void main(String[] args) {
System.out.println(InstanceInner.CONST); // 가능
System.out.println(StaticInner.cv); // 가능
System.out.println(LocalInner.CONST); // 불가능
}
}