Study for Backend/Programming language - Java

[Java기초] 내부 클래스

지미니박 2024. 2. 8. 15:45

내부 클래스

- 클래스나 인터페이스 내에서 선언된 클래스로서 내부클래스에서 외부클래스 멤버에 접근 가능

- 외부에서는 내부 클래스에 접근 불가하다.

- 외부에 불필요한 클래스를 감추어서 코드의 복잡성을 줄일 수 있다. (캡슐화) 

 

1. 멤버 이너 클래스 (member inner class)
클래스 내부에서 멤버 변수처럼 선언된 이너 클래스다.
인스턴스 멤버 클래스와 정적 멤버 클래스가 존재한다.
( 이너 클래스에서 필드나 메서드의 이름이 동일한 아우터 클래스 멤버를 참조하고 싶으면
"아우터 클래스명.this.멤버"처럼 사용할 수 있다. )

2. 정적 이너 클래스 (static inner class)
정적 메서드와 동일하게 아우터 클래스의 정적 멤버에만 접근할 수 있다. 
정적 이너 클래스도 정적 멤버이므로 객체 생성 없이 클래스명으로 바로 접근할 수 있다.

3. 지역 이너 클래스 (local inner class)
외부 클래스에 메서드나 초기화 블록에 선언된 이너 클래스를 의미한다.
지역 변수처럼 해당 메서드 내부에서만 한정적으로 사용된다.
(지역 변수는 반드시 final로 선언한다. 생략 시 컴파일러가 삽입)

4. 익명 이너 클래스(anonymous class)
익명 클래스는 이름이 존재하지 않는 이너 클래스다.
클래스의 선언과 동시에 객체를 생성한다. 단 하나의 객체만을 생성하는 일회용 클래스다.
따라서 생성자를 생성할 수 없다.

 

link

https://romcanrom.tistory.com/59

 

java/ 내부 클래스의 종류와 내부 클래스를 사용함으로써 얻는 장점

내부 클래스 Inner Class = 이너 클래스, 중첩 클래스 내부 클래스는 클래스나 인터페이스 내에서 선언된 클래스를 말한다. 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용할 수 있으며

romcanrom.tistory.com

https://hyunki99.tistory.com/13#--%--%EB%A-%A-%EB%B-%--%--%EC%-D%B-%EB%--%--%--%ED%--%B-%EB%-E%--%EC%-A%A-%---member%--inner%--class-

 

// Java 프로그래밍 - 내부 클래스

class Outer {

    public void print() {
        System.out.println("Outer.print");
    }

    class Inner {
        void innerPrint() { // 내부 인스턴스
            Outer.this.print();
        }
    }

    static class InnerStaticClass { //내부 정적 : 바로 메모리에 올라감
        void innerPrint() {
//            Outer.this.print(); //Outer는 외부클래스라서 바로 메모리에 안올라감
        }
    }

    public void outerMethod() { //외부
        class InnerLocal {

        }

        InnerLocal il1 = new InnerLocal();
    }
}

abstract class Person {
    public abstract void printInfo();
}

class Student extends Person {
    public void printInfo() {
        System.out.println("Student.printInfo");
    }
}

public class Main {

    public static void main(String[] args) {

//      외부 클래스
        Outer o1 = new Outer();

//      내부 클래스 - 인스턴스
        Outer.Inner i1 = new Outer().new Inner();

//      내부 클래스 - 정적
        Outer.InnerStaticClass is1 = new Outer.InnerStaticClass();
        
//      익명 클래스
        Person p1 = new Person() {
            @Override
            public void printInfo() {
                System.out.println("Main.printInfo");
            }
        };

    }

}