2022/02/23 자바의 다양한 기능들

김석진·2022년 2월 24일
0

여러 내부 클래스의 정의와 유형들

내부 클래스란?(inner class)

클래스 내부에 클래스를 선언한 경우를 내부 클래스라고 한다

  • 클래스 내부에 선언한 클래스로 이 클래스를 감싸고 있는 외부 클래스와 밀접한 연관이 있는 경우가 많고, 다른 외부 클래스에서 사용할 일이 거읭 없는 경우에 내부 클래스로 선언해서 사용함
  • 중첩 클래스라고도 함
  • 내부 클래스의 종류
    인스턴스 내부 클래스, 정적(static) 내부 클래스, 지역(local) 내부 클래스, 익명(anonymous) 내부 클래스

인스턴스 내부 클래스

  • 내부적으로 사용할 클래슬르 선언 (private으로 선언하는 것을 권장, private로 선언하지 않을 시 외부에서 사용가능하므로 private로 해야한다.)
  • 외부 클래스가 생성된 후 생성됨( 정적 내부 클래스와 다름)
  • private이 아닌 내부 클래스는 다른 외부 클래스에서 생성할 수 있음
OutClass outClass=new OutClass(	);
OutClass.InClass inClass=outClass.new InClass();

예제 코드

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

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

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



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

정적 내부 클래스

  • 외부 클래스 생성과 무관하게 사용할 수 있음
  • 정적 변수, 정적 메서드 사용

정적 내부 클래스 예

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

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

    private class InClass{
        int iNum = 100;
        void inTest(){
            System.out.println("OutClass num =  "+num+"(외부 클래스 의 인스턴스 변수)");
            System.out.println("OutClass sNum =  "+sNum+"(외부 클래스의 스태틱 변수)");
            System.out.println("InClass inNum = "+iNum+ "(내부 클래스의 인스턴스 변수)");
        }
    }
    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 sNum = "+sInNum+ "(내부 클래스의 스태틱 변수)");
        }

        static void sTest(){

            System.out.println("OutClass sNum =  "+sNum+"(외부 클래스의 스태틱 변수)");
            System.out.println("InClass sNum = "+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();
    }
}

지역 내부 클래스

  • 지역 변수와 같이 메서드 내부에서 정의하여 사용하는 클래스
  • 메서드의 호출이 끝나면 메서드에 사용된 지역변수의 유효성은 사라짐
  • 메서드 호출 이후에도 사용해야 하는 경우가 있을 수 있으므로 지역 내부 클래스에서 사용하는 메서드의 지역 변수나 매개 변수는 final로 선언됨

익명 내부 클래스

  • 이름이 없는 클래스(위 지역 내부 클래스의 MyRunnable 클래스 이름은 실제로 호출되는 경우가 없음)
  • 클래스의 이름은 생략하고 주로 하나의 인터페이스나 하나의 추상 클래스를 구현하여 반환
  • 인터페이스나 추상 클래스 자료형의 변수에 직접 대입하여 클래스를 생성하거나 지역 내부 클래스의 메서드 내부에서 생성하여 반환 할 수 있음
  • widget의 인베튼 핸들러에 활용됨
profile
주니어 개발자 되고싶어요

0개의 댓글