java
자바에서 중첩 클래스(Nested Class)는 자바 프로그래밍의 중요한 개념 중 하나로, 클래스 안에 다른 클래스를 정의하는 방식입니다. 이러한 클래스들은 캡슐화를 강화하고, 외부 클래스와 긴밀하게 연결된 동작을 수행할 수 있도록 설계됩니다. 중첩 클래스는 여러 종류가 있으며, 각 클래스는 서로 다른 사용 목적과 특징을 가집니다.
중첩 클래스는 클래스 내부에 정의된 클래스를 의미합니다. 클래스 내부에서 또 다른 클래스를 정의함으로써 두 클래스 간의 관계를 명확히 할 수 있습니다. 중첩 클래스는 일반적으로 외부 클래스의 논리적 일부로 간주되며, 그 외부 클래스에서만 사용되는 특정 동작을 캡슐화할 수 있습니다.
중첩 클래스는 크게 두 가지로 분류됩니다.
정적 중첩 클래스는 외부 클래스의 멤버로 선언되지만, 정적인(static) 특성을 갖기 때문에 외부 클래스의 인스턴스와 독립적으로 동작할 수 있습니다. 정적 중첩 클래스는 외부 클래스의 정적 멤버 변수나 메서드에만 접근할 수 있으며, 외부 클래스의 인스턴스 변수나 인스턴스 메서드에는 접근할 수 없습니다.
public class OuterClass {
// 외부 클래스의 정적 변수
private static int outerStaticVar = 10;
// 정적 중첩 클래스
public static class StaticNestedClass {
public void display() {
System.out.println("외부 클래스의 정적 변수: " + outerStaticVar);
}
}
}
public class Main {
public static void main(String[] args) {
// 정적 중첩 클래스의 인스턴스 생성
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
nestedObject.display();
}
}
Java출력 결과
외부 클래스의 정적 변수: 10
Java정적 중첩 클래스는 일반 클래스와 유사하게 동작하지만, 외부 클래스의 인스턴스 없이도 사용할 수 있다는 점에서 차이가 있습니다. 주로 외부 클래스와 관련된 정적인 맥락에서 사용됩니다.
내부 클래스는 외부 클래스의 인스턴스에 속한 클래스입니다. 외부 클래스의 멤버에 자유롭게 접근할 수 있으며, 외부 클래스와 강하게 연결된 동작을 수행할 수 있습니다. 내부 클래스는 다시 세 가지 종류로 분류됩니다.
인스턴스 내부 클래스는 외부 클래스의 인스턴스에 속하는 클래스입니다. 외부 클래스의 인스턴스 변수와 메서드에 접근할 수 있으며, 외부 클래스의 인스턴스가 있어야만 생성할 수 있습니다.
public class OuterClass {
private int outerVar = 10;
// 인스턴스 내부 클래스
public class InnerClass {
public void display() {
System.out.println("외부 클래스의 인스턴스 변수: " + outerVar);
}
}
}
public class Main {
public static void main(String[] args) {
// 외부 클래스의 인스턴스를 먼저 생성해야 내부 클래스 사용 가능
OuterClass outerObject = new OuterClass();
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
innerObject.display();
}
}
Java출력 결과
외부 클래스의 인스턴스 변수: 10
Java인스턴스 내부 클래스의 특징
지역 내부 클래스는 메서드 내부에서 정의되는 클래스입니다. 주로 특정 메서드 내에서만 사용되며, 메서드의 로컬 변수처럼 동작합니다. 지역 내부 클래스는 메서드가 호출될 때마다 새로 정의되고, 메서드가 종료되면 더 이상 접근할 수 없습니다.
public class OuterClass {
public void methodWithInnerClass() {
// 메서드 내에서 지역 내부 클래스 정의
class LocalInnerClass {
public void display() {
System.out.println("메서드 내에서 정의된 지역 내부 클래스");
}
}
// 지역 내부 클래스의 인스턴스 생성 및 메서드 호출
LocalInnerClass localInnerObject = new LocalInnerClass();
localInnerObject.display();
}
}
public class Main {
public static void main(String[] args) {
OuterClass outerObject = new OuterClass();
outerObject.methodWithInnerClass();
}
}
Java출력 결과
메서드 내에서 정의된 지역 내부 클래스
Java지역 내부 클래스의 특징
익명 내부 클래스는 이름이 없는 클래스입니다. 자주 사용되지 않는 클래스이거나 일회성 클래스의 정의가 필요할 때 사용됩니다. 주로 인터페이스나 추상 클래스를 구현할 때 많이 사용되며, 즉석에서 클래스의 인스턴스를 생성하는 데 유용합니다.
public class OuterClass {
public void methodWithAnonymousClass() {
// 익명 내부 클래스를 통해 인터페이스 구현
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("익명 내부 클래스의 메서드 실행");
}
};
runnable.run();
}
}
public class Main {
public static void main(String[] args) {
OuterClass outerObject = new OuterClass();
outerObject.methodWithAnonymousClass();
}
}
Java출력 결과
익명 내부 클래스의 메서드 실행
Java익명 내부 클래스의 특징
자바의 중첩 클래스와 내부 클래스는 프로그래밍에서 강력한 도구가 될 수 있습니다. 외부 클래스와 밀접한 관련이 있는 기능을 논리적으로 묶고, 코드의 구조를 더 명확하게 할 수 있습니다. 그러나 남용하거나 불필요하게 사용할 경우 코드가 복잡해질 수 있으므로, 적절한 상황에서만 사용하는 것이 좋습니다.
중첩 클래스와 내부 클래스는 자바의 객체 지향적인 특성과 맞물려 코드의 재사용성, 가독성, 캡슐화를 높이는 데 기여합니다. 다양한 상황에서 이러한 클래스를 효과적으로 활용하여 더 나은 자바 프로그램을 작성할 수 있도록 노력해야 합니다.
Readable Code: 읽기 좋은 코드를 작성하는 사고법Practical Testing: 실용적인 테스트 가이드 강의와 함께한 인프런 워밍업 클럽…
Readable Code: 읽기 좋은 코드를 작성하는 사고법Practical Testing: 실용적인 테스트 가이드 강의와 함께한 인프런 워밍업 클럽…
테스트 시 의존성 주입(Dependency Injection)과 Mockito Spring 애플리케이션을 개발하다 보면, 테스트 코드에서 실제 빈(Bean)을 사용하지…
들어가며 스프링 기반 프로젝트에서 좋은 설계 구조와 테스트 전략은 소프트웨어 품질과 유지보수성에 직결됩니다. 최근 학습한…
Readable Code: 읽기 좋은 코드를 작성하는 사고법Practical Testing: 실용적인 테스트 가이드 강의와 함께한 인프런 워밍업 클럽…
Readable Code: 읽기 좋은 코드를 작성하는 사고법Practical Testing: 실용적인 테스트 가이드 강의와 함께한 인프런 워밍업 클럽…