Link
10-24 09:47
«   2020/10   »
        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
Archives
Today
260
Total
1,084,466
관리 메뉴

꿈 많은 사람의 이야기

중첩 클래스, 내부 클래스(inner class, nested class), 로컬 클래스 본문

java

중첩 클래스, 내부 클래스(inner class, nested class), 로컬 클래스

이수진의 블로그 이수진의 블로그 2017. 8. 16. 13:16

클래스가 여러 클래스와 관계를 맺는 경우에는 독립적으로 선언하는 것이 좋으나, 특정 클래스와 관계를 맺을 경우에는 관계 클래스를 클래스 내부에 선언하는 것이 좋다.

중첩 클래스란 클래스 내부에 선언한 클래스를 말하는데 이 것을 사용하면 두 클래스의 멤버드을 서로 쉽게 접근할 수 있다는 장점과 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.

선언 위치에 따른 분류
선언 위치
설명

멤버 클래스
인스턴스 맴버클래스
class A{
 class B{ }
}
A 객체를 생성해야만 사용할 수 있는 B 클래스
(Inner Class)
정적 멤버 클래스
class A{
 static class B { }
}
A 클래스로 바로 접근할 수 있는 B 중첩 클래스
(Nested Class)
로컬 클래스
class A{
  void method(){
    class B{ }
  }
}
Method()가 실행할 때만 사용할 수 있는 B 중첩 클래스
(local Class)


인스턴스 맴버 클래스는 static 키워드 없이 선언된 클래스를 말한다. 인스턴스 멤버 클래스는 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.

1
2
3
4
5
6
7
8
9
10
11
class A{
    class B{
        B() {}  //생성자
        int field;  //인스턴스 필드
        //static int filed2    //정적 필드 -> 사용불가
        void method() {} //인스턴스 메소드
        //static void method2() {} //정적 메소드 -> 
    }
}
 
 
Colored by Color Scripter

A 클래스 외부에서 B 클래스 객체를 생성하려면 A객체를 생성하고 B 객체를 생성해야 한다.

A a = new a( );
A.B  b = a.new B( );
b.field1 = 3;
b.method();

와 같이 사용한다.

정적 멤버 클래스는 static 키워드로 선언된 클래스를 말한다. 정적 멤버 클래스는 모든 종류의 필드와 메소드를 선언할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
class A{
    static class C{
        C() {}  //생성자
        int field1;  //인스턴스 필드
        static int field2    //정적 필드 
        void method1() {} //인스턴스 메소드
        static void method2() {} //정적 메소드 
    }
}
 
 
Colored by Color Scripter

A클래스 외부에서 정적 멤버 클래스 C의 객체를 생성하기 위해서는 A 객체를 생성할 필요가 없고 다음과 같이 하면 된다.

A.C c = new A.C( );
c.field1 = 3;
c.method1( );
A.C.field2 = 3;
A.C.method2( ); 


중첩 클래스는 메소드 내에서도 선언할 수 있다. 이것을 로컬 클래스라고 한다. 로컬 클래스는 접근 제한자(public, private) 및 static을 붙일 수 없다. 로컬 클래스는 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없기 때문이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void method()
{
    class D
    {
        D() {} //생성자
        int field1     //인스턴스 필드
        //static int field2; //정적 필드 -> 사용 불가
        void method1() { } //인스턴스 메소드
        //static void method2() {} //정적 메소드 -> 사용 불가
    }
 
    D d = new D();
    d.field1 = 3;
    d.method1();
 
}
 
 
Colored by Color Scripter

즉 static못쓰고 public, private 못쓴다. 로컬 클래스는 메소드가 실행될 때 메소드 내에서 객체를 생성하고 사용해야 한다.


멤버 클래스(Inner, Nested)클래스에선 사용 제한이 있다.

먼저 Inner class는 다음과 같다

 

 

 


그리고 Nested class 에선 다음과 같다

 

 

이러한 특징을 가지고 있는 것이 내부 클래스들이다.


0 Comments
댓글쓰기 폼