● 내부 클래스
- 클래스 내부에 선언된 클래스
- 클래스 내부에 클래스를 선언함으로써 외부 클래스의 필드를 마음대로 사용할 수 있다.
- 단독으로 동작할 필요가 없어서 굳이 밖에 만들 필요가 없을 때 사용한다.
1. 인스턴스 클래스
- 외부클래스 외부인스턴스 = new 외부클래스();
- 외부클래스.내부클래스 내부인스턴스 = 외부인스턴스.new 내부클래스();
2. 스태틱 클래스
- 외부클래스.내부클래스 내부인스턴스 = new 외부클래스.내부클래스();
3. 지역 클래스
- 메소드 안에 선언된 클래스로 메소드 영역에서만 사용이 가능하다.
4. 익명 클래스(무명 클래스)
- 이름이 없는 클래스를 의미하고, 일회성으로 사용할 때 활용한다.
※ A라는 클래스에서 b라는 작업이 자주 쓰이고, b라는 작업은 B클래스를 만들어야 쉽게 관리할 수 있다.
※ 하지만 A라는 클래스를 제외한 다른 클래스에서 b라는 작업이 필요없을 때와
B클래스를 노출하지 않고 A클래스 안에서만 자유롭게 활용하고 싶을 때 사용한다.
● 캡슐화
- 외부로부터 은닉하는 행위
- getter, setter, 접근제어자, 내부클래스
실습(인스턴스 클래스)
1. 인스턴스 클래스 생성
public class Outer {
InnerInstance ii = new InnerInstance();
int ov = 10; // 인스턴스 변수
class InnerInstance{ // 인스턴스 클래스
int iiv = 20;
public void printName() {
System.out.println(ov);
}
}
}
2. Main.java에서 실행
public class Main {
public static void main(String[] args) {
// 인스턴스 클래스 객체화 하기
Outer o = new Outer();
Outer.InnerInstance ii = o.new InnerInstance();
System.out.println(ii.iiv);
o.ii.printName();
}
}

실습(static 클래스)
1. static 클래스 생성
public class Outer {
static class InnerStatic{ // 스태틱 클래스
int isv = 30;
}
}
2. Main.java에서 실행
import innerTest.Outer.InnerStatic;
public class Main {
public static void main(String[] args) {
// 스태틱 클래스 객체화 하기
Outer.InnerStatic is = new Outer.InnerStatic();
System.out.println(is.isv);
}
}

실습(지역 클래스)
1. 지역 클래스 생성
public class Outer {
public void f() {
// 메소드 내부에서만 클래스가 필요할 때 사용한다.
class InnerLocal{ // 지역 클래스
int ilv = 40;
}
InnerLocal il = new InnerLocal();
System.out.println(il.ilv);
}
}
2. Main.java에서 실행
public class Main {
public static void main(String[] args) {
Outer o = new Outer();
o.f();
}
}

실습(익명 클래스)
1. Car.java 생성
public class Car {
String name;
public void go() {
}
}
2. Main.java에 익명 클래스 생성 및 Car.java의 메소드 오버라이드
import interTest.Soldier;
public class Main {
public static void main(String[] args) {
// 익명클래스
Soldier s = new Soldier() {
@Override
public void work() {
// TODO Auto-generated method stub
}
@Override
public void sleep() {
// TODO Auto-generated method stub
}
@Override
public void eat() {
// TODO Auto-generated method stub
}
};
Car c = new Car() {
@Override
public void go() {
System.out.println("override된 메소드");
}
public void engineOn() {
System.out.println("버튼으로 시동 켬");
}
};
c.name = "홍길동";
c.go();
// c.engineOn(); // 새롭게 만든 메소드는 사용 불가
}
}
