- 멤버 내부 클래스(Member Inner Class): 외부 클래스의 필드와 같은 위치에 선언되며, 외부 클래스의 인스턴스에 종속적이다.
- 멤버 내부 클래스의 인스턴스는 외부 클래스의 인스턴스가 있어야 생성할 수 있다.
package inner;
public class OuterClass {
private int num = 10;
//inner 클래스란 클래스 안의 클래스를 말한다.
// 멤버 내부 클래스
class InnerClass {
public void display() {
System.out.println("inner class display() 호출 " + num);
}
} // end of inner class
//메인 함수
public static void main(String[] args) {
// InnerClass innerClass = new InnerClass();
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
innerClass.display();
}
} // end of outer class
- 정적 내부 클래스(Static Inner Class): 외부 클래스의 필드에 선언되지만, static 키워드를 사용하여 선언된다.
- 정적 내부 클래스는 외부 클래스의 인스턴스와 독립적으로 존재할 수 있으며, 주로 관련 있는 클래스들을 논리적으로 그룹화할 때 사용된다.
package inner;
/**
* 정적 내 클래스(static inner class)
*/
public class Spaceship {
private Engine innerEngine;
// 우주선에 엔진 추가
public void addEngine(Engine engine) {
innerEngine = engine;
}
public void startSpaceship() {
if (innerEngine == null) {
System.out.println("엔진을 먼저 장착해주세요");
} else {
System.out.println("달나라로 출발 합니다 슈웅~~");
}
}
//정적 내부 클래스
public static class Engine {
public static int ENGINE_COUNT = 0;
private int serialNumber;
public Engine() {
ENGINE_COUNT++;
this.serialNumber = ENGINE_COUNT;
}
public void start() {
System.out.println("Engine" + serialNumber + "동작합니다 부릉~~");
}
} // end of inner Engine
}
package inner;
public class SpaceshipMainTest {
public static void main(String[] args) {
// 멤버 내부 클래스 --> 외부 클래스가 먼저 생성이 되어야 접근 가능
// 정적 내부 클래스 사용
Spaceship s1 = new Spaceship();
s1.startSpaceship();
Spaceship.Engine 누리호1번엔진 = new Spaceship.Engine();
Spaceship.Engine 누리호2번엔진 = new Spaceship.Engine();
Spaceship.Engine 누리호3번엔진 = new Spaceship.Engine();
s1.addEngine(누리호1번엔진);
s1.startSpaceship();
// 사용하는 이유
// [논리적인 그룹화]
// 정적 내부 클래스는 외부 클래스와 논리적으로 관련 있는 클래스들을
// 그룹화하는데 유용하다. 이는 코드의 가독성과 구조화 개선이며 관련 클레스들을
// 함께 유지할 수 있게 도움을 준다.
} // end of main
}