일반 중첩 클래스

일반 중첩 클래스

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

일반 중첩 클래스의 형태

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

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

public class Outer {

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

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

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

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

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

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

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

  1. 패키지를 나누고 권총과 경찰을 같은 패키지에 둔 뒤 패키지 접근제한을 설정한다.

  2. 일반 중첩클래스를 이용하여 경찰 안에 권총 클래스를 만든다.

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

Police.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("권총 발사!");
        }
    }
}

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

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

Last updated