⭐내부 클래스
Inner Class
클래스 속 클래스
🤔Why?
⭐ 논리적인 그룹화
외부클래스 Outer Class 와 내부 클래스 Inner Class 를 논리적으로 묶어
논리적으로 그룹화한다.
👍이는 코드의 가독성과 구조화를 향상해
관련 클래스들을 유지하는데 도움을 준다.
주로 두 클래스가 연관이 크고 다른 곳에서 쓸일이 없을때 쓴다.
멤버 내부 클래스
Member Inner Class
주로 외부클래스 필드에 선언
✨정적 내부 클래스
Static Inner Class
외부 클래스의 필드에 선언되지만 static 키워드를 사용하여 선언되는 점이 다르다.
public static class xxx {
}
지역 내부 클래스
Local Inner Class
메서드 내부에 선언된다.
익명 내부 클래스
Anonymous Inner Class
이름이 없다. 주로 인터페이스나 추상클래스에 들어간다.
😎How
예제1) 멤버 내부 클래스 만들어보기
멤버 내부 클래스의 인스턴스는 외부 클래스의 인스턴스가 있어야 생성할 수 있다.
package _Inner;
/**
* 4.25 inner 클래스 1강
*
* 멤버 내부 클래스
*/
public class OuterClass {
private int num1 =10;
/*
inner 클래스란
클래스 속 클래스다.
멤버 내부 클래스를 만들어보자
*/
class InnerClass {
public void display() {
System.out.println("inner class display() 호출" + num1);
//외부 클래스에 있는 변수 호출
}
}//end of inner class
//main thread
public static void main(String[] args) {
// InnerClass = innerClass = new InnerClass();
//이너클래스를 그냥 메모리에 올릴 수는 없다.
OuterClass OuterClass = new OuterClass();
OuterClass.InnerClass innerClass = OuterClass.new InnerClass();
innerClass.display();
}//end of main
}//end of outter class
예제2) 지역 내부 클래스 만들기
메서드 내부에 선언되며 선언된 메서드 내에서만 사용된다.
package _Inner;
/**
* 4.25 inner 클래스 2강
*
* 지역 내부 클래스
* Local Inner Class
*
* 메서드 안에서 생성됐다가
* 메서드 호출이 끝나면 사라진다.
*/
public class OuterClass2 {
public void display() {
//지역 내부 클래스
class LocalInnerClass {
void printMessage() {
System.out.println("지역 내부 클래스의 메서드 호출");
}
}//end of class
/*
LocalInnerClass 생성
display() 메서드가 호출됐을 때 생성됐다고
메서드 호출이 끝나면 사라진다.
*/
LocalInnerClass inner = new LocalInnerClass();
inner.printMessage();
}//end of method display()
//main
public static void main(String[] args) {
OuterClass2 outerClass2 = new OuterClass2();
outerClass2.display(); //지역 내부클래스의 메서드 호출
}//end of main
}//end of class OuterClass2
예제3)
인터페이스나 추상 클래스를 간편하게 구현할 때 사용한다.
package _Inner;
/**
* 4.25 inner 클래스 2강
* <p>
* 익명 내부 클래스
* 익명, 이름이 없다..
*/
public class OuterClass3 {
// Runnable runnable; //인터페이스
/*
인터페이스는 기본적으로 인스턴스화 할 수 없다.
하지만, 익명 내부 클래스로 구현할 수 있다.
*/
public OuterClass3() {
/*
1.구현부를 만들어준다
2.추상메서드를 구현메서드로 변경해준다
*/
new Runnable() {
@Override
public void run() {
}
};
}
//main
public static void main(String[] args) {
/*
익명 클래스란?
익명, 이름이 없는 클래스다.
*/
new OuterClass3(); //이것은 익명 클래스다.
}//end of main
}//end of class
예제4) 정적 내부 클래스 만들기
static 키워드를 사용하여 선언된다.
이러면 외부 클래스의 인스턴스와 독립적으로 존재할 수 있다.
package _Inner;
/**
* 4.25 inner 클래스 1강
*
* 정적 내부 클래스를 만들어보자
* Static Inner Class
*/
public class Spaceship {
private Engine innerEngine;
// 우주선에서만 사용할 Engine 클래스를 만들고 싶어졌다.
//method - 우주선 엔진 추가
public void addengine(Engine engine) {
innerEngine = engine;
}
//method - 우주선 출발
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("엔진 " + serialNumber + "번 가동");
}
}//end of inner class
}//end of outer class
package _Inner;
/**
* 4.25 inner 클래스 1강
*
* 정적 내부 클래스를 만들어보자
* Static Inner Class
*/
public class SpaceshipMainTest {
//main thread
public static void main(String[] args) {
/*
멤버 내부 클래스의 문제점
외부 클래스가 먼제 생성돼야 접근 가능하다.
불편하다
정적 내부 클래스를 사용한다면?
*/
Spaceship s1 = new Spaceship();
s1.startSpaceShip();
Spaceship.Engine engine1 = new Spaceship.Engine();
Spaceship.Engine engine2 = new Spaceship.Engine();
Spaceship.Engine engine3 = new Spaceship.Engine();
s1.addengine(engine1); //우주선 si 에 엔진 engine1 추가
s1.startSpaceShip(); //우주선 si 가동
/*
Why? 정적 내부 클래스를 사용하는 이유?
⭐논리적인 그룹화
정적 내부 클래스는
외부 클래스와 논리적으로 관련있는 클래스를
그룹화하는데 유용하다
👍이는 코드의 가독성과 구조화를 향상해
관련 클래스들을 유지하는데 도움을 준다.
*/
}//end of main
}//end of class
'Java' 카테고리의 다른 글
Swing 예제, JLabel로 이미지 팝업하기 (0) | 2025.04.29 |
---|---|
스윙 Swing, 자바에서 GUI를 만들어주는 도구 (0) | 2025.04.28 |
멀티 쓰레드 Multi Threading, 쓰레드 동시 수행... 동기화 처리가 중요 (0) | 2025.04.25 |
쓰레드 Thread, 작업을 수행하는 단위 (0) | 2025.04.25 |
예외처리 Exception, 예상치 못한 상황에 대비 (0) | 2025.04.24 |