Home [java] 중첩 클래스 의미, 선언방법
Post
Cancel

[java] 중첩 클래스 의미, 선언방법

중첩 클래스

중첩 클래스는 클래스 내부에 선언 되는 클래스를 의미한다.
중첩 클래스가 선언 되는 위치에 따라 멤버 클래스, 로컬 클래스로 구분된다.

중첩 클래스를 사용하는 이유

클래스가 여러개가 필요한데, 범용적으로 사용하는게 아닌 클래스를 위한 클래스일 경우 중첩 클래스를 사용한다.
책에는 다음과 같이 나와있다.

중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 접근할 수 있고, 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일수 있다는 장점이 있습니다.

중첩 클래스의 종류

  1. 멤버 클래스
  2. 로컬 클래스 중첩 클래스도 컴파일 하면 class 파일이 생성된다. 대신 class in class 를 표현하기 위해 파일명에 경로가 표시되어 있다.
1
2
3
4
5
6
7
A 클래스 내부에 B 클래스를 선언했다고 가정.

멤버 클래스의 경우
A 클래스 $ B 클래스.class

로컬 클래스의 경우
A 클래스 $1 B 클래스.class

멤버 클래스

멤버 클래스는 이름을 보면 어디에 선언 되는지 유추할 수 있다. 멤버 변수, 생성자, 멤버 메소드 가 선언/정의 되는 블럭에서 클래스를 선언하면 멤버 클래스이다.
멤버 클래스도 두 가지 종류가 있다.

  1. 인스턴스 멤버 클래스
  2. 정적 멤버 클래스(static)

인스턴스 멤버 클래스

클래스 안에 클래스를 그냥 작성하면 인스턴스 멤버 클래스이다.

1
2
3
4
5
6
7
8
9
class A {
    class B {
        int 멤버변수;
        void 멤버메소드() {}

        static int 정적변수; // 불가능
        static void 정적메소드(); // 불가능
    }
}

인스턴스 멤버 클래스는 정적 변수와 정적 메소드를 선언할 수 없다. 그도 그럴것이 외부 클래스를 인스턴스화 하기 전까지 중첩 클래스는 존재하지 않는데, 정적변수와 정적메소드는 접근이 가능해야하니 모순이 생긴다.
위에 작성한 코드를 예로 들면 class A를 객체로 만들기 전까진 class B는 존재하지 않는데, B.정적변수 와 B.정적메소드() 에 접근이 가능해야하는 모순이 발생한다. 그래서 코드를 작성하지 못하게 막았으리라 생각된다.

인스턴스 멤버 클래스를 생성 및 사용하는 방법

** 클래스 내부 **

1
2
3
4
5
6
7
8
9
10
class A {
    class B {
        int field;
    }

    void A의메소드() {
        B test = new B();
        test.field = 1;
    }
}

중첩 클래스가 선언된 블럭에서 객체를 생성하는 방법은 일반 클래스와 동일하다.

** 클래스 외부 **

1
2
3
4
5
class A {
    class B {
        int field;
    }
}
1
2
3
4
5
6
7
8
9
10
import A;

class Main {
    public static void main() {
        A ex = new A();
        A.B test = ex.new B();

        test.field = 1;
    }
}

클래스 외부에서 중첩 클래스를 사용하는 방법도 일반적으로 클래스를 사용하는 방법과 일맥상통한다.

static 멤버 클래스

클래스 안에 static 클래스를 작성하면 static 멤버 클래스이다.

1
2
3
4
5
6
7
8
9
class A {
    static class B {
        int 멤버변수;
        void 멤버메소드() {}

        static int 정적변수; // 가능
        static void 정적메소드(); // 가능
    }
}

위 코드를 기준으로, 클래스 A가 객체로 존재하지 않더라도 메모리 상에 클래스 B 가 존재하므로 정적변수와 정적메소드를 선언할 수 있다.

static 멤버 클래스를 생성 및 사용하는 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import A;

class Main() {
    public static void main() {
        A.B test = new A.B(); // 가능
        
        test.멤버변수 = 1;
        test.멤버메소드();

        A.B.정적변수 = 10;
        A.B.정적메소드();

        A ex = new A();
        A.B test2 = new ex.B(); // 불가능
    }
}

로컬 클래스

로컬 클래스는 ‘로컬’ 위치에 선언한 클래스이다. 클래스 내부에서 로컬변수의 위치를 생각해보면 메소드 내부라는 것을 알 수 있다.
즉 메소드 내부에 선언된 클래스가 로컬 클래스이다.
로컬 클래스는 public, private, static이 붙지 않는다. static 변수와 static 메소드도 선언할 수 없다.

왜 안붙나요? 메소드 외부에서 메소드 내부에 선언된 class에 접근할 방법이 없기 때문이다.

로컬 클래스 선언 및 생성 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
method() {
    class 계산기 {
        int sum;
        void add(int x, int y) {
            sum = 0;
            sum = x + y;
            System.out.println("sum : " + sum);
        }
    }

    int a = 10;
    int b = 40;
    계산기 calc = new 계산기();
    calc.add(a, b);
}

예시로 로컬 클래스 ‘계산기’를 생성하고 사용하는 코드를 작성해보았다. 일반적인 클래스와 다른 점이 없다.

This post is licensed under CC BY 4.0 by the author.

백준 9996 한국이 그리울 땐 서버에 접속하지

[java] 중첩 클래스 접근 제한