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;
}
}
Theif.java
public class Theif {
private Gun gun;
public void setGun(Gun gun){
this.gun = gun;
}
public Gun getGun(){
return this.gun;
}
}
Gun.java
public class Gun {
public void shoot(){
System.out.println("권총 발사!");
}
}
InnerClassExample01.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();
}
}
예제에는 경찰(Police), 도둑(Theif) 클래스가 있으며, 권총(Gun) 클래스를 소지할 수 있도록 멤버와 setter/getter 메소드가 구성되어 있다.
만약 권총을 경찰만 소지하도록 하고 싶다면 클래스 구성을 어떻게 해야할까? 대략 다음과 같은 방법들이 있을 것이다.
패키지를 나누고 권총과 경찰을 같은 패키지에 둔 뒤 패키지 접근제한을 설정한다.
일반 중첩클래스를 이용하여 경찰 안에 권총 클래스를 만든다.
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("권총 발사!");
}
}
}
Theif.java
public class Theif {
//아래 코드들은 모두 오류가 발생한다.
//private Gun gun;
//public void setGun(Gun gun){
// this.gun = gun;
//}
//public Gun getGun(){
// return this.gun;
//}
}
InnerClassExample02.java
public class InnerClassExample02 {
public static void main(String[] args){
Police police = new Police();
Theif theif = new Theif();
police.getGun().shoot();
}
}
Police만 Gun을 생성하고 사용할 수 있도록 구조가 변경되었다.
일반중첩 클래스의 활용방법은 매우 다양하기 때문에 이 방법으로만 이용 가능한 것이 아님을 주의해야 한다