프로그래밍

자바와 닷넷의 내부 클래스

Jinwookoh 2025. 3. 2. 19:56

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#은 명시적인 바깥 클래스 참조가 필요하며, 익명 클래스는 람다 및 델리게이트를 활용하는 경우가 많습니다.