자바(Java)에서는 내부 클래스(Inner Class)라는 개념이 있다. 다른 클래스 내부에 정의된 클래스를 의미한다.
이러한 내부 클래스는 어떤 것들이 있는지 알아보자.
인스턴스 내부 클래스 Instance Inner Class
인스턴스 내부 클래스는 외부 클래스의 인스턴스와 관련이 있다. 따라서 외부 클래스의 인스턴스를 생성한 후 내부 클래스의 인스턴스를 생성할 수 있다.
인스턴스 내부 클래스는 외부 클래스의 인스턴스 멤버(변수 및 메서드)에 접근할 수 있다.
class Outer {
int outerVar;
class Inner {
void innerMethod() {
System.out.println("외부 클래스 변수 접근: " + outerVar);
}
}
}
정적 내부 클래스 Static Inner Class
정적 내부 클래스는 외부 클래스와 독립적으로 생성될 수 있으며, 외부 클래스의 정적 멤버(정적 변수 및 메서드)에만 접근할 수 있다.
외부 클래스의 인스턴스 생성 없이 내부 클래스를 사용할 수 있다.
class Outer {
static int staticVar;
static class Inner {
void innerMethod() {
System.out.println("정적 내부 클래스에서 정적 변수 접근: " + staticVar);
}
}
}
지역 내부 클래스 Local Inner Class
지역 내부 클래스는 메서드나 블록 내부에서 정의되며, 해당 메서드나 블록 내부에서만 사용할 수 있다.
주로 메서드 내부에서 임의로 사용할 클래스를 정의할 때 사용된다.
class Outer {
void outerMethod() {
class LocalInner {
void innerMethod() {
System.out.println("LocalInner 클래스 내부 메서드");
}
}
LocalInner localInner = new LocalInner();
localInner.innerMethod();
}
}
익명 내부 클래스 Anonymous Inner Class
익명 내부 클래스는 이름 없이 정의되며, 주로 인터페이스나 추상 클래스의 인스턴스를 생성할 때 사용된다.
일반적으로 한 번만 사용되고 더 간단한 구문으로 클래스를 정의하는데 유용하다.
interface MyInterface {
void myMethod();
}
class Outer {
void useInterface() {
MyInterface anonymousInner = new MyInterface() {
@Override
public void myMethod() {
System.out.println("익명 내무 클래스의 메서드");
}
};
anonymousInner.myMethod();
}
}
내부 클래스를 사용하는 이유
내부 클래스는 다음과 같은 상황에서 사용된다.
캡슐화 및 은닉성 확보
내부 클래스는 외부 클래스의 멤버에 더 쉽게 접근할 수 있으므로, 특정 멤버 변수나 메서드를 외부로부터 은닉하고 캡슐화할 때 사용된다. 내부 클래스를 사용하면 외부 클래스의 멤버에 더 쉽게 접근하고 조작할 수 있으며, 외부로부터의 접근을 제한할 수 있다.
코드 모듈화
내부 클래스는 논리적으로 관련된 클래스를 하나의 단위로 그룹화 할 수 있다. 이는 코드를 더 모듈화 하고 유지보수를 쉽게 만들어준다.
콜백 및 이벤트 처리
내부 클래스는 인터페이스를 구현하거나 추상 클래스를 확장하여 콜백 함수나 이벤트 핸들러를 구현할 때 사용된다. 예를 들어, 그래픽 사용자 인터페이스에서 버튼 클릭과 같은 이벤트를 처리하는 데 내부 클래스를 사용할 수 있다.
컬렉션 클래스 확장
자바의 컬렉션 프레임워크에서는 내부 클래스를 사용하여 컬렉션 클래스의 구현을 확장할 수 있다. 이렇게 하면 사용자 정의 컬렉션을 만들거나 특정 동작을 커스터마이징 할 수 있다.
프레임워크와 라이브러리 개발
프레임워크나 라이브러리 개발 시에 내부 클래스를 활용하여 사용자 정의 타입을 정의하고 라이브러리의 내부 동작을 캡슐화할 수 있다.
싱클톤 패턴
내부 클래스를 사용하여 스레드 안전한 싱글톤 인스턴스를 생성할 수 있다. 내부 클래스를 활용하면 지연 초기화(Lazy Initialization)와 스레드 안전성을 동시에 달성할 수 있다.
네스팅 클래스
내부 클래스는 다른 클래스 내부에 중첩될 수 있으므로, 관련 클래스를 논리적으로 그룹화하고 관리할 때 사용된다.
내부 클래스의 사용은 코드의 가독성과 유지보수성을 높이고, 객체 지향 프로그래밍 원칙을 준수하는 데 도움이 된다. 그러나 과도하게 내부 클래스를 사용하면 코드가 복잡해질 수 있으므로 적절하게 사용해야 한다.
'쿤즈 Dev > Java' 카테고리의 다른 글
[Java] 열거형(Enum) 사용하기 (0) | 2023.09.19 |
---|---|
[Java] 인터페이스 Interface (0) | 2023.09.17 |
[Java] 추상 키워드 abstract (0) | 2023.09.15 |
[Java] 업캐스팅 (Upcasting)과 다운캐스팅 (Downcasting) (0) | 2023.09.14 |
[Java] Object 클래스의 toString(), hashCode() 메서드 (0) | 2023.09.12 |
댓글