1. 내부 클래스 개념
**내부 클래스(inner class)**는 클래스 내부에서 정의된 클래스로, 특정 클래스의 멤버처럼 동작할 수 있습니다. 일반적으로 캡슐화, 논리적 그룹화, 코드 가독성 향상을 목적으로 사용됩니다.
2. 자바와 닷넷 내부 클래스 비교
| 비교 항목 | Java | C# (.NET) |
| 종류 | 1. 인스턴스 내부 클래스 (Non-static) 2. 정적 내부 클래스 (Static) 3. 지역 내부 클래스 (Local) 4. 익명 내부 클래스 (Anonymous) |
1. 중첩 클래스 (Nested Class) 2. 정적 중첩 클래스 (Static Nested Class) 3. 지역 클래스 (Local Class) 4. 익명 클래스 (Anonymous Class) |
| 바깥 클래스 멤버 접근 | 인스턴스 내부 클래스는 바깥 클래스의 private 멤버에 접근 가능 | 중첩 클래스(Inner class)는 바깥 클래스의 private 멤버에 접근 가능 |
| 독립적 인스턴스 생성 가능 여부 | 정적 내부 클래스만 가능, 비정적 내부 클래스는 바깥 클래스의 인스턴스가 필요 | 정적 중첩 클래스만 가능, 일반 중첩 클래스는 바깥 클래스의 인스턴스를 필요로 함 |
| this 참조 | OuterClass.this를 사용하여 바깥 클래스 참조 가능 | OuterClass.this는 없음, 바깥 클래스 참조 시 명시적으로 필요 |
| 사용 목적 | GUI 이벤트 리스너, 캡슐화, 논리적 그룹화 | 논리적 그룹화, 캡슐화, 의존성 감소 |
| 익명 내부 클래스 | new 인터페이스/클래스() { 구현 } 형태로 사용 | new 인터페이스/클래스 { 구현 } 형태로 사용 (람다와 함께 활용) |
3. 각 내부 클래스 유형 비교
(1) 인스턴스 내부 클래스 (Non-static Inner Class)
- 자바(Java)
class Outer {
private String msg = "Hello";
class Inner {
void show() {
System.out.println(msg); // 바깥 클래스의 private 멤버 접근 가능
}
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner(); // 바깥 클래스 인스턴스가 필요함
inner.show();
}
}
- C# (.NET)
class Outer
{
private string msg = "Hello";
public class Inner
{
private Outer outer;
public Inner(Outer outerInstance)
{
outer = outerInstance;
}
public void Show()
{
Console.WriteLine(outer.msg); // private 멤버 접근 가능
}
}
}
class Program
{
static void Main()
{
Outer outer = new Outer();
Outer.Inner inner = new Outer.Inner(outer); // 명시적으로 바깥 클래스 참조 전달
inner.Show();
}
}
비교:
- 자바에서는 Outer.Inner inner = outer.new Inner(); 형식으로 생성.
- C#에서는 명시적으로 바깥 클래스 인스턴스를 전달해야 private 멤버 접근 가능.
(2) 정적 내부 클래스 (Static Nested Class)
- 자바(Java)
class Outer {
static class Inner {
void show() {
System.out.println("Static Inner Class");
}
}
}
public class Main {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner(); // 바깥 클래스 인스턴스 없이 생성 가능
inner.show();
}
}
- C# (.NET)
class Outer
{
public static class Inner
{
public static void Show()
{
Console.WriteLine("Static Inner Class");
}
}
}
class Program
{
static void Main()
{
Outer.Inner.Show(); // 바깥 클래스 인스턴스 없이 접근 가능
}
}
비교:
- 정적 내부 클래스는 바깥 클래스의 인스턴스 없이 접근 가능.
- 자바와 C# 모두 Outer.Inner 방식으로 호출.
(3) 지역 내부 클래스 (Local Class)
- 자바(Java)
class Outer {
void outerMethod() {
class LocalInner {
void show() {
System.out.println("Local Inner Class");
}
}
LocalInner localInner = new LocalInner();
localInner.show();
}
}
- C# (.NET)
class Outer
{
public void OuterMethod()
{
class LocalInner
{
public void Show()
{
Console.WriteLine("Local Inner Class");
}
}
LocalInner localInner = new LocalInner();
localInner.Show();
}
}
비교:
- 자바와 C# 모두 메서드 내부에서 선언된 클래스는 해당 메서드에서만 사용 가능.
(4) 익명 내부 클래스 (Anonymous Class)
- 자바(Java)
interface Greeting {
void greet();
}
public class Main {
public static void main(String[] args) {
Greeting g = new Greeting() {
public void greet() {
System.out.println("Hello from Anonymous Class");
}
};
g.greet();
}
}
- C# (.NET)
using System;
public class Program
{
public static void Main()
{
var g = new { Greet = new Action(() => Console.WriteLine("Hello from Anonymous Class")) };
g.Greet();
}
}
비교:
- 자바는 new 인터페이스/클래스() { 구현 } 형태.
- C#에서는 익명 형식과 람다를 활용.
4. 정리
| 비교 항목 | Java 내부 클래스 | C# 내부 클래스 |
| 바깥 클래스 멤버 접근 | 가능 (인스턴스 내부 클래스) | 가능 (명시적 참조 필요) |
| 독립적 인스턴스 생성 가능 여부 | 정적 내부 클래스만 가능 | 정적 중첩 클래스만 가능 |
| this 참조 | OuterClass.this 사용 가능 | OuterClass.this 없음 |
| 익명 내부 클래스 | new 인터페이스() { 구현 } | 람다 표현식 활용 |
자바와 C#의 내부 클래스는 개념적으로 유사하지만, 접근 방식과 구현 방법에서 차이가 있습니다.
C#은 명시적인 바깥 클래스 참조가 필요하며, 익명 클래스는 람다 및 델리게이트를 활용하는 경우가 많습니다.
'프로그래밍' 카테고리의 다른 글
| 자바와 닷넷 날짜 함수 비교 (0) | 2025.03.02 |
|---|---|
| 자바와 닷넷의 상속 비교 (0) | 2025.03.02 |
| 자바와 닷넷 예외 처리 (0) | 2025.03.02 |
| Java의 Getter/Setter와 C#의 프로퍼티 비교 (0) | 2025.03.02 |
| 파이썬으로 파일 이름 바꾸기 (0) | 2020.08.13 |