본문 바로가기
Programming/Java

중첩 클래스

by Tarake 2024. 8. 11.

중첩(Nested) 클래스


public class OuterClass {
    private String outerField = "Outer Field";

    class InnerClass {
        void accessOuter() {
            System.out.println("Accessing: " + outerField); // 바깥 클래스의 멤버에 접근
        }
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        OuterClass.InnerClass inner = outer.new InnerClass();
        inner.accessOuter();
    }
}

자바의 네스티드 클래스(Nested Class)는 클래스 내부에 정의된 클래스입니다. 네스티드 클래스는 바깥 클래스의 멤버로 포함되어 있으며, 여러 가지 용도로 사용됩니다.

네스티드 클래스는 Static 내스티드 클래스와 내부 클래스(Inner Class)로 나뉩니다.

내부 클래스(Inner Class)는 멤버 클래스(Member Class), 로컬 클래스(Local Class), 익명 클래스(Anonymous Class) 등으로 구분됩니다.

  • Static 중첩 클래스
  • Non-Static 중첩 클래스
  • 로컬 클래스(Local Class)
  • 익명 클래스(Anonymous Class)

 

Static 네스티드 클래스 (Static Nested Class)


class Outer {
    private static int num = 0;
    static class Nested {
        void add(int n) {
            num.n;
        }
    }
}

class Main {
    public static void main(String[] args) {
        Outer.Nested nst = new Outer.nested();
        nst.add(5);
    }
}

Static 네스티드 클래스는 static 선언이 갖는 특성이 반영된 클래스입니다. 외부 클래스 인스턴스와 상관없이 static 네스티드 클래스의 인스턴스 생성이 가능합니다.

  • 정의
    • 바깥 클래스의 static 멤버로 정의된 클래스입니다.
  • 특징
    • 독립성: 정적 내부 클래스는 바깥 클래스의 인스턴스와 무관하게 독립적으로 존재할 수 있습니다.
    • 접근 제약: 바깥 클래스의 static 멤버와 상호작용할 수 있지만, 바깥 클래스의 인스턴스 멤버에는 직접 접근할 수 없습니다.
    • 정적 멤버: 정적 내부 클래스는 정적 멤버와 메소드를 가질 수 있습니다.

 

 

인스턴스 내부 클래스( Non-static Nested Class )


 

class Outer {
    private int num = 0;
    
    class InnerClass {
        void add(int n) {
            num += n;
        }
        int get() {
            return num;
        }
    }
}
class Main {
    public static void main(String[] args) {
        Outer out = new Outer();
        Outer.Member InnerClass = out.new InnerClass();
        
        member.add(5);
        System.out.println(member.get());
    }
}

innerclass는 outer 클래스의 인스턴스 변수에 접근이 가능합니다. 또한 인스턴스를 생성하기 위해서는 외부 클래스의 인스턴스가 필요합니다. 내부 클래스는 클래스의 정의를 감추고 싶을 때 사용합니다.

 

  • 정의
    • 바깥 클래스의 인스턴스와 연결된 클래스로, 바깥 클래스의 인스턴스 멤버로 정의됩니다.
  • 특징
    • 바깥 클래스의 인스턴스에 접근 가능: 인스턴스 내부 클래스는 바깥 클래스의 인스턴스 멤버와 직접적으로 상호작용할 수 있습니다.
    • 인스턴스 생성: 인스턴스 내부 클래스를 생성하려면 바깥 클래스의 인스턴스가 필요합니다.

 

지역 클래스(Local Class)


예제 1

interface Loc {
    void add(int n);
    int get();
}

class Outer {
    private int num = 0;

    public Loc local() {
        class Loca implements Loc {
            public void add(int n) {
                num += n;
            }
            public int get() {
                return num;
            }
        }
        return new Loca();
    }
}
class Main {
    public static void main(String[] args) {
        Outer out = new Outer();
        Loc l = out.local();
        l.add(5);
        System.out.println(l.get());
    }
}

예제 2

class Outer {
    private static int num = 0;

    public static void local() {
        class Loca {
            public void add(int n) {
                num += n;
            }
            public int get() {
                return num;
            }
        }
        Loca loc = new Loca();
        loc.add(5);
        System.out.println(loc.get());
    }
}
class locals {
    public static void main(String[] args) {
        Outer out = new Outer();
        out.local();
    }
}

로컬 클래스는 메소드, 생성자, 또는 코드 블록 내에서 정의할 수 있습니다. 로컬 클래스는 해당 메소드나 블록이 실행되는 동안에만 존재합니다.

 

특징

  • 범위 제한: 로컬 클래스는 정의된 메소드 또는 블록 내부에서만 사용할 수 있으며, 메소드 실행이 끝나면 로컬 클래스도 사라집니다.
  • 캡슐화: 로컬 클래스는 특정 메소드 또는 블록 내에서만 사용되기 때문에, 코드의 범위를 제한하고 구현 세부 사항을 감출 수 있습니다.

 

익명 클래스(Anonymous Class)


interface Print {
    void print();
}
class Outer {
    private int num = 5;
    
    public Print getPrint() {
        return new Print() {
            @Override
            public void print() {
                System.out.println(num);
            }
        };
    }
}

class Main {
    public static void main(String[] args) {
        Outer out = new Outer();
        Print prn = out.getPrint();
        prn.print();
    }
}

클래스 정의와 객체 생성이 동시에 이루어지는 특수한 형태의 클래스입니다. 익명클래스 람다와도 관련이 있습니다.

 

익명 클래스의 특징

  • 이름이 없음: 익명 클래스는 이름이 없으며, 클래스 정의와 동시에 객체를 생성합니다.
  • 단일 인스턴스: 익명 클래스는 한 번만 사용되는 클래스입니다. 즉, 특정한 인스턴스가 필요할 때만 정의되고, 코드에서 일회성으로 사용됩니다.
  • 메소드 오버라이드: 익명 클래스는 인터페이스의 메소드나 추상 클래스의 추상 메소드를 구현하기 위해 사용됩니다.

 

 

'Programming > Java' 카테고리의 다른 글

스트림  (0) 2024.08.13
람다  (0) 2024.08.11
열거형, 가변인자, 어노테이션  (0) 2024.08.11
컬렉션 프레임워크  (0) 2024.08.10
제네릭  (0) 2024.08.10