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와 같은 접근제어자를 사용할 수 있다.