내부클래스(Inner class)란?
내부 클래스(Inner class)란 하나의 클래스 내부에 선언된 또 다른 클래스를 뜻한다. 대게 보통은 클래스 자료형이 필요하면 메인 클래스 외부에 선언하거나, 따로 독립적인 클래스 파일을 만들어 불러와 사용한다. 내부 클래스는 말 그대로 클래스 내에 선언되어 사용되며, 내부에 정의된다는 점을 제외하고는 일반적인 클래스와 다를바가 없다!! 내부 클래스는 중첩(nested) 클래스로 분류 되기도 한다. 아래 왼쪽의 A와 B 두 개의 독립적인 클래스를 오른쪽과 같이 바꾸면 B는 A의 내부 클래스(Inner class)가 되고 A는 B를 감싸고 있는 외부 클래스(Outer class)가 된다.
내부클래스의 사용 목적과 장점
내부 클래스는 두 클래스가 서로 긴밀한 관계가 있거나, 하나의 클래스 또는 메소드에서만 사용되는 클래스일 때 이용된다.
1. 캡슐화 강화 및 외부 클래스의 멤버들에 대한 접근 용이성
내부 클래스를 사용하면 외부 클래스에서만 사용되는 클래스를 내부에 두어 다른 클래스로부터 숨길 수 있으며, 이는 캡슐화를 강화한다. 아래의 예제에서 OuterClass 는 private 멤버 변수 secret 을 가지고 있다. 이는 외부에서 직접 접근할 수 없어 캡슐화를 구현한다. 그러나 내부 클래스인 InnerClass 는 OuterClass 의 모든 멤버(private 포함) 에 접근할 수 있다. 따라서 showSecret 메소드는 바깥 클래스의 private 멤버 변수 secret 의 값을 출력할 수 있다.
public class OuterClass {
private String secret = "내부 클래스만 알 수 있는 비밀";
class InnerClass {
public void showSecret() {
System.out.println(secret); // 바깥 클래스의 private 멤버에 접근
}
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass(); // 내부 클래스의 인스턴스 생성
inner.showSecret(); // 내부 클래스를 통해 비밀을 출력
}
}
2. 코드의 논리적 그룹화
함께 사용되는 클래스를 내부적으로 그룹화 함으로써 코드의 가독성과 유지보수성을 향상시킨다. 아래의 예제는 OuterClass 가 있고, 이 클래스 안에는 InnerClass 와 AnotherClass 라는 두개의 내부 클래스가 정의 되어 있다. InnerClass 는 기본 정보를 출력하는 기능을 담당, AnotherClass 는 추가 정보를 출력하는 기능을 담당한다. 이렇게 구분하여 코드가 논리적으로 그룹화 되므로, 각 클래스는 독립적인 기능을 수행하면서도 OuterClass 와 밀접한 연관을 지니는 구조를 만든다.
public class OuterClass {
private String name = "OuterClass";
// 내부 클래스 1: 기본 정보를 출력하는 기능을 담당
class InnerClass {
public void printInfo() {
System.out.println("이것은 " + name + "의 기본 정보입니다.");
}
}
// 내부 클래스 2: 추가 정보를 출력하는 기능을 담당
class AnotherInnerClass {
public void printAdditionalInfo() {
System.out.println("이것은 " + name + "의 추가 정보입니다.");
}
}
// OuterClass에서 내부 클래스 사용 예시
public void demonstrateInnerClasses() {
InnerClass inner = new InnerClass();
inner.printInfo();
AnotherInnerClass anotherInner = new AnotherInnerClass();
anotherInner.printAdditionalInfo();
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.demonstrateInnerClasses();
}
}
내부 클래스의 종류와 특징
클래스 멤버 변수도 선언위치에 따라 인스턴스 변수, 클래스 변수(static 변수), 지역변수로 구분되는 것과 같이 내부 클래스도 선언 위치에 띠리 4가지로 구분된다.
내부 클래스 | 특징 |
인스턴스 클래스 (instance class) |
외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스 멤버처럼 다루어진다. 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언된다. |
스태틱 클래스 (static class) |
외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 static 멤버처럼 다루어진다. 주로 외부 클래스의 static 멤버, 특히 static 메서드에서 사영될 목적으로 선언된다. |
지역 클래스 (local class) |
외부 클래스의 메서드나 초기화블럭 안에 선언하며, 선언된 영역 내부에서만 사용될 수 있다. |
익명 클래스 (anonymous class) |
클래스의 선언과 객체의 생성을 동시에 하는 이름 없는 클래스이다. |
class OuterClass{
class InstacneInnerClass {...} //인스턴스 클래스
static class StaticInnerClass {...} // 스태틱 클래스
void method{
class LocalInnerClass{...} //지역 클래스
}
}
인스턴스 클래스(instance class)
- 클래스의 멤버 변수 선언부에 위치하고 static 키워드가 없는 내부 클래스
- 외부 클래스의 멤버로 취급되기 때문에 외부 클래스의 객체 먼저 생성한 후 내부 클래스의 객체 생성이 가능
- 인스턴스 클래스 내부에는 instance 멤버만 선언 가능 (static은 불가능)
- 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언
스태틱 클래스(static class)
- static 키워드가 붙은 내부 클래스
- 일반적인 staric 필드 변수, static 메서드와는 다름
- static 클래스 내부에는 instance 멤버와 static 멤버 모두 선언 가능
- 외부 클래스의 인스턴스 멤버에는 접근이 불가하고, 정적(static) 멤버에만 접근 가능
로컬 클래스(local class)
- 메소드 내부에 위치하는 클래스(로컬 변수와 같은 성질을 가짐)
- 로컬 변수처럼 해당 메서드 내부에서만 한정적으로 사용
- 접근제한자와 static 사용 불가
-> 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없음
익명 클래스(anonymous class)
- 이름이 존재하지 않는 inner class
- 하나의 객체만을 생성하는 일회용 클래스
- 클래스의 선언과 동시에 객체를 생성
- 익명 클래스는 생성자가 존재할 수 없음
- 익명 클래스는 기존에 존재하는 클래스를 메서드 내에서 일회용으로 클래스 내부 구성을 선언하여 필요한 메서드를 재정의 하여 사용
'Java' 카테고리의 다른 글
[Java] 에노테이션 (Annotation) - 수정 (0) | 2024.05.10 |
---|---|
[Java] 예외(Exception) (0) | 2024.05.09 |
[Java] 인터페이스(Interface) (0) | 2024.04.29 |
[Java] 추상화(Abstract) (2) | 2024.04.28 |
[Java] 다형성 (Polymorphism) (0) | 2024.04.26 |