Java

[Java/자바]내부 클래스,익명 클래스

둥구는 지굴다 2022. 10. 5. 19:27

안녕하세요 오늘은 자바에서 클래스 안에 클래스가 있는 내부 클래스에 대해 알아보겠습니다!

 

내부 클래스

내부클래스는 클래스 안에 또 다른 클래스가 있는 것을 말합니다.

내부 클래스(Inner class)의 구조

class OuterClass{
			class InnerClass{
	}
}

내부 클래스(Inner Class)의 사용목적

⇒클래스 간의 관계가 긴밀할 때 사용하여 코드를 간결하게 하기 위해 사용합니다.

내부 클래스의 종류

  • 인스턴스 클래스
  • 스태틱 클래스
  • 지역 클래스
  • 익명 클래스

내부 클래스는 클래스가 있는 위치에 따라 달라집니다.

1. 인스턴스 클래스

  • 외부 클래스에서 멤버 변수 위치에 선언
  • 클래스의 내부에서 인스턴스(객체) 멤버처럼 다뤄지며, 인스턴스 멤버들과 상호작용이 가능합니다.

[구조]

class OuterClass{
		class InnerClass{
	
		}
}

2. 스태틱(static) 클래스

  • 외부 클래스에서 멤버 변수 위치에 선언, 인스턴스 클래스와 똑같은 위치이지만 클래스 앞에 static이 붙여졌다는 게 핵심
  • 클래스 내부에서 static멤버처럼 다뤄지며 static멤버처럼 다뤄지고 static멤버들과 상호작용 가능
class OuterClass{
	static class InnerClass{
	
		}
}

인스턴스 클래스, 스태틱 클래스 예시 코드

클래스 부분

class OuterClass{
	int a=3;
	static int b=4;
	class Inner{
		int c=5;
		public void innerMethod() {
			System.out.println("<Inner class>");
		}
	}
	static class StaticInner{
		int d=6;
		static int stat=10;
		public static void staticMethod() {
			System.out.println("<Static Inner>");
		}
	}
	
}

내부 클래스는 위치가 중요합니다. 외부 클래스의 멤버 변수 위치에 존재합니다.

따라서 static이 붙지 않은 Inner 클래스는 인스턴스 클래스

Static이붙은 StaticInner은 Static클래스가 됩니다.

메인 메서드

public class Inner {

	public static void main(String[] args) {
			OuterClass oc=new OuterClass();
			System.out.println("OuterClass A의 값:"+oc.a);
			System.out.println("OuterClass B의 값:"+OuterClass.b);
			
			System.out.println("===inner 클래스 접근하기===");
			OuterClass oc2= new OuterClass();
			OuterClass.Inner i=oc2.new Inner();
			
			System.out.println("Inner의 c값:"+i.c);
			i.innerMethod();
			
			OuterClass.StaticInner si= new OuterClass.StaticInner();
			System.out.println("StaticInner의 d의 값:"+si.d);
			
			si.staticMethod(); //=> static멤버는 객체를 생성하지 않고도 클래스명을 사용해서 호출 가능
			OuterClass.StaticInner.staticMethod();

	}

}

내부 클래스의 객체를 생성하기 위해서는 

외부클래스.내부클래스명 객체명 = new 외부클래스 생성자.내부클래스 생성자();

위와 같이 객체를 생성해 주어야 합니다.

출력 결과

보이는 바와 같이 외부 클래스, 내부 클래스 둘 다 잘 출력이 되는 것을 볼 수 있습니다.

3. 지역 클래스

  • 메서드 내부 지역변수 위치에 선언
  • 메서드나 촉기화 블록의 내부에서 다뤄지며 선언된 영역 내부에서 사용

[구조]

class OuterClass{
	void A(){

			class InnerClass{
					...			
			}
	}
}

지역 클래스는 위와 같이 클래스 안에 있는 메서드 안에 위치합니다.

내부 클래스의 접근성

⇒ 내부 클래스도 클래스이기 때문에 선언부에 접근제어자 즉, private, protected와 같은 접근제어자를 사용할 수 있다.