[Java] 내부 클래스

Hyo Kyun Lee·2022년 1월 31일
0

Java

목록 보기
26/49

1. 내부 클래스

클래스 내부에 선언된 클래스를 일컫는다.

1-1. 중첩(인스턴스) 클래스

인스턴스 변수, 즉 클래스의 field 영역에서 클래스가 선언되는 경우로 자료형 자체가 클래스 형태이다.

public class Test{
  class Cal{
     int value = 0;
     public void plus(){
     	value = value + 1;
     }
  }
}

위와 같이 type 자체가 class이다.

이 클래스 내부에 선언된 변수나 메소드를 활용하기 위해서는 아래와 같은 과정을 거친다.

  • 외부클래스에 대한 인스턴스를 먼저 생성한다.
Test t1 = new Test();
  • 내부적인 메소드를 활용하기 위해 내부 클래스 인스턴스를 생성한다.
    ※ new 연산자 형태를 외부 클래스와 같이 기재하는 것에 유희
Test.Cal cal = t1.new Cal();
  • 해당 메소드를 사용한다.
    result = cal.value;
    cal.plus();

1-2. 정적(static) 중첩 클래스

static한 클래스를 field영역에 선언하는 경우를 의미한다.

public class Test{
	static class cal{
    		int value = 0;
            public void plus(){
            	value = value + 1;
            };
    	}
}

위 클래스는 static field로 선언되었기 때문에, 별도의 외부 인스턴스 생성 필요없이 바로 접근 및 생성이 가능하다.

Test.cal cal = new Test.cal();
result = cal.value;
cal.plus()

1-3. 지역(local) 중첩 클래스 (지역클래스)

메소드 안에서 선언되는 클래스를 의미한다.

public class test{
	public void exec(){
    		//exec() 메소드 내부에 클래스 선언
            class cal{ //class가 type임!
            	int value = 0;
                public void plus(){
                	value = value + 1;
                };
            }
            //지역 클래스 내부의 메소드는 해당 메소드 내부에서만 활용가능
            result = cal.value;
            cal.plus();
        }
}

위와 같이, 메소드 내부에서 선언된 클래스 메소드 및 속성들은 (가장 가까운) 상위 메소드 내부에서만 활용가능하다(*활용시엔 static 처럼 바로 접근 및 사용가능).

public void main(String[] args){
	test t1 = new test();
    	t1.exec();
}

외부 클래스 인스턴스를 선언하고, 인스턴스 메소드를 호출하게 되면 내부적으로 선언한 지역 클래스들이 자동적으로 호출되는 형식이다.

1-4. 익명(중첩) 클래스

익명 클래스는 쉽게 말하면 아직 인스턴스가 생성되지 않은, 구체화되기 전의 클래스를 일컫는다.

자식 클래스 및 형변환을 사용하지 않고도, 추상 부모 클래스를 상속받은 익명클래스를 생성함으로써 직접적으로 구체화한 메소드를 사용하는데 활용하는 클래스를 말한다.

기존 추상클래스의 구체화 방식(부모클래스를 상속받아 자식클래스에서 추상메소드를 구체화하고 사용하는 방식)을 개선하기 위해 고안된 클래스라 생각하면 간편하다.

  • 기존 부모(추상)클래스를 구체화하기 위해 사용하는 자식클래스
public abstract class Action{
	public abstract void exec(){
    	}
} //부모 추상 클래스
public class myAction{
	public void exec(){
    	}
} //자식 클래스에서 추상 클래스를 구체화

부모클래스와 자식 클래스가 선언 완료되었다면, 아래 형변환 및 자식클래스 직접 선언을 통해 해당 메소드를 사용할 수 있다.

public class ActionTest{
	public void main(String[] args){
    		Action action = new myAction();
            	//자식클래스를 직접 선언하거나 형변환을 통해 메소드 사용
        	action.exec();
        }
}
  • 익명클래스를 활용하여 메소드를 구체화하는 경우
public class ActionTest{
	public void main(String[] args){
    	Action action = new Action{
        	public void exec(){
            		...
                }
                action.exec()
            }
        }
}

위와 같이 부모클래스의 abstract 클래스 메소드를 자체적으로 구체화하고, 로컬 클래스처럼 활용할 수 있다.

이때 익명클래스는 아직 클래스 인스턴스가 생성되기 전을 뜻하는데, Action 부모 클래스는 추상 클래스이므로 선언되기 전의 "익명 클래스"가 된다.
이러한 익명 클래스의 익명 메소드를 구체화하고, 로컬 클래스로 활용한다.

주로 단일성 클래스나 메소드에 많이 활용한다.

0개의 댓글