내부 클래스는 클래스 내에 선언된 클래스이다. 클래스에 다른 클래스를 선언하는 이유는 간단하다. 두 클래스가 서로 긴밀한 관계에 있기 때문이다. 한 클래스를 다른 클래스의 내부 클래스로 선언하면 두 클래스의 멤버들 간에 서로 쉽게 접근할 수 있다는 장점과 외부에는 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.
내부 클래스의 종류와 특징
- 인스턴스 클래스(instance class) : 외부 클래스의 멤버변수 선언 위치에 선언하며, 외부 클래스의 인스턴스 멤버처럼 다루어진다.주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 사용된다.
- 정적 내부 클래스(static class) : 외부 클래스의 멤버변수 선언 위치에 선언하며, 외부 클래스의 static 멤버 처럼 다루어진다. 주로 외부 클래스의 static 멤버, 특히 static 메서드에서 사용될 목적으로 선언된다.
- 지역 클래스(local class) : 외부 클래스의 메서드나 초기화 블럭 안에 선언하며, 선언된 영역 내부에서만 사용할 수 있다.
- 익명 클래스 (anonymous class) : 클래스의 선언과 객체의생성을 동시에 하는 이름 없는 클래스 (일회용)
인스턴스 클래스 (Instance class)
인스턴스 클래스는 외부 클래스의 멤버들의 접근성을 높입니다. 특히, 외부 클래스의 인스턴스 멤버로 존재하며, 외부 클래스의 인스턴스 멤버에 접근할 수 있습니다.
- 외부 클래스의 인스턴스 멤버에 접근 가능 : 인스턴스 클래스는 외부 클래스의 인스턴트 변수와 메서드에 접근할 수 있습니다.
- 외부 클래스의 객체와 연결됨 : 인스턴스 클래스는 외부 클래스의 객체와 연결되어 있으며, 외부 클래스의 객체가 없으면 인스턴스 클래스를 사용할 수 없습니다.
- 독립적인 인스턴스 생성 불가 : 인스턴스 클래스는 외부 클래스의 인스턴스가 있어야만 생성될 수 있습니다.
public class OuterClass {
private final String outerString = "Outer String";
class InnerClass {
public void display() {
System.out.println("This is an inner class" + outerString);
}
}
public void createInnerClass() {
InnerClass innerClass = new InnerClass();
innerClass.display();
}
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.createInnerClass();
}
}
해당 예시에서 InnerClass는 OuterClass의 인스턴스 클래스입니다. InnerClass는 OuterClass의 private 멥버 변수 outerString에 접근할 수 있으며, OuterClass의 인스턴스를 통해서면 생성되고 사용됩니다. main 함수에서 OuterClass의 인스턴스를 생성하고 이를 통해 InnerClass의 메서드를 호출합니다.
정적 내부 클래스 (static class)
정적 내부 클래스(Static inner class)는 외부 클래스의 정적 멤버처럼 동작하는 내부 클래스 입니다.
- 독립성 : 정적 내부 클래스는 외부 클래스의 인스턴스와 독립적입니다. 즉, 외부 클래스의 인스턴스를 생성하지 않고도 정적 내부 클래스이 인스턴스를 생성할 수 있습니다.
- 접근성 : 정적 내부 클래스는 외부 클래스의 모든 정적 멤버(변수와 메서드)에 접근할 수 있음, 외부 클래스의 멤버에는 직접 접근이 불가 합니다.
- 생성방법 : 외부 클래스의 이름을 사용하여 정적 내부 클래스의 객체를 생성합니다. 예를들어
- OuterClass.StaticInnerClass obj = new OuterClass.StaticInnerClass();
정적 내부 클래스는 주로 외부 클래스와 연관되어 있지만, 외부 클래스의 인스턴스 상태에 의존하지 않는 경우에 유용합니다. 이러한 클래스는 코드의 조직화 및 모듈화를 도와 코드의 가독성과 유지 보수성을 향상 시킬 수 있습니다.
public class OuterClass {
// 외부 클래스의 정적 변수
static int outerStaticVar = 10;
// 외부 클래스의 인스턴스 변수
int outerInstanceVar = 20;
// 정적 내부 클래스 정의
static class StaticInnerClass {
void display() {
// 정적 내부 클래스에서는 외부 클래스의 정적 변수에 접근할 수 있습니다.
System.out.println("외부 클래스의 정적 변수: " + outerStaticVar);
// 하지만, 외부 클래스의 인스턴스 변수에는 접근할 수 없습니다.
// System.out.println("외부 클래스의 인스턴스 변수: " + outerInstanceVar); // 오류 발생
}
}
}
public class Main {
public static void main(String[] args) {
// 정적 내부 클래스의 인스턴스 생성
OuterClass.StaticInnerClass innerObject = new OuterClass.StaticInnerClass();
innerObject.display();
}
}
'자바' 카테고리의 다른 글
Java Lamda 표현식과 Stream API (1) | 2024.01.31 |
---|---|
함수형 프로그래밍과 일급객체 (0) | 2024.01.31 |
자바 캐스팅(casting) (1) | 2023.12.15 |
final, 상수 (0) | 2023.12.14 |
static (0) | 2023.12.13 |