중첩 클래스(Nested Class)

윤재열·2022년 1월 20일
0

Java

목록 보기
38/71

중첩 클래스(Nested Class)

  • 중첩 클래스는 단어 그대로 중첩되어 있는 상태입니다.
  • 하나의 클래스 안에 또 다른 클래스가 정의되는 형태라고 생각하면 됩니다.
  • 이러한 중첩 클래스 3가지 종류가 있습니다.
    👉 내부 클래스(Inner Class)
    👉 정적 내부 클래스(Static Inner Class)
    👉 지역 클래스(Local Class)

내부 클래스(Inner Class)

내부 클래스는 하나의 클래스로 안에 다른 클래스가 정의되어 있는 형태입니다.

  • 특징
  1. 중첩되는 클래스는 한 개 이상 가능하다.
  2. Outer 클래스멤버를 Inner클래스에서 사용이 가능하다.
  3. Outer 클래스에서 Inner 클래스 멤버 사용이 불가능하다.
  4. 일반 중첩 클래스 내부에서는 static 과 관련된 멤버를 선언할 수 없다.
class Outer {
    int x = 10;
    static int y = 20;

    class Inner{ //내부 클래스
        int z = 30;

        public void print() {
            System.out.println(x);
            System.out.println(y);
            System.out.println(z);
        }

    }
}

public class Ex {
    public static void main(String[] args) {
        //내부 클래스 선언방법
        Outer out = new Outer();
        Outer.Inner inner = out.new Inner();

        inner.print();
    }
}

main 안에 있는 인스턴스 생성방법을 보면 우리가 알고 있는 방법과는 약간의 차이가 있습니다.
내부 클래스의 인스턴스를 생성하기 위해서는 먼저 바깥 클래스의 인스턴스를 먼저 생성해야 합니다.
그 후 Outer 클래스의 인스턴스를 참조하여 Inner 클래스의 인스턴스를 생성할 수 있습니다.

정적 내부 클래스(Static Inner Class)

정적 내부 클래스는 static과 관련된 멤버를 선언할 수 있는 내부 클래스입니다.

  • 특징
    👉 클래스의 이름 앞에 static 키워드가 붙는다,
    👉 객체를 독립적으로 생성 가능하다
    👉 static멤버, static메서드도 만들어 사용할 수 있다.(모든 종류의 필드,메서드를 사용가능하다.)
    👉 Outer 클래스의 static 멤버만 Inner 클래스에서 사용할 수 있다.
class Outer {

    int x = 10;
    static int y = 20;

    static class Inner{ //내부 클래스
        int z = 30;

        public void print() {
            // System.out.println(x); // outer클래스의 인스턴스 변수는 사용 불가능
            System.out.println(y);
            System.out.println(z);
        }

    }
}

public class Ex {
    public static void main(String[] args) {
        //정적 내부 클래스 선언방법
        Outer.Inner inner = new Outer.Inner();

        inner.print();
    }
}

main 문을 보면 기본 내부 클래스의 선언 방법과는 조금 다른 것을 알 수 있습니다.

이전에 내부 클래스의 접근하기 위해서는 Outer클래스의 인스턴스를 생성하고, Outer 클래스의 인스턴스를 참조하여 내부 클래스의 인스턴스를 생성하여 접근했지만, static이 붙은 정적 내부 클래스는 Outer 클래스의 인스턴스 생성없이 곧바로 접근이 가능합니다.

지역 중첩 클래스(Local Inner Class)

지역 중첩 클래스는 특정한 메서드에 한정적인 용도로 사용한다.

-특징
👉 접근 제한자와 지정 예약어를 사용 할 수 없다.(메서드 내부에서만 사용되므로 접근을 제한할 필요가없다.)
👉 static 멤버를 선언하지 못한다.(인스턴스 필드와,메서드만 선언할 수 있다.)
👉 객체 생성은 외부에서는 불가능하고, 내부에서만 가능하다

public class Ex {
    public static void main(String[] args) {
        //정적 내부 클래스 선언방법

        int x = 10;

        class Inner{
            int y = 20;
        }

        Inner in = new Inner();

        System.out.println(x);
        System.out.println(in.y);

익명 클래스(Anonymous Class)

익멸 클래스는 기존에 있는 클래스의 특정 메서드를 오버라이딩하여 사용자가 재정의 하여 사용한다.

-특징
👉 class 예약어와 클래스명이 없다.
👉 익명 클래스에 사용되는 중첩 클래스는 기존에 존재하는 클래스이다.
👉 생성자를 작성할 수 없다.
👉 외부 멤버 중 final 만 포함가능하다.

class Inner {
    int y = 20;

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

public class Ex {
    public static void main(String[] args) {
        final int x = 10; //내부 클래스에서 사용하기 위해 final로 선언

        Inner in = new Inner() {
            public void print() {
                System.out.println("overriding");
                System.out.println(x);
                System.out.println(y);
            }

            public void printX() {
                //익명 클래스 안에서 메서드를 생성하여 사용 가능
                System.out.println("Method 추가");
            }
        };

        in.printX(); //익명클래스 안에서 생성된 메서드는 밖에서 사용 불가능      
    }
}
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글