개발자 미니민의 개발스터디

[JAVA] 자바 - static 중첩 클래스 & 내부 클래스(member class)

by mini_min

[JAVA]
자바 - static 중첩 클래스 & 싱글턴 & 내부 클래스(member class)

 

✔️ static 중첩 클래스

클래스 안에 클래스의 멤버로 선언된 static 클래스

 

외부 클래스의 객체 생성과 상관없이 객체를 생성할 수 있는 class를 말한다.

해당 클래스는 컴파일하면 "외부클래스명$중첩클래스명.class(Test1$User1.class)" 파일이 생성된다. 

 

🏷️ 형식

[접근 제어자] class 외부클래스명 {

      [접근제어자] static class 중첩클래스명 {

        }

}

 

🏷️ static 중첩 클래스 특징

- 외부 클래스의 클래스 변수와 클래스 메소드바로 접근하여 사용이 가능하지만, 외부 클래스의 인스턴스 변수와 메소드는 static 중첩 클래스 안에서 바로 접근이 불가능하다. 

⭕ 외부 클래스의 객체를 생성해야 접근할 수 있음! (인스턴스 변수/메소드니까)

- 외부 클래스의 객체 생성 없이 static 중첩 클래스는 다른 클래스에서 객체 생성하여 접근 가능

 

💡 다른 클래스에서 static 중첩 클래스 객체 생성
외부클래스명.중첩클래스명 객체 = new 외부클래스명.중첩클래스명();

 

class Test1 {
	int a = 10;
    static int b = 100;
    
    public void print() {
    System.out.println("a :" + a + ", b: " + b);
    }
	
    public static void sub() {
    }
    
    	static class User1 {
    		int x = 50;
            
            public void write() {
            System.out.println(b); //
            
            }
            
            public void disp() {	
            Test1 tt = new Test1();
            System.out.println(tt.a);
    
    
   		 	}
	}

}


//외부에서 static 중첩 클래스 객체 생성하는 방법
		//Test1 안에 User1 
		Test1.User1 u = new Test1.User1();
		u.write();

 

💡 static 중첩 클래스에 있는 메소드에서 외부 클래스에 있는 '인스턴스 변수 a' 는 호출 불가. 외부 클래스의 객체가 아직 생성되지 않았기 때문이다. 접근하고 싶으면 외부 클래스 객체 생성해서 메모리 할당 시켜야함

 

 

 

✔️ 내부 클래스(member class)

멤버 클래스란? 클래스 안에 클래스의 멤버로 선언된 내부 멤버 클래스! (인스턴스 클래스다.)

 

🏷️ 형식

[접근 제어자] class 외부클래스명 {

      [접근제어자] class 중첩클래스명 {

        }

}

 

🏷️ 특징

- 외부 클래스의 클래스 변수, 메소드는 바로 접근 가능해 사용 가능하다.

- 외부 클래스의 인스턴스 변수, 메소드도 바로 접근 사용 가능!

(역으로)

- 외부 클래스의 메소드에서 멤버 클래스를 접근하려면 멤버 클래스의 객체를 생성하여 접근해야한다.

- 외부 클래스의 객체가 생성되어야 객체를 생성할 수 있다.

= 외부에서 멤버 클래스 단독으로 객체 생성 불가

 

💡 다른 클래스에서 내부 멤버 클래스 객체 생성
외부클래스명 객체1 = new 외부클래스명();

외부클래스명.멤버클래스명 객체2 = 객체1.멤버클래스명();

외부클래스명.멤버클래스명 객체 = new 외부클래스명().new멤버클래스명();

 

class Test4{
	int a = 10;
	static int b = 20;
	
    public void print(){
    	System.out.println(a + "," + b);
    }
    
    public void sub(){
    	User4 u = new User4();
        u.write();
    }
    
    //내부클래스
    //외부 객체가 생성되어야 객체를 생성할 수 있는 클래스
    class User4{
    	int x = 100;
        
        public void write(){
        	System.out.println(a);
        }
    
    }
    
}
Test4 tt = new Test4();	//외부꺼 만들었음
Test4.User4 uu = tt.new User4();	//멤버 클래스 객체 .하는 경우 드물다.
	uu.write();

 

💡 외부 클래스 객체가 생성되어야 내부 클래스 객체도 생성 가능하다.

이제 1)외부 클래스 객체 생성 2)멤버 클래스 객체 생성

 

 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기