Java/Java(base)

[Java] 내부 클래스 Inner class , 익명 클래스 Anonymous Inner class

ID_DI 2021. 12. 1. 21:30

내부 클래스(Inner class)

  • 클래스 내부에 클래스를 선언하여 외부 클래스의 필드에 쉽게 접근하기 위해서 사용한다.

  • 다른 곳에서 볼 때에는 그 내부에 있는 클래스는 숨겨진 것처럼 보이게 된다.

  • 내부 클래스의 필드를 사용(객체화)하기 위해서는 외부클래스의 객체에서 내부클래스를 객체화해야한다.

    • 외부클래스의 필드에서는 자신이랑 같이 올라와 있는 내부클래스를 바로 객체화 할 수 있다.
외부클래스명 객체명 = new 외부클래스 생성자();
외부클래스명.내부클래스명 객체명 = 외부클래스객체.new 내부클래스 생성자();

굉장히 복잡하므로, 객체를 직접 만들지 말라는 뜻이다.(드물게 사용)

Ex) 내부클래스 사용 예

일반클래스 상속

public class InnerTest {
    public static void main(String[] args) {
        B obj = new B();
        obj.f();
    }
}

class A{
    int data;
}

class B extends A{
    void f() {
        System.out.println(this.data);
    }
}

내부클래스 사용

public class InnerTest {
    public static void main(String[] args) {
        Out out = new Out();
        Out.In in = out.new In();
        in.f();

    }
}
class Out{
    int data;

    class In{
        void f() {
            System.out.println(data);
        }
    }
}
내부 클래스 사용 이유
  • 상속처럼 사용
    • 외부클래스의 필드를 마치 내것처럼 접근하여 사용하기 위함
  • 캡슐화
    • 외부 클래스가 없다면 내부 클래스도 존재할 수 없기 때문에 다른 클래스에서 접근하지 못하도록 내부 클래스를 숨기기위해 사용
사용하는 상황의 Ex:

A 클래스에서 b()라는 작업(메소드)이 자주 쓰이고 이 작업이 B 클래스를 만들어야 쉽게 관리할 수 있다.

다른 클래스에서는 b() 가 필요없거나 A 클래스를 외부에 노출시키고 싶지 않을 때 내부 클래스를 사용한다.

  • 내부 클래스는 GUI(Graphic User Interface) 개발 시 많이 사용
    • a 버튼 눌러야 b버튼이 생성되게 만들고 싶다면 클래스를 별도로만들지 않고 내부클래스를 만들어 구현하는 것이 적합

익명클래스(Anonymous inner class)

  • 이름이 없는 클래스
  • 단 하나의 객체를 위한 클래스 (일회용)
클래스명 객체명 = new 생성자(){
    //익명의 클래스
    @Override
    void 메소드(){}
};
  • 익명클래스는 앞에 있는 생성자의 클래스를 상속받고 있는 이름 없는 자식 클래스이다.
  • 익명 자식 클래스는 부모클래스의 메소드를 오버라이딩할 수 있고, 업캐스팅 되기 때문에 자식 클래스의 새로운 메소드는 사용할 수 없다.
    • 다운캐스팅은 불가능(이름이 없음)