본문 바로가기

[TIL] 중첩 클래스

인포꿀팁 발행일 : 2020-08-11

static 중첩 클래스란?

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

 

특징

  • 외부 클래스의 클래스 변수(static 변수)와 클래스 메소드(static 메소드)는 바로 접근하여 사용 가능하다.
  • 외부 클래스의 인스턴스 변수와 인스턴스 메소드는 static 중첩 클래스 안에서 바로 접근이 불가능하며 외부클래스의 객체를 생성해서 접근한다.
  • 외부 클래스 객체 생성 없이 static 중첩 클래스는 다른 클래스에서 바로 객체를 생성하여 접근할 수 있다.
  • 컴파일 후 생성되는 외부 클래스와 중첩 클래스
    • 외부클래스명.class  
    • 외부클래스명$중첩클래스명.class
  • 다른 클래스에서 static 중첩 클래스 객체 생성
  • 외부클래스명.중첩클래스명 객체 = new 외부클래스명.중첩클래스명();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package ex0811;
 
public class NestedClass_Ex1 {
    public static void main(String[] args) {
 
//    Test5 obj = new Test5(); // 컴오류// 단독 클래스가 아니기 때문에 직접 접근 부락
        User5.Test5 obj = new User5.Test5();
        obj.write();
    }
}
 
class User5 {
    static int a = 10;
    int b = 20;
 
    // static 중첩 클래스. 중첩 클래스에서만 static class가 가능
    // 외부 클래스의 객체 생성과 상관없이 외부에서 객체를 생성할 수 있음.
    // 컴파일하면 User5$Test5. class로 컴파일됨 해당 파일도 배포시 배포해야함
    public static class Test5 {
        int c = 30;
 
        public void write() {
            System.out.println(a + ":" + c);
//            System.out.println(b);// 컴파일 오류
        }
    }
 
    public void print() {
        Test5 obj = new Test5();
        obj.write();
    }
}
cs

 

내부 클래스 - 멤버 클래스

클래스안에 클래스의 멤버로 선언된 내부 멤버 클래스(인스턴스 클래스)

특징

  • 멤버 클래스는 외부 클래스의 클래스 변수와 클래스 메소드는 바로 접근하여 사용 가능하다.
  • 멤버 클래스는 외부 클래스의 인스턴스 변수와 인스턴스 메소는 바로 접근 사용 가능하다.
  • 멤버 클래스는 클래스 변수와 클래스 메소드를 가질 수 없다.
  • 외부 클래스의 메소드에서 멤버 클래스에 접근하기 위해서는 멤버 클래스의 객체를 생성해서 접근해야한다.
  • 외부 클래스 객체 생성 없이 멤버 클래스는 다른 클래스에서 객체를 생성할 수 없다.
  • 컴파일 후 생성되는 외부 클래스와 중첩 클래스
    • 외부클래스명.class  
    • 외부클래스명$멤버클래스명.class
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    package ex0811;
     
    public class InnerClass_MemberClass_Ex1 {
        public static void main(String[] args) {
    //        User6.Test6 obj = new User6.Test6(); 컴파일 오류 발생
            // 외부 객체를 먼저 생성해야한다.
            User6 uu = new User6();
            User6.Test6 obj = uu.new Test6();
            obj.write();
            //하지만 해당 내부 클래스의 생성 목적은 주로 
            // 클래스 내부의 작업에 필요성에 생성된다. 외부에서는 호출 잘 안함
        }
    }
     
    class User6 {
        static int a = 10;
        int b = 20;
     
        // 내부클래스
        // 다른 클래스에서 객체를 생성할 때 외부 클래스의 객체를
        // 생성하지 않고는 객체 생성이 불가능한 클래스
        public class Test6 {
            int c = 30;
     
            public void write() {
                System.out.println(a + ":" + b + ":" + c);
            }
        }
     
        public void sub() {
            Test6 obj = new Test6();
            obj.write();
        }
    }
     
    cs

     

     

     

로컬 클래스

  • 로컬 클래스는 초기화 블록이나 클래스의 메소드 안에서 클래스를 정의하는 것
  • 선언된 영역 내에서만 사용
  • 내부 멤버 클래스와 유사한 성격을 가지고 있지만 접근 제어자는 붙일 수 없다.
  • 메소드 안에서 정의된 로컬 클래스는 메소드의 지역변수 중 final 변수만 접근 가능하다.
  • 메소드 안에서 정의된 로컬 클래스에서 메소드의 final이 붙지 않는 지역변수를 접근할 경우 에러가 발생하지만 자바8부터는 접근 가능하며 로컬 클래스에서 final이 없는 로컬 변수를 접근한 경우 final 속성을 갖는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package ex0811;
 
public class LocalClass_Ex1 {
 
}
class User7{
    int a =10;
    // 메소드 내에도 클래스 생성이 가능하다.
    // 로컬 클래스라고도 한다.
    public void write() {
        int b =20;
        final int c=30;
        
        class Test7{
            void print() {
                System.out.println(a+":"+c);
                System.out.println(b); // 자바 8.0 가능
            }
        }
//        b=200; // 내부클래스에서 error
        // 내부 클래스에서 사용하면 final 성질을 가짐
        
        Test7 obj = new Test7();
        obj.print();
    }
}
cs

 

'Language > JAVA' 카테고리의 다른 글

[TIL] 제네릭  (2) 2020.08.12
[TIL] 예외처리  (3) 2020.08.12
[TIL] 인터페이스  (0) 2020.08.11
[TIL] 추상 클래스  (0) 2020.08.10
[TIL] 상속  (0) 2020.08.10

댓글