본문 바로가기

JAVA/Java2021-2

내부클래스 (inner class) 인스턴스 내부, 정적 내부 클래스

내부 클래스란? (클래스 내부에서만 사용하려고 선언한다)

클래스 내부에 선언한 클래스로 이 클래스를 감싸고 있는 외부 클래스와 밀접한 연관이 있는 경우가 많고 다른 외부 클래스에서 사용할 일이 거의 없는 경우에 내부 클래스로 선언해서 사용함, 중첩 클래스라고도 부름.

: 종류 ( 인스턴스 내부 클래스, 정적(static) 내부 클래스, 지역(local) 내부 클래스, 익명(anonymous) 내부 클래스

 

1. 인스턴스 내부 클래스

: 외부 클래스가 생성된 후 생성됨.

: 내부적으로 사용할 클래스를 선언함.

: pirvate이 아닌 내부 클래스는 다른 외부 클래스에서 생성할 수 있음.(private 권장)

-위의 코드를 보면 InClass는 OutClass가 만들어진 후에 만들어지기 때문에

InClass에서 static 변수를 선언하면 사용할 수 없기 때문에 오류가 발생한다.

 

package Basic_Grammar.chap6.ch01.Test01;

class OutClass{
    private int num=10;
    private static int sNum=20;
    private InClass inClass;

    public OutClass() {
        inClass=new InClass();
    }

    //        OutClass가 만들어지고 나서 InClass가 만들어진다.
    class InClass{
        int iNum=100;


        void inTest(){
            System.out.println("OutClass num="+num+"(외부 클래스의 인스턴스 변수)");
            System.out.println("OutClass sNum="+sNum+"(외부 클래스의 스태틱 변수)");
            System.out.println("InClass num="+iNum+"(내부 클래스의 인스턴스 변수)");
        }
    }

//    OutClass의 매서드
    public void usingClass(){
        inClass.inTest();
    }
}


public class InnerTest {
    public static void main(String[] args) {
        OutClass outClass=new OutClass();
        outClass.usingClass();
    }
}

OutClass에서 InClass를 선언할 때 private 접근제한자를 사용하지않으면,

 

외부에서 OutClass.InClass를 이용할 수 있다.

 

2. 정적 내부 클래스

package Basic_Grammar.chap6.ch01.Test01;

class OutClass{
    private int num=10;
    private static int sNum=20;
    private InClass inClass;

//    OutClass의 매서드
    public void usingClass(){
        inClass.inTest();
    }

    static class InStaticClass{
        int iNum=100;
        static int sInNum=200;
        void inTest(){
            System.out.println("InClass num="+iNum+"(내부 클래스의 인스턴스 변수)");
            System.out.println("OutClass sNum="+sNum+"(외부 클래스의 스태틱 변수)");
            System.out.println("InClass sInNum="+sInNum+"(내부 클래스의 스태틱 변수)");
        }

        static void sTest(){
            System.out.println("OutClass sNum="+sNum+"(외부 클래스의 스태틱 변수)");
            System.out.println("InClass sInNum="+sInNum+"(내부 클래스의 스태틱 변수)");
        }
    }
}


public class InnerTest {
    public static void main(String[] args) {
//        OutClass outClass=new OutClass();
//        outClass.usingClass();
        OutClass.InStaticClass sInClass=new OutClass.InStaticClass();
//        정적 내부클래스의 일반 메서드
        sInClass.inTest();
//        정적내부 클래스의 정적 메서드
        OutClass.InStaticClass.sTest();

    }
}