자바 JAVA

[JAVA]자바 - 내포 클래스 Nested Class

스누징어 2021. 7. 17. 23:37

내포 클래스 Nested Class

2가지 내포 클래스

* 내포 클래스클래스 안에서 선언된 클래스를 만한다. 

// 외부 클래스 
public class Outer{

    // 내포 클래스
    public class Nested{
    }

}

 

* 외부 클래스는 접근지정자로 public, package만 사용할 수 있지만,

  내포 클래스는 protected, private를 추가로 더 사용할 수 있다.

 

* 클래스이므로 객체, 생성자, 접근지정자, 메서드 모두 만들고 사용할 수 있다.

 

* 자바에는 2가지 방법의 내포 클래스가 있다.

  1. 비정적 내포 클래스 (Non-static Nested Class)

     (내부 클래스라고도 한다. (Inner Class))

  2. 정적 내포 클래스 (static nested class)

 

* C#이나 C++에서는 정적 내포 클래스만 존재한다.

  다른 주류 OO언어에서 정적 내포 클래스만을

  구현했다는 점에서 유추해볼 수도 있는데, 

  

* 둘 중 어떤걸써도 구현 자체는 가능하다는 것이다.

  자바에서도 2가지 방법중에 정적 내포 클래스를 더 많이 사용한다.

  

 

언제 사용하냐

* 제작자의 의도를 좀 더 보여줄 수 있다.

  같은 패키지 안에 있어도 상관없을 수도 있지만,

  내포 클라스로 만들어 특정 클래스와 긴밀한 연관이 있음을 보여줄 수 있다. 

 

* 바깥 클래스의 private 멤버에 접근이 가능하다.

  내포 -> 바깥 = private 멤버 접근 가능

  바깥 -> 내포 = private 멤버 접근 불가능

  보통 이 장점을 위해 사용함.

 

 

비정적 내포 클래스 non-static nested class

* 자바에서 내부 클래스라고 하면 비정적 내포 클래스를 말한다.

  다른 언어에는 용어 구분없이 사용하기도 함.

 

// 외부 클래스
public class Outer{
    private int a = 1;
    private static int b = 1;
    
    public Outer() {}
    
    // 비정적 내포 클래스 구현
    public class Inner{  
    
        public void plus_a_b(int x){
            a += x;
            b += x;
        }
    }
}

 

* 내포 클래스 선언시 

  접근지정자 class 클래스명 { } 으로 구현한다.

 

* 비정적 내포 클래스의 가장 큰 특징은 

  외부 클래스의 non_static 멤버 변수를 접근할 수 있다는 것이다.

  

* 비정적 내포 클래스는 객체 생성 시

  외부 클래스 객체가 꼭 필요하다.

  즉, 내포 클래스 객체가 무조건 외부 클래스 객체와 연결이 보장된다.

 

* 연결이 보장되는 비정적 내포 클래스에서는 

  클래스 구현 시 외부 클래스 멤버 변수를 마음대로 접근할 수 있다.

  (정적 내포 클래스는 이렇게 할 수가 없다.)

 

public static void main(String[] args) {

    // 외부 클래스 객체 생성
    Outer outer = new Outer();
    
    // 내포 클래스 객체 생성
    Outer.Inner inner = outer.new Inner();
    
    inner.plus_a_b(10);
}

 

* 비정적 클래스의 객체 생성는 꽤나 희한한 구조를 하고 있는데,

  생성과 동시에 외부 클래스 객체와 연결되기 위함인 것 같다.

 

 

정적 내포 클래스 static nested class

* C++와 C#에는 정적 내포 클래스만 있다.

  

// 외부 클래스
public class Outer{
    private int a = 1;
    private static int b = 1;
    
    public Outer() {}
    
    // 정적 내포 클래스 구현
    public static class Nested_Static {  
    
    	private final Outer _outer;
    
    	public Nested_Static(Outer outer) {
    		this._outer = outer;
        }
    
        public void plus_a_b(int x){
            _outer.a += x;
            b += x;
        }
    }
}

 

* 정적 내포 클래스의 이름이 왜 정적인지 모르겠다.

  클래스 구현에서 static인 무언가를 강제하지도 않고,

  객체 생성도 가능한데...

 

* 비정적과 가장 큰 차이점은

  외부 클래스의 non_static 멤버 변수를 직접 사용하지 못한다는 것이다.

  (static은 바로 사용가능)

 

* 정적 내포 클래스가 외부 클래스 객체를 사용하기 위해서는

  생성자를 통해 매개변수로 받아와야 한다.

 

public static void main(String[] args) {

    // 외부 클래스 객체 생성
    Outer outer = new Outer();
    
    // 내포 클래스 객체 생성
    Outer.Nested_Static nested = new Outer.Nested_Static(outer);

    nested.plus_a_b(10);
}

 

* 정적 내포 클래스의 객체 생성은 비교적 정상적인 모습이다.

 

 

많이 사용하지 않는 내포 클래스

* 내포 클래스가 거의 사용되지 않는 거 같음.

  파일 하나에 클래스 하나를 추구하는 듯.

 

* 가독성을 높이기 위해?

  관리의 편함을 위해?

  불필요할 정도의 강한 캡슐화가 필요 없어서?

  어쨌든 잘 사용 안 함.

  

 

 

 

 

 

 

귀여운 그림은 쭐어님이그리셨습니다.

반응형