JAVA Study

[JAVA]중첩 클래스

영하10도 아아 2024. 4. 11. 02:33

1.중첩 클래스(Nested Class)


중첩클래스란?

 

클래스 내부에 선언한 클래스를 말한다. 중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 접근할 수 있고, 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점이 있다.

 

중첩 클래스 그림 설명

class ClassName{
    class NestedClassName{ //중첩클래스
        
    }
}

 

 

인터페이스도 클래스 내부에 선언할 수 있는데, 이런 인터페이스를 중첩 인터페이스 라고 한다.

>내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해서이다.

class ClassName{
    interface NestedInterfaceName{ //중첩클래스
        
    }
}

 

 

 

중첩 클래스

 

 

중첩 클래스는 클래스 내부에 선언되는 위치에 따라서 두 가지로 분류된다. 클래스의 멤버로서 선언되면 멤버 클래스,

생성자 또는 메소드 내부에서 선언되면 로컬 클래스라고 한다.

 

차이점
멤버 클래스 : 객체가 사용 중이라면 언제든 재사용이 가능함.
로컬 클래스 : 메소드를 실행할 때만 사용되고, 메소드가 종료되면 사라짐.

 

 

 

인스턴스 멤버 클래스

 

 

static 키워드 없이 중첩 선언된 클래스를 말한다.

인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.

 

<객체 생성>

A클래스 외부에서 B객체를 생성하려면 먼저 A객체를 생성한 뒤 B객체를 생성해야한다.

반면에 A클래스 내부의 생성자 및 인스턴스 메소드에서는 일반 클래스처럼 B객체를 생성할 수 있다.

 

<메모리 구조>

외부 클래스를 인스턴스화하면 외부 클래스의 코드가 메모리에 올라오게 되고 이 때 내부 클래스의 코드도 메모리에 올라오게 된다. 이렇게 코드를 메모리에 올린 이후에야 내부 클래스의 인스턴스를 생성할 수가 있다.

 

*다만 내부 클래스는 다른 클래스에서 직접 사용하는 것보다 해당(외부) 클래스에서만 사용하는 경우가 일반적이므로, 내부 클래스와 인스턴스를 다른 클래스에서 만드는 경우는 드물다.

//A클래스 외부 객체생성
A a = new A();
A.B b = a.new B();
b.field1 = 3;
b.method1();

 

 

//A클래스 내부 객체 생성
class A{
    class B{
        
        void methodA() {
            B b = new B();
            b.field1 = 3;
            b.method1();
        }
    }
}

 

 

 

정적 멤버 클래스

 

 

정적 멤버 클래스는 static 키워드로 선언된 클래스를 말한다. 정적 멤버 클래스는 모든 종류의 필드와 메소드를 선언할 수 있다.

 

class A{
    //정적 멤버 클래스
    static class C {
        C(){ }  //생성자
        int field1; //인스턴스 필드
        static int field2;  //정적 필드 
        void method1(){ }   //인스턴스 메소드
        static void method2(){ }    //정적 메소드
    }
}

 

 

A클래스 외부에서 정적 멤버 클래스 C의 객체를 생성하기 위해서는 A객체를 생성할 필요가 없고, 다음과 같이 C객체를 생성하면 된다.

//정적 멤버 클래스 객체 생성
A.C c = new A.C();
c.field1 = 3;   //인스턴스 필드 사용
c.method1();    //인스턴스 메소드 호출

 

static 멤버 클래스의 인스턴스와 메서드는 바깥 클래스의 필드의 static 타입에만 접근이 가능하다.

 

로컬 클래스

 

 

중첩 클래스는 메소드 내에서도 선언할 수 있는데, 이것을 로컬(Local)클래스 라고 한다.

로컬 클래스는 접근 제한자 및 static을 붙힐 수 없다. 왜냐하면 로컬 클래스는 메소드 내부에서만 사용되므로 

접근을 제한할 필요가 없기 때문이다. 그리고 인스턴스 필드와 메소드만 선언이 가능하고, 정적 필드와 메소드는 선언이 불가하다.

 

로컬 클래스는 메소드가 실행될 때 메소드 내에서 객체를 생성하고 사용해야 한다.

 

 

중첩 인터페이스

 

 

클래스의 멤버로 선언된 인터페이스를 말한다. 인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해서이다.

class A{
    [static] interface I {  //중첩 인터페이스
        void method(); 
    }
}

 

중첩 인터페이스는 인스턴스 멤버 인터페이스와 정적 멤버 인터페이스 모두 가능하다. 인스턴스 멤버 인터페이스는 바깥 클래스의 객체가 있어야 사용 가능하며, 정적 멤버 인터페이스는 바깥 클래스의 객체 없이 바깥 클래스만으로 바로 접근할 수 있다.

 

 

 

 

정리

 

중첩 클래스 : 클래스 내부에 선언한 클래스. 두 클래스의 멤버들을 서로 쉽게 접근할 수 있고, 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점이 있다.

 

멤버 클래스 : 클래스의 멤버로서 선언되는 중첩 클래스를 말한다. 바깥 객체의 필요 여부에 따라 인스턴스 멤버 클래스와 정적 멤버 클래스로 구분된다.

 

로컬 클래스 : 생성자 또는 메소드 블룩 내부에 선언된 중첩 클래스를 말한다.

 

중첩 인터페이스 : 클래스의 멤버로 선언된 인터페이스를 말한다. 인스턴스 멤버 인터페이스와 정적 멤버 인터페이스 모두 가능. 주로 정적 멤버 인터페이스를 많이 사용한다.

'JAVA Study' 카테고리의 다른 글

[JAVA] 컬렉션 프레임워크  (0) 2024.04.16
[JAVA]예외 처리  (0) 2024.04.11
[JAVA] 상속(Inheritance)  (0) 2024.04.04
스터디 1회차 - 클래스  (0) 2024.04.02