본문 바로가기

Study/Java

[Java] 내부 클래스

내부 클래스는 사실 사용빈도가 그렇게 높지 않다고 한다. 하지만 알아놓는 것만으로도 필요한 순간이 있을 때 떠올릴 수 있기 때문에, 정리해 놓으려 한다.

주로 AWT나 Swing과 같은 GUI 어플리케이션의 이벤터 처리에 사용된다.

내부 클래스란?

class A {
    ...
    class B {
    	...
    }
    ...
}

클래스 내에 선언된 클래스이다. 클래스 내부에 선언된 다는 점을 빼면 지금까지 배워온 클래스와 큰 차이가 없다. 클래스 간의 서로 긴밀한 관계가 있는 경우 내부 클래스를 사용한다. 그렇다면 왜 굳이 내부에 선언을 하는 것일까? 바로 클래스 간의 접근성 향상 때문이다. 서로 쉽게 접근함과 동시에 외부에 굳이 노출시킬 필요 없는 클래스를 감춰 코드를 보기 편하게 해 준다. 정리하자면 다음과 같다.

  1. 내부 클래스에서 외부 클래스의 멤버에 쉽게 접근 가능하다.
  2. 코드의 복잡성을 줄일 수 있다.
내부 클래스는 외부의 다른 클래스에서 잘 사용되지 않아야 한다.

내부 클래스의 종류와 특징

내부 클래스는 변수를 선언하는 것처럼 선언하면 된다. 변수를 선언할 때 인스턴스 변수, 클래스 변수, 지역 변수로 구분하듯이 클래스도 선언에 따라 구분된다.

  1. 인스턴스 클래스
    • 멤버 변수 선언 위치에 선언하며, 인스턴스 멤버처럼 다루어진다. 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언된다.
  2. 스태틱 클래스
    • 멤버 변수 위치에 선언하며, static 멤버처럼 다루어진다. 외부 클래스의 static멤버, static 메소드에서 사용될 목적으로 선언된다.
  3. 지역 클래스
    • 메소드나 초기화 블록 안에 선언한다. 선언된 영역 내부에서만 내부 클래스 사용이 가능하다.
  4. 익명 클래스
    • 클래스의 선언과 객체 생성을 동시에 하는 일회용 클래스이다.
class Outer {
    class InstanceInner {} // 인스턴스 클래스
    static class InstanceInner {} // 스태틱 클래스
    
    void method(){
    	class LocalInner {} // 지역클래스
    }
}

내부 클래스의 제어자와 접근성

내부 클래스도 클래스이기 때문에 abstractfinal 같은 제어자를 사용할 수 있으며, 멤버 변수처럼 private, protected와 같은 접근 제어자도 사용이 가능하다.

내부 클래스 중에서 static 클래스만 static 멤버를 가질 수 있으며, 내부 클래스에서 static 변수를 선언하고 싶다면 static 클래스로 선언해야 함을 잊지 말자!

인스턴스 멤버는 같은 클래스에 있는 인스턴스 멤버와 static멤버 모두 호출이 가능하나, static 멤버는 인스턴스 멤버를 호출할 수 없다는 것을 알 것이다.

인스턴스 멤버는 인스턴스가 생성되어야만 사용이 가능하기 때문이다.

이와 마찬가지로 인스턴스 클래스는 외부 클래스의 인스턴스 멤버를 객체생성 없이 바로 사용할 수 있지만, 스태틱 클래스는 외부 클래스의 인스턴스 멤버를 객체생성없이 사용할 수 없다. (인스턴스 클래스가 사용하능하다는 것은 인스턴스가 생성되었다는 뜻이기 때문이다.)

그리고 인스턴스 클래스는 스태틱 클래스의 멤버들을 스태틱 클래스의 객체 생성없이 사용할 수 있지만, 스태틱 클래스의 경우 인스턴스 클래스의 멤버들을 사용하기 위해 객체를 생성해야 한다.

익명 클래스

다른 내부 클래스와 달리 이름이 없다. 선언을 함가 동시에 객체를 생성하는 일회용 클래스이기 때문이다. 이름이 없으므로 생성자를 가질 수 없고, 상속을 받는 것도 불가능하다. 

class Inner {
    Object iv = new Object() { void method(){} }; // 익명
    static Object iv2 = new Object() { void method(){} }; // 익명
    
    void method() {
    	Object lv = new Object() { void method(){} }; // 익명
    }
 }

 

'Study > Java' 카테고리의 다른 글

[Java] 추상클래스  (0) 2020.03.13
[Java] 다형성  (0) 2020.03.13
[Java] 자바의 제어자  (0) 2020.03.12
[Java] 패키지와 import  (0) 2020.03.12