내부 클래스(Inner Class)

귀찮Lee·2022년 5월 18일
0

Java

목록 보기
7/15

◎ 내부 클래스(Inner Class)

  • 클래스 내에 선언된 클래스, 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용

    • 예시1 차 - 바퀴, 차체, 에어백... (내부 구성) : 내부 클래스를 사용하는 것을 추천
    • 예시2 차 - 티코, 페라리, 포르쉐, 코란도, 화물차 (분류) : 상속을 이용해 클래스를 만드는 것을 추천
  • 내부 클래스는 외부 클래스의 멤버들을 쉽게 접근 할 수 있고, 코드의 복잡성을 줄일 수 있다.

  • 내부 클래스는 외부 클래스 내에 선언되는 점을 제외하면 일반적인 클래스와 차이점이 없다.

  • 선언하는 위치나 예약어에 따라 크게 4가지 유형으로 분류가 가능

    • 인스턴스 내부 클래스
    • 정적 내부 클래스
    • 지역 내부 클래스
    • 익명 내부 클래스

◎ 인스턴스 내부 클래스

  • 객체 내부에 멤버의 형태로 존재
  • 외부 클래스의 모든 접근 지정자의 멤버에 접근할 수 있다.
  • 외부 클래스를 생성한 이후에 사용
  • 클래스의 생성과 상관없이 사용할 수 있는 정적 변수와 정적 메서드는 인스턴스 내부 클래스에서 선언할 수 없다.

◎ 정적 내부 클래스

  • 객체 내부에 멤버의 형태로 존재
  • 외부 클래스의 정적 변수와 정적 메서드에만 접근할 수 있다.
  • 클래스의 멤버 변수 위치에 정의하며 static 예약어를 사용
class OuterClass{

    private int instanceNum = 1;
    static private int staticNum = 2;
    void instanceMethod() {
        System.out.println("인스턴스 메서드");
    }
    static void staticMethod(){
        System.out.println("스태틱 메서드");
    }

    class InstanceInnerClass{
        int inNum = 10;
        void Test(){
            System.out.println(instanceNum + staticNum);
            instanceMethod();
            staticMethod();
        }

    }
    
    static class StaticInnerClass{
        int inNum = 10;
        void Test(){
            System.out.println(staticNum);
            staticMethod();
            // instanceNum, instanceMethod() 사용불가
        }
    }

}

◎ 지역 내부 클래스

  • 클래스의 멤버가 아닌 메서드 내에서 정의되는 클래스
  • 지역 변수처럼 정의된 메서드 내부에서만 사용가능
    -> 일반적으로 선언후, 바로 객체를 생성해서 사용
  • 메서드가 호출될 때만 메모리에 로딩되기 때문에 정적 클래스로 지정할 수 없다.
class OuterClass2{
    private int instanceNum = 1;
    void outerMethod() {
    
        int localNum = 10;
        class LocalInnerClass{
            void test() {System.out.println("지역 내부 클래스 안 메서드");}
            // static void test2() {System.out.println("지역 내부 클래스 안 메서드는 static 불가!");}
        }
        
        LocalInnerClass localInnerClass = new LocalInnerClass();
        localInnerClass.test();
    }
}

◎ 익명 내부 클래스

  • 이름을 알 수 없는 내부 클래스 (지역 내부 클래스와 유사)
  • 클래스의 선언과 객체 생성을 동시에 하기 때문에 하나의 객체만을 생성할 수 있으며 일회용이다.
  • 장점 : 코드를 간결하세 만들 수 있다.
interface InterfaceExample {
    int CONSTANT = 3;
    default void printTest() {};
}

public class InnerClassTest {
    public static void main(String[] args) {
    
        InterfaceExample anonymousClass = new InterfaceExample() {
            public void printTest() {
                System.out.println("익명 내부 클래스");
            }
        };

        anonymousClass.printTest(); // 익명 내부 클래스
    }
}
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글