| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- java변수
- break문
- 메서드
- Java데이터 타입
- continue문
- 형 변환
- 연관관계
- 시스템 환경 변수 편집
- this예약어
- 생성자
- 자바 멀티스레딩
- 컴파일
- IntelliJ IDEA
- While
- 집합관계
- 포함관계
- Thread
- 인텔리제이 기초 설정
- Java
- 반복문
- OPP개념
- JAVA객체지향
- 메서드 오버로딩
- 상수
- multi-threading
- 인텔리제이 한글 깨짐 해결법
- function
- for문
- 접근제어지시자
- JAVA기초
- Today
- Total
최원종의 개발 블로그
Inner class(중첩 클래스) 본문
내부 클래스 (inner class)
- 자바에서 내부 클래스는 한 클래스 내부에 선언된 클래스를 말함.
- 내부 클래스를 선언하게 되면 내부 클래스와 외부 클래스라고 표현 가능
- 내부 클래스는 보통 외부 클래스와 연관이 있는 경우가 많고,
- 다른 곳에서 거의 사용할 일이 없는 경우에 내부 클래스를 선언해서 활용.
코드
package innerclass;
public class OuterClass1 {
private int num = 10;
// 클래스 파일안에 내부에 또 클래스 선언 (중첩클래스) // 인스턴스 내부 클래스
class InnerClass {
public void display() {
System.out.println("num : " + num);
}
}
} // end of outer class
-Main1
package innerclass;
public class Main1 {
public static void main(String[] args) {
// 내부 클래스가 일반 멤버 클래스로 설계된 경우
// 외부 클래스 객체가 생성되고 내부 클래스를 생성할 수 있다.
OuterClass1 outerClass = new OuterClass1();
OuterClass1.InnerClass innerClass = outerClass.new InnerClass();
innerClass.display();
}
}
내부 클래스의 종류
1. 멤버 내부 클래스: (Member Inner Class): 외부 클래스의 필드와 같은 위치에 선언되며, 외부 클래스의 인스턴스에 종속적.
멤버 내부 클래스의 인스턴스는 외부 클래스의 인스턴스가 있어야 생성할 수 있다.
2. 정적 내부 클래스: (Static Inner Class): 외부 클래스의 필드에 선언되지만, static 키워드를 사용하여 선언됨. 정적 내부 클래스는 외부 클래스의 인스턴스와 독립적으로 존재할 수 있으며, 주로 관련 있는 클래스들을 논리적으로 그룹화할 때 사용된다.
3. 지역 내부 클래스: (Local Inner Class): 메서드 내부에 선언되며, 선언된 메서드 내에서만 사용됨. 지역 내부 클래스는 해당 메서드의 지역 변수와 마찬가지로 스코프가 제한된다.
4. 익명 내부 클래스: (Anonymous Inner Class): 이름이 없는 내부 클래스로, 주로 인터페이스나 추상 클래스를 간편하게 구현할 때 사용됨. 익명 내부 클래스는 오직 하나의 인스턴스만 생성할 수 있으며, 주로 이벤트 처리나 콜백 구현에 사용된다.
-정적 내부 클래스 코드
package innerclass;
public class OuterClass2 {
private static int num = 10;
// 정적 내부 클래스
static class InnerClass {
public void display() {
System.out.println("num : " + num);
}
}
} // end of outer class
-Main2
package innerclass;
public class Main2 {
public static void main(String[] args) {
// 경우1
// Inner Class 일반 멤버 클래스로 설계된 경우
// 인스턴스 내부 클래스(기본)
// - 외부 클래스와 강하게 연결됨 상태
// - 외부 객체가 있어야 내부 객체를 호출할 수 있음.
// 경우 2
// static Inner Class 정적 클래스로 설계된 경우
// - 외부 클래스와 이름만 묶인 상태
// - 외부 객체 생성없이도 생성 가능
OuterClass2.InnerClass inner = new OuterClass2.InnerClass();
inner.display();
}
}
정적 내부 클래스 연습 코드
package innerclass;
// 정적 내부 클래스 연습
public class Spaceship {
private Engine engine;
// 엔진을 추가한다
public void addEngine(Engine engine) {
this.engine = engine;
}
public void startSpaceShip() {
if(engine == null) {
System.out.println("엔진을 먼저 장착해주세요");
} else {
System.out.println("우주여행을 출발 합니다");
}
}
// 논리적으로 강하게 그룹화 시킬 때 내부 클래스를 사용할 수 있다.
// 정적 내부 클래스 Engine
public static class Engine {
private static int engineCount = 0;
private int serialNumber;
public Engine() {
this.serialNumber = ++engineCount;
}
public void start() {
System.out.println("Engine " + serialNumber + " 동작 합니다");
}
} // end of inner static class
}
-SpaceshipMain
package innerclass;
public class SpaceshipMain {
public static void main(String[] args) {
// 정적 내부클래라서 바로 생성 가능함
Spaceship.Engine engine1 = new Spaceship.Engine();
Spaceship spaceship = new Spaceship();
spaceship.addEngine(engine1);
spaceship.startSpaceShip();
} // end of main
}
지역 내부 클래스(Local Inner Class)
지역 내부 클래스는 특정 메서드 내에서만 정의되고 사용되는 클래스.
지역 내부 클래스는 메서드 실행 시에만 존재하고 메서드의 지역 변수처럼 동작.
이 클래스는 외부에서는 접근할 수 없으며, 주로 메서드 내에서 일회성 작업을 수행하는 객체를 생성할 때 유용.
package innerclass;
// 지역 내부 클래스(Local inner class)
public class OuterClass3 {
public void display() {
// 메서드 안에 클래스를 선언
class LocalInnerClass {
void printMessage() {
System.out.println("지역 내부 클래스의 메서드");
}
} // 지역 내부 클래스
// 지역 내부 클래스의 인스턴스 생성
LocalInnerClass innerClass = new LocalInnerClass();
innerClass.printMessage();
}
}
-Main3
package innerclass;
public class Main3 {
public static void main(String[] args) {
OuterClass3 outerClass3 = new OuterClass3();
outerClass3.display();
} // end of main
}
익명 내부 클래스(이름 없는 클래스)
package innerclass;
// 익명 내부클래스 사용해 보기
public class OuterClass4 {
// 1.
Runnable runnable; // 인터페이스
// 1.
public OuterClass4() {
// 인터페이스를 구현 익명 클래스로 생성시킬 수 있다.
// 내부에서 추상 메서드를 일반 메서드로 재 정의해서 마치 실제 클래스 처럼 구현해서 사용할 수 있다.
new Runnable() {
@Override
public void run() {
//...
}
};
} // end of 생성자
// 2.
// 멤버 변수 선언과 동시에 인터페이스를 구현 클래스로 동시에 초기화
Runnable runnable2 = new Runnable() {
@Override
public void run() {
}
};
}
'Java > JAVA 유용한 클래스' 카테고리의 다른 글
| 자바 I/O 개론 (0) | 2026.03.20 |
|---|---|
| 멀티 스레딩(multi-threading) (0) | 2026.03.13 |
| Thread (0) | 2026.03.10 |
| Exception(예외처리) (0) | 2026.03.10 |
| String, StringBuffer (0) | 2026.03.10 |
