산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> java

자바 내부 클래스 완전 정복: 설계, 문법, 실전 활용

이 장에서는 자바의 내부 클래스(inner classes)에 대해 다룹니다.

중첩 클래스(Nested Classes)

자바에서는 메서드처럼 클래스의 변수도 다른 클래스를 멤버로 가질 수 있습니다. 클래스 안에 클래스를 작성하는 것이 허용됩니다. 안에 작성된 클래스를 중첩 클래스(nested class), 내부 클래스를 감싸는 클래스를 외부 클래스(outer class)라고 합니다.

구문

중첩 클래스 작성 구문입니다. 여기서 Outer_Demo가 외부 클래스이고 Inner_Demo가 중첩 클래스입니다.

class Outer_Demo {
    class Inner_Demo {
    }
}

중첩 클래스는 두 가지 타입으로 나뉩니다.

내부 클래스(Inner Classes, 비정적 중첩 클래스)

내부 클래스는 자바의 보안 메커니즘입니다. 클래스는 private 접근 제어자를 가질 수 없지만, 다른 클래스의 멤버로 클래스를 두면 내부 클래스를 private으로 만들 수 있습니다. 또한 외부 클래스의 private 멤버에 접근하는 데도 사용됩니다.

내부 클래스는 정의 방식과 위치에 따라 세 가지 타입으로 나뉩니다.

내부 클래스(Inner Class)

내부 클래스 생성은 간단합니다. 클래스 안에 클래스를 작성하면 됩니다. 일반 클래스와 달리 내부 클래스는 private이 될 수 있으며, private으로 선언하면 외부 객체에서 접근할 수 없습니다.

내부 클래스를 생성하고 접근하는 프로그램입니다. 예제에서 내부 클래스를 private으로 만들고 메서드를 통해 접근합니다.

예제

class Outer_Demo {
    int num;

    // 내부 클래스
    private class Inner_Demo {
        public void print() {
            System.out.println("This is an inner class");
        }
    }

    // 메서드 내에서 내부 클래스 접근
    void display_Inner() {
        Inner_Demo inner = new Inner_Demo();
        inner.print();
    }
}

public class My_class {
    public static void main(String args[]) {
        // 외부 클래스 인스턴스화
        Outer_Demo outer = new Outer_Demo();
        // display_Inner() 메서드 호출
        outer.display_Inner();
    }
}

Outer_Demo가 외부 클래스, Inner_Demo가 내부 클래스, display_Inner()는 내부 클래스를 인스턴스화하는 메서드이며, 이 메서드는 main 메서드에서 호출됩니다.

컴파일하고 실행하면:

This is an inner class.

Private 멤버 접근

앞서 언급했듯 내부 클래스는 클래스의 private 멤버에 접근하는 데도 사용됩니다. 어떤 클래스에 private 멤버가 있어 접근하고 싶다면, 그 안에 내부 클래스를 작성하고 내부 클래스의 메서드(예: getValue())에서 private 멤버를 반환한 뒤, private 멤버에 접근하려는 다른 클래스에서 내부 클래스의 getValue() 메서드를 호출하면 됩니다.

내부 클래스를 인스턴스화하려면 먼저 외부 클래스를 인스턴스화해야 합니다. 그 후 외부 클래스 객체를 사용하여 내부 클래스를 인스턴스화합니다.

Outer_Demo outer = new Outer_Demo();
Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();

내부 클래스를 사용하여 클래스의 private 멤버에 접근하는 프로그램입니다.

예제

class Outer_Demo {
    // 외부 클래스의 private 변수
    private int num = 175;

    // 내부 클래스
    public class Inner_Demo {
        public int getNum() {
            System.out.println("This is the getnum method of the inner class");
            return num;
        }
    }
}

public class My_class2 {
    public static void main(String args[]) {
        // 외부 클래스 인스턴스화
        Outer_Demo outer = new Outer_Demo();
        // 내부 클래스 인스턴스화
        Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();
        System.out.println(inner.getNum());
    }
}

컴파일하고 실행하면:

This is the getnum method of the inner class: 175

메서드 로컬 내부 클래스(Method-local Inner Class)

자바에서는 메서드 안에 클래스를 작성할 수 있으며 이는 로컬 타입이 됩니다. 지역 변수처럼 내부 클래스의 범위도 메서드 내로 제한됩니다.

메서드 로컬 내부 클래스는 내부 클래스가 정의된 메서드 내에서만 인스턴스화할 수 있습니다. 메서드 로컬 내부 클래스 사용 예제입니다.

예제

public class Outerclass {
    // 외부 클래스의 인스턴스 메서드
    void my_Method() {
        int num = 23;

        // 메서드 로컬 내부 클래스
        class MethodInner_Demo {
            public void print() {
                System.out.println("This is method inner class " + num);
            }
        }
        // 내부 클래스 끝

        // 내부 클래스 접근
        MethodInner_Demo inner = new MethodInner_Demo();
        inner.print();
    }

    public static void main(String args[]) {
        Outerclass outer = new Outerclass();
        outer.my_Method();
    }
}

컴파일하고 실행하면:

This is method inner class 23

익명 내부 클래스(Anonymous Inner Class)

클래스 이름 없이 선언된 내부 클래스를 익명 내부 클래스라고 합니다. 익명 내부 클래스의 경우 선언과 인스턴스화를 동시에 합니다. 보통 클래스나 인터페이스의 메서드를 오버라이드해야 할 때 사용합니다. 익명 내부 클래스 구문은 다음과 같습니다.

구문

AnonymousInner an_inner = new AnonymousInner() {
    public void my_method() {
        ........
        ........
    }
};

익명 내부 클래스를 사용하여 클래스의 메서드를 오버라이드하는 프로그램입니다.

예제

abstract class AnonymousInner {
    public abstract void mymethod();
}

public class Outer_class {
    public static void main(String args[]) {
        AnonymousInner inner = new AnonymousInner() {
            public void mymethod() {
                System.out.println("This is an example of anonymous inner class");
            }
        };
        inner.mymethod();
    }
}

컴파일하고 실행하면:

This is an example of anonymous inner class

같은 방식으로 구체 클래스나 인터페이스의 메서드도 익명 내부 클래스로 오버라이드할 수 있습니다.

인수로 전달되는 익명 내부 클래스

일반적으로 메서드가 인터페이스, 추상 클래스, 구체 클래스의 객체를 인수로 받는다면, 인터페이스를 구현하거나 추상 클래스를 확장하여 객체를 메서드에 전달할 수 있습니다. 클래스라면 직접 전달하면 됩니다.

하지만 이 세 경우 모두 익명 내부 클래스를 메서드에 전달할 수 있습니다. 익명 내부 클래스를 메서드 인수로 전달하는 구문:

obj.my_Method(new My_Class() {
    public void Do() {
        .....
        .....
    }
});

익명 내부 클래스를 메서드 인수로 전달하는 프로그램입니다.

예제

// 인터페이스
interface Message {
    String greet();
}

public class My_class {
    // Message 인터페이스 객체를 받는 메서드
    public void displayMessage(Message m) {
        System.out.println(m.greet() + ", This is an example of anonymous inner class as an argument");
    }

    public static void main(String args[]) {
        // 클래스 인스턴스화
        My_class obj = new My_class();

        // 익명 내부 클래스를 인수로 전달
        obj.displayMessage(new Message() {
            public String greet() {
                return "Hello";
            }
        });
    }
}

컴파일하고 실행하면:

Hello, This is an example of anonymous inner class as an argument

정적 중첩 클래스(Static Nested Class)

정적 내부 클래스는 외부 클래스의 정적 멤버인 중첩 클래스입니다. 외부 클래스를 인스턴스화하지 않고 다른 정적 멤버처럼 접근할 수 있습니다. 정적 멤버와 마찬가지로 정적 중첩 클래스는 외부 클래스의 인스턴스 변수와 메서드에 접근할 수 없습니다. 정적 중첩 클래스 구문:

구문

class MyOuter {
    static class Nested_Demo {
    }
}

정적 중첩 클래스 인스턴스화는 내부 클래스와 조금 다릅니다. 정적 중첩 클래스 사용 예제입니다.

예제

public class Outer {
    static class Nested_Demo {
        public void my_method() {
            System.out.println("This is my nested class");
        }
    }

    public static void main(String args[]) {
        Outer.Nested_Demo nested = new Outer.Nested_Demo();
        nested.my_method();
    }
}

컴파일하고 실행하면:

This is my nested class

java

  1. Java final 키워드 마스터: 변수, 메서드, 클래스에서의 활용
  2. Java instanceof 연산자 완벽 가이드: 기본 사용법부터 상속, 인터페이스까지
  3. Java 중첩/내부 클래스 마스터: 종류, 예제, 모범 사례
  4. Java 정적 중첩 클래스 이해: 용법, 내부 클래스와의 차이, 예제
  5. Java 익명 내부 클래스 마스터: 정의, 문법, 실전 예제
  6. Java 싱글톤 패턴 완벽 가이드: 안전하게 구현하고 사용하기
  7. Java 리플렉션 마스터: 런타임에 클래스, 메서드, 필드 검사 및 조작
  8. Java ObjectOutputStream 마스터하기: 직렬화, 메서드, 실전 예제
  9. Java 제네릭 마스터하기: 재사용 가능하고 타입 안전한 코드 작성
  10. java.io로 Java 파일 작업 마스터하기 – 생성, 읽기, 쓰기 및 삭제