> For the complete documentation index, see [llms.txt](https://docs.sysout.co.kr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.sysout.co.kr/base-language/java/advanced/inner-class/normal-inner-class.md).

# 일반 중첩 클래스

## 일반 중첩 클래스

이 문서에서는 일반 중첩 클래스에 대해서 살펴본다.

### 일반 중첩 클래스의 형태

```java
public class Outer {//외부 클래스
    
    class Innner {//일반 중첩 클래
        
    }
    
}
```

일반 중첩 클래스도 클래스이기 때문에 내부에 클래스의 구성요소인 멤버 필드, 메소드, 생성자, 중첩 클래스를 가질 수 있다. 또한 기타 멤버들과 마찬가지로 접근제한 키워드를 4종류 모두 사용할 수 있다.

```java
public class Outer {

    private class Inner1 { }
    
    class Inner2 { }
    
    protected class Inner3 { }
    
    public class Inner4 { }
    
}
```

### 일반 중첩 클래스의 활용 예시

> 일반 중첩 클래스를 어떻게 써야 하나요?

가장 대답하기 어려운 질문이지만 자주 사용하는 형태를 살펴보면 감을 잡을 수 있다.&#x20;

{% tabs %}
{% tab title="Police" %}
{% code title="Police.java" %}

```java
public class Police {
    private Gun gun;
    public void setGun(Gun gun) {
        this.gun = gun;
    }
    public Gun getGun(){
        return this.gun;
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="Theif" %}
{% code title="Theif.java" %}

```java
public class Theif {
    private Gun gun;
    public void setGun(Gun gun){
        this.gun = gun;
    }
    public Gun getGun(){
        return this.gun;
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="Gun" %}
{% code title="Gun.java" %}

```java
public class Gun {
    public void shoot(){
        System.out.println("권총 발사!");
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="InnerClassExample01" %}
{% code title="InnerClassExample01.java" %}

```java
public class InnerClassExample01 {
    public static void main(String[] args){
        Police police = new Police();
        Theif theif = new Theif();
        
        Gun gun1 = new Gun();
        Gun gun2 = new Gun();
        
        police.setGun(gun1);
        theif.setGun(gun2);
        
        police.getGun().shoot();
        theif.getGun().shoot();
    }
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

예제에는 경찰(Police), 도둑(Theif) 클래스가 있으며, 권총(Gun) 클래스를 소지할 수 있도록 멤버와 setter/getter 메소드가 구성되어 있다.&#x20;

만약 권총을 경찰만 소지하도록 하고 싶다면 클래스 구성을 어떻게 해야할까? 대략 다음과 같은 방법들이 있을 것이다.

1. 패키지를 나누고 권총과 경찰을 같은 패키지에 둔 뒤 패키지 접근제한을 설정한다.
2. 일반 중첩클래스를 이용하여 경찰 안에 권총 클래스를 만든다.

2번을 적용시키면 다음과 같이 코드가 변경된다.

{% tabs %}
{% tab title="Police" %}
{% code title="Police.java" %}

```java
public class Police {
    private Gun gun;
    public Gun getGun(){
        return this.gun;
    }
    
    public Police(){
        this.gun = new Gun();//내부에서 생성
    }
    
    //Gun을 중첩 클래스로 구현(경찰만 사용하는 클래스)
    //접근제한을 private으로 하면 외부에서 형태조차 파악할 수 없다.
    private class Gun {
        public void shoot(){
            System.out.println("권총 발사!");
        }
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="Theif" %}
{% code title="Theif.java" %}

```java
public class Theif {
    //아래 코드들은 모두 오류가 발생한다.
    //private Gun gun;
    //public void setGun(Gun gun){
    //    this.gun = gun;
    //}
    //public Gun getGun(){
    //    return this.gun;
    //}
}
```

{% endcode %}
{% endtab %}

{% tab title="InnerClassExample02" %}
{% code title="InnerClassExample02.java" %}

```java
public class InnerClassExample02 {
    public static void main(String[] args){
        Police police = new Police();
        Theif theif = new Theif();
        
        police.getGun().shoot();
    }
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

Police만 Gun을 생성하고 사용할 수 있도록 구조가 변경되었다.

{% hint style="info" %}
일반중첩 클래스의 활용방법은 매우 다양하기 때문에 이 방법으로만 이용 가능한 것이 아님을 주의해야 한다
{% endhint %}
