JAVA

내부 클래스와 익명 클래스

mukom 2022. 9. 26. 19:42

1. 내부 클래스란?

 

내부 클래스는 그 이름 그대로 클래스 내부에 선언되는 클래스를 말한다.

내부 클래스를 사용하는 이유는 클래스 간의 관계가 긴밀하기 때문이다.

내부 클래스 사용으로 인한 장점은 다음과 같다.

1. 내부 클래스에서 외부 클래스의 멤버에 쉽게 접근 가능하다.
2. 캡슐화를 통해 코드 복잡성을 줄일 수 있다.

 

 

2. 내부 클래스 종류와 특징

 

내부 클래스는 선언 위치에 따라 불리는 이름이 다르고, 선언이 가능한 위치는 변수와 동일하다.

내부 클래스 위치 특징
인스턴스 클래스
(instance class)
외부 클래스 멤버 변수 선언 위치와 동일 외부 클래스의 인스턴스 멤버처럼 사용
스태틱 클래스
(static class)
외부 클래스 멤버 변수 선언 위치와 동일 외부 클래스의 static 멤버처럼 사용
지역 클래스
(local class)
외부 클래스 메서드 또는
초기화 블럭
블럭 안에서만 사용 (상수 처리된 지역 변수 사용 가능)
익명 클래스
(annoymous class)
  클래스 선언과 객체 생성을 동시에 하는 일회용 클래스

 

class Outer {
	// 인스턴스 클래스
	class InstanceInner {}
    
    // 스태틱 클래스
    class StaticInner {}
    
    void myMethod() {
    	// 지역 클래스
        class LocalInner {}
    }
}

 

인스턴스 클래스와 스태틱 클래스는 일반적인 클래스처럼 제어자를 활용할 수 있지만

지역 클래스는 지역 변수처럼 제어자 활용에 제한이 있다.

또한 지역 클래스는 static 멤버, 인스턴스 멤버 모두 사용이 가능하고, 선언한 메서드의 지역 변수도 사용이 가능하다.

하지만 지역 변수는 final 상수 처리가 된 경우에만 접근이 가능하다.

🖍 JDK1.8 부터는 생략이 가능

왜냐하면 지역 클래스의 인스턴스가 이미 소멸한 상태의 변수를 계속 참조하고 있으면 안 되기 때문에 

해당 가능성을 배제하고자 하는 제한 사항이다.

 

class InnerTest {
	public static void main(String[] args) {
    	
        // 인스턴스 클래스는 인스턴스 멤버처럼
       	// 외부 클래스 인스턴스를 통해 생성할 수 있다.
        Outer outer = new Outer();
        Outer.InstanceInner Ii = outer.new InstanceInner();
        
        // 스태틱 클래스는 스태틱 멤버처럼
        // 인스턴스 없이 생성할 수 있다.
        Outer.StaticInner si = new Outer.StaticInner();
        
    }
}

 

 

3. 익명 클래스

 

익명 클래스는 말 그대로 익명 즉, 이름이 없다.

클래스의 식별자 노릇을 하는 이름이 없기 때문에 getName() 결과를 볼 수 없으며, 생성자 또한 없다.

익명 클래스는 일회성으로 클래스나 인터페이스를 사용하고자 할 때 활용할 수 있다.

 

Runnable runnable = new Runnable() {
		@Override
		public void run() {
			// TODO Auto-generated method stub
			System.out.println("annoymous run()");
		}
	};

구현하고자 하는 클래스나 인터페이스에 추상 메서드가 있다면 블록에 오버라이드 구현하여 활용할 수 있다.

이는 달리 말해서 추상 클래스 또한 블록에서 추상 메서드를 모두 구현한다면 인스턴스로 활용 가능하다는 것을 의미한다.