반응형
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
Tags
- js
- Java
- 정규식
- IntelliJ
- junit
- junit5
- HashMap
- java테스트
- Eclipse
- 자바스크립트
- html
- javascript
- math
- string
- 자바
- 단위테스트
- json
- Visual Studio Code
- 자바문법
- ArrayList
- list
- Array
- CSS
- input
- 문자열
- vscode
- 배열
- 이클립스
- 테스트자동화
- 인텔리제이
Archives
- Today
- Total
어제 오늘 내일
[Java] 내부 클래스(inner class) 종류와 사용법 본문
Java의 내부 클래스(inner class)는 클래스 내부에 선언된 클래스로, 외부 클래스와 밀접한 연관이 있는 로직을 함께 묶어 관리할 때 사용됩니다.
내부 클래스는 외부 클래스의 멤버에 쉽게 접근할 수 있고, 구조를 논리적으로 그룹화하는 데 유용합니다. Java에서는 내부 클래스를 네 가지 형태로 제공합니다.
1. 멤버 내부 클래스 (Member Inner Class)
외부 클래스의 멤버 위치에 선언된 일반적인 내부 클래스입니다.
외부 클래스의 인스턴스 멤버에 자유롭게 접근할 수 있습니다.
예제
class Outer {
private int value = 10;
class Inner {
void print() {
System.out.println("value = " + value); // 외부 변수 접근 가능
}
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner(); // 생성 방법
inner.print();
}
}
특징
- 외부 클래스의 인스턴스를 기반으로 해야 객체 생성 가능
- 외부 클래스 멤버에 접근 쉬움
2. 정적(static) 내부 클래스 (Static Nested Class)
static으로 선언된 내부 클래스로, 외부 클래스의 인스턴스 없이 사용 가능합니다.
일반 내부 클래스와 달리 외부 클래스의 인스턴스 멤버에는 접근할 수 없습니다.
예제
class Outer {
static class Inner {
void hello() {
System.out.println("Static Inner Class");
}
}
}
public class Main {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner(); // 외부 인스턴스 없이 생성
inner.hello();
}
}
특징
- 외부 클래스의 static 멤버만 접근 가능
- 내부 클래스 중 가장 독립성이 강함
3. 지역(Local) 내부 클래스
메서드 내부에 선언되는 클래스이며, 메서드 내에서만 사용 가능합니다.
예제
class Outer {
void doSomething() {
int num = 10;
class LocalInner {
void print() {
System.out.println("num = " + num);
}
}
LocalInner inner = new LocalInner();
inner.print();
}
}
특징
- 메서드 안에서만 사용 가능
- 메서드의 지역 변수는 실질적 final이어야 접근 가능
4. 익명 클래스 (Anonymous Inner Class)
클래스를 별도로 선언하지 않고, 일회성 객체를 만들 때 사용합니다.
주로 인터페이스 구현 또는 메서드 오버라이딩에 자주 사용됩니다.
예제
interface Greeting {
void hello();
}
public class Main {
public static void main(String[] args) {
Greeting g = new Greeting() {
@Override
public void hello() {
System.out.println("Hello from Anonymous Class");
}
};
g.hello();
}
}
특징
- 이름 없는 클래스
- 코드 간결
- 이벤트 처리, 콜백 등에 자주 활용
5. 내부 클래스 사용을 고려하는 이유
✔ 외부 클래스와 강한 연관성이 있을 때
논리적으로 하나의 그룹으로 묶어 관리하기 좋음
✔ 캡슐화 향상
외부에서 사용할 필요 없는 클래스는 내부에 숨길 수 있음
✔ UI 이벤트 처리, 콜백 구조에서 편리
특히 익명 클래스는 짧은 코드로 동작 정의 가능
6. 네 가지 내부 클래스 비교
| 유형 | 선언위치 | 외부클래스 접근 | 객체 생성 방식 |
| 멤버 내부 클래스 | 외부 클래스 멤버 | 인스턴스 멤버 접근 가능 | outer.new Inner() |
| 정적 내부 클래스 | static 멤버처럼 선언 | static 멤버만 접근 가능 | new Outer.Inner() |
| 지역 내부 클래스 | 메서드 내부 | 지역 변수(final) 접근 가능 | 메서드 내에서만 생성 |
| 익명 클래스 | 표현식에서 즉시 생성 | 상속/구현 기반 | 일회성 객체 생성 |
7. 정리
- 내부 클래스는 외부 클래스와 논리적으로 연결된 클래스를 내부에 정의하는 방식
- 종류: 멤버 내부 클래스, 정적 내부 클래스, 지역 내부 클래스, 익명 클래스
- 각각 목적과 활용 방식이 다르므로 상황에 맞게 선택
- 특히 익명 클래스는 짧고 간결한 동작 정의에 매우 편리
반응형
'IT > Java' 카테고리의 다른 글
| [Java] enum 사용법 및 실전 예제 (0) | 2025.12.30 |
|---|---|
| [Java] 익명 클래스(anonymous class) 사용 예제 (0) | 2025.12.29 |
| [Java] 메서드 오버라이딩 규칙 정리 (0) | 2025.12.28 |
| [Java] 합성(Composition) vs 상속(Inheritance) (0) | 2025.12.28 |
| [Java] 객체지향 4대 원칙 정리 (상속, 추상화, 캡슐화, 다형성) (0) | 2025.12.27 |
Comments
