Java/자바 이론

[Java] 자바 내부 클래스 4종류 (Inner Class)

현기 2022. 7. 5. 01:45

내부 클래스는 하나의 클래스 내부에 선언된 또 다른 클래스를 의미한다.

내부 클래스에서 외부 클래스(Outer Class) 멤버에 접근하기 위해 사용한다.

선언된 위치에 따라서 4가지 형태가 존재한다.

 

( 항상 외부 객체 생성 -> 내부 객체 생성 )


내부 클래스의 장점

1. 내부 클래스는 외부 클래스의 모든 멤버를 자유롭게 사용할 수 있다. 

= 코드가 간결해지고 편리하다.

 

2.  외부에 불필요한 클래스를 감추어서 코드의 복잡성을 줄일 수 있다. (캡슐화) 


내부 클래스의 종류

1. 멤버 이너 클래스 (member inner class)

클래스 내부에서 멤버 변수처럼 선언된 이너 클래스다.

인스턴스 멤버 클래스와 정적 멤버 클래스가 존재한다.

( 이너 클래스에서 필드나 메서드의 이름이 동일한 아우터 클래스 멤버를 참조하고 싶으면

아우터 클래스명.this.멤버 <처럼 사용할 수 있다. )

public class InnerExam {
	private int a;
	private int b;
	private static int c;
	
	public InnerExam() {
		a = 1;
		b = 2;
		c = 3;
	}
	
	//member inner class
	class AInner{ 
		public void disp() {
			System.out.println(a); // 원래 접근이 되면 안되지만, 
			System.out.println(b); // outer의 맴버를 자유롭게 사용가능
			System.out.println(c); // outer 객체 생성 후 inner 객체를 생성해야 한다.
		}						   // 단, static은 outer를 생성하지 않고 사용가능
	}
    
    	public static void main(String[] args) {
		// 1.outer 객체 생성 후
		// outer객체.inner객체 b = outer레퍼런스.new inner();
		InnerExam a = new InnerExam(); 
		InnerExam.AInner b = a.new AInner(); 
		b.disp();
		
		//한 줄로 작성하는 방법
		InnerExam.AInner c = new InnerExam().new AInner();

 

2. 정적 이너 클래스 (static inner class)

static 키워드를 가지고 있는 이너 클래스를 의미한다.

정적 메서드와 동일하게 아우터 클래스의 정적 멤버에만 접근할 수 있다. 

 

정적 이너 클래스도 정적 멤버이므로 객체 생성 없이 클래스명으로 바로 접근할 수 있다.

class A{
	static class B{
    }
}

A.B b = new A.B();

 

3. 지역 이너 클래스 (local inner class)

외부 클래스에 메서드나 초기화 블록에 선언된 이너 클래스를 의미한다.

지역 변수처럼 해당 메서드 내부에서만 한정적으로 사용된다.

(지역 변수는 반드시 final로 선언한다. 생략 시 컴파일러가 삽입)

public class InnerExam {
	private int a;
	private int b;
	private static int c;
	
	public InnerExam() {
		a = 1;
		b = 2;
		c = 3;
	}
	
	//local inner class
	public void output() { 
		class LocalInner{
			public void disp() {
				System.out.println(a);
				System.out.println(b);
				System.out.println(c);
			}
		}
		LocalInner li = new LocalInner(); 
		li.disp();
	}
    
    		//local Inner class
         	   //main에서
		InnerExam d = new InnerExam();
		d.output();

 

4. 익명 이너 클래스(anonymous class)

익명 클래스는 이름이 존재하지 않는 이너 클래스다.

클래스의 선언과 동시에 객체를 생성한다. 단 하나의 객체만을 생성하는 일회용 클래스다.

따라서 생성자를 생성할 수 없다.

//anonymous inner class
new InnerExam() {
    public void disp() {
        System.out.println("익명 이너 클래스입니다.");
    }
}.disp();

 

이러한 익명 클래스는 매우 제한적인 용도에 사용되며, 구현해야 하는 메소드가 매우 적은 클래스를

구현할 때 사용된다.

 


 

Inner Class는 이벤트 핸들러와 안드로이드에서 자주 사용된다고 한다.

특히 1번과 4번의 형태를 가장 많이 사용한다고 한다.

 


참고 문헌 : Do it! 자바 완전정복

http://www.tcpschool.com/java/java_usingClass_innerClass