Java 중첩클래스(nestedclass)

jooog·2021년 9월 29일
0

중첩 클래스: 클래스 멤버로 선언된 클래스
중첩 인터페이스: 클래스 멤버로 선언된 인터페이스

class Practice {
	class FirstPractice {
    } //중첩클래스
}

class Practice {
	interface FirstPractice{
    
    } //중첩 인터페이스
}

인스턴스 멤버 클래스

중첩클래스 코드를 작성할 때 인스턴스 멤버 클래스로 정적 필드와 정적 메소드는 선언할 수 없다

class A {

   class B {
   
   	B(){}    //생성자
        String name; //인스턴스 필드
        void method1(){} //인스턴스 메소드
        static int number; //정적 필드
        static void method2(); //정적 메소드
   
   }
}

위의 코드에서 보면 중첩 클래스 내에서 생성자, 인스턴스 필드, 인스턴스 메소드는 사용 가능하지만 정적 필드(number)와 정적 메소드(method2)는 사용할 수 없다

그렇다면 중첩 클래스 B는 어떻게 사용할 수 있을까?

먼저 바깥쪽 A클래스가 먼저 객체로 만들어져야 한다

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

b.name ="name";
b.method1();

클래스 A의 객체를 먼저 생성하고 참조변수 a로 B객체를 생성해 B클래스 내의 필드와 메소드에 접근할 수 있다.

정적 멤버 클래스

인스턴스 멤버가 아닌 정적 멤버 클래스를 살펴보자

class A {

   static class B {
   
   	B(){}    //생성자
        String name; //인스턴스 필드
        void method1(){} //인스턴스 메소드
        static int number; //정적 필드
        static void method2(); //정적 메소드
   
   }
}

인스턴스 멤버 클래스와의 차이점은 정적 필드정적 메소드를 사용할 수 있다는 점이다

A.B b = new A.B();
b.name = "name";
b.method1();
A.B.number = 5;
A.B.method2():

정적 클래스의 경우에는 바깥 클래스 A의 객체를 먼저 생성하지 않아도 바로 중첩 클래스 B를 사용할 수 있다.

A.B.number = 5;
A.B.method2():

위의 코드에서 보는 것처럼 정적 필드와 메소드의 경우에는 클래스에서 바로 접근할 수 있다

로컬 클래스

메소드 안에 클래스가 오는 경우를 말한다

public class A {


	void method () {
		
		class D {
			int field1;
			D() {
				System.out.println("D객체 생성");
			}
			void method1() {}
		}
	}

}

로컬 클래스에서 정적 필드와 메소드는 사용할 수 없다

로컬클래스는 선언된 메소드 안에서만 사용할 수 있다

	void method () {
		
		class D {
			int field1;
			D() {
				System.out.println("D객체 생성");
			}
			void method1() {}
		}
		
		D d = new D();
		d.field1 = 5;
		d.method1();
	}

D클래스에 선언된 필드와 메소드를 사용하고 싶다면 A클래스의 method로 접근해야 한다.

중첩 클래스의 접근제한

public class A {
	
	int field1;
	void method1() {}
	
	static int field2;
	static void method2() {}
	
	//인스턴스 멤버 클래스
	class B {
	    void method() {
		field1 = 5;
		method1();
                field2 = 10;
		method2();
		}
	}
}

인스턴스 멤버 클래스인 B 내부에서는 클래스 A의 인스턴스 필드와 인스턴스 메소드를 사용할 수 있다

클래스 A의 정적 필드와 정적 메소드도 사용할 수 있을까? 물론 사용할 수 있다

그렇다면 정적 클래스를 살펴보자

public class A {
	
	int field1;
	void method1() {}
	
	static int field2;
	static void method2() {}
	
//정적 멤버 클래스
   static class C {
	void method() {
        field1 = 5; //호출못함
	method1(); //호출못함
	field2 = 10;
	method2();
	}
     }
}

static 클래스 C에서는 인스턴스 필드와 메소드를 사용할 수 없다. 이유는?

인스턴스 필드와 메소드는 class A 객체가 생성되어야 사용할 수 있기 때문이다

즉, static class C내부에서는 A 객체가 없어도 사용할 수 있는 정적 필드와 메소드만 호출할 수 있다

0개의 댓글