[Java]내부 클래스
본문 바로가기
개발공부/JAVA

[Java]내부 클래스

by 로진김 2021. 6. 20.

이 포스팅은 프로그래머스 자바 입문 유튜브 강좌를 공부하고 개인이 정리한 포스팅입니다. 

 

 내부 클래스란, 클래스 안에 선언된 클래스를 말합니다.

내부 클래스의 종류에는 크게 4가지 형태가 있습니다.

 

1. 중첩 클래스, 인스턴스 클래스 : 클래스 안에 인스턴스 변수(필드)를 선언하는 위치에 클래스를 선언하는 내부 클래스입니다.

public class InnerExam1 {
	class Cal {
		int value = 0;

		public void plus() {
			value++;
		}
	}

	public static void main(String[] args) {
		InnerExam1 ic1 = new InnerExam1();
		InnerExam1.Cal cal = ic1.new Cal();
		cal.plus();
		System.out.println(cal.value);

	}

}

 

 사용법은 외부에 있는 InnerExam1이 먼저 선언되어야 하고, 독자적으로 내부 클래스를 만들 수 없습니다.

바깥 클래스 type. 내부의 클래스 type 생성 객체 이름 = ic1.new Cal(); 로 객체를 생성해야 합니다.

클래스 안의 메소드를 호출할 수 있고, 익명 클래스로 지정된 필드를 사용할 수 있습니다. 

 

 

2. 정적 중첩 클래스, 스태틱 클래스(static class) : 인스턴스 변수로 선언한 것과 비슷함, 필드가 정적인 필드 즉, static 한 필드로 선언되는 것을 말함.

public class InnerExam2 {
	static class Cal {
		int value = 0;
		public void plus(){
			value++;
		}
	}
	public static void main(String[] args) {
		InnerExam2.Cal cal = new InnerExam2.Cal();
		cal.plus();
		System.out.println(cal.value);

	}

}

 

 

스태틱 클래스는 내부 클래스를 static으로 선언하여 생성합니다. 정적 클래스 Cal은 정적인 필드와 성격이 같기 때문에 static 한 필드는 외부 클래스를 미리 말하지 않고 내부 클래스를 선언 및 생성할 수 있습니다.

 

 

3. 지역 중첩 클래스, 지역 클래스(local class) : 클래스가 인스턴스 변수로 선언되는 것이 아니라 메소드 안에서 생성되는 경우를 말합니다.

public class InnerExam3 {
	public void exec() {
		class Cal {
			int value = 0;

			public void plus() {
				value++;
			}
		}// 메소드 안에서 선언된 클래스는 메소드 안에서만 생성됨
		Cal cal = new Cal();
		cal.plus();
		System.out.println(cal.value);
	}

	public static void main(String[] args) {
		InnerExam3 t = new InnerExam3();
		t.exec();

	}

}

 

메소드 안에서만 Cal 객체를 생성하고 사용할 수 있습니다. 메소드 안에서 Cal이라는 객체가 갖는 value와 메소드를 사용할 수 있습니다. 위의 코드에서 메인에서 사용하려면 InnerExam3의 객체를 생성하고, 해당 객체의 메소드를 참조하여 사용하면 됩니다.

 

4. 익명 중첩 클래스, 익명 클래스 : 내부 클래스의 일종으로

 

public abstract class Action {
	public abstract void exec();
}

 추상 클래스인 Action이 추상 메소드인 exec을 갖고 있습니다.

추상 클래스를 사용하기 위해서 상속받는 자식 클래스가 해당 메소드를 구현해야 합니다.

 

 

public class MyAction extends Action {

	@Override
	public void exec() {
		System.out.println("exec");

	}

}

 Action을 상속받는 MyAction 클래스를 만들고 추상 메소드인 exec을 override 합니다.

public class ActionExam {

	public static void main(String[] args) {
		//Action action = new MyAction();
		//action.exec();
        //부모클래스가 추상클래스이기때문에 자식클래스로 생성해야함.
		Action action = new Action() {
			//action 상속받는 클래스가 해당 클래스 안에서만 사용되고, 다른 클래스에서는 전혀사용할 필요가 없는 경우
			//처음 경우처럼 myaction을 만들 필요가 없음. 한번만 만들 것이므로, 익명 중첩클래스
			@Override
			public void exec() {
				System.out.println("exec");
				
			}
			
		};
		action.exec();
	}

}

 

  1. 일반적인 형태 (위의 코드 중 주석 처리한 방법입니다.)
     Action 타입의 action을 선언하고, 추상 클래스이기 때문에 생성되지 않은 MyAction이라고 하는 자식 클래스가 생성되어야 합니다. 이 방법을 사용하면 Action이 가진 메소드를 사용할 수 있습니다.

  2. Myaction을 만들지 않고, ActionExam에서 익명 클래스를 만드는 형태 : Action을 상속받는 클래스를 굳이 만들어낼 필요가 없을 때, 사용할 수 있습니다. 해당 클래스 안에서만 사용되고, 다른 클래스에서 전혀 사용하지 않을 경우에 처음처럼 MyAction을 만들 필요가 없습니다. 한 번만 사용하고 말 것이기 때문에 익명 클래스, 익명 중첩 클래스를 만들어 사용합니다.

     Action 클래스를 생성한다고 해도, 추상 클래스인 Action 자체가 생성되지 않습니다. 익명으로 중괄호를 열어 Override 시켜 메소드를 만들 수 있습니다. 생성자 다음 중괄호 열고 닫을 때, 생정자에 해당하는 상속받는 이름 없는 객체를 만든다는 것을 의미합니다. 메소드를 구현할 뿐만 아니라 추가할 수도 있습니다. 이름 없는 객체를 action이라는 객체가 참조하도록 만들었습니다. action.exec 로 exec 메소드를 호출하였습니다.

 

반응형