내포 클래스 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);
}
* 정적 내포 클래스의 객체 생성은 비교적 정상적인 모습이다.
많이 사용하지 않는 내포 클래스
* 내포 클래스가 거의 사용되지 않는 거 같음.
파일 하나에 클래스 하나를 추구하는 듯.
* 가독성을 높이기 위해?
관리의 편함을 위해?
불필요할 정도의 강한 캡슐화가 필요 없어서?
어쨌든 잘 사용 안 함.
귀여운 그림은 쭐어님이그리셨습니다.
'자바 JAVA' 카테고리의 다른 글
[JAVA]자바 - 상속과 컴포지션 (5) | 2021.07.26 |
---|---|
[JAVA]자바 - 싱글톤 패턴 Singletone Pattern (0) | 2021.07.15 |
[JAVA]자바 - getter와 setter (0) | 2021.07.04 |
[JAVA]자바 - 생성자 Constructor (0) | 2021.07.03 |
[JAVA]자바 - 다형성 Polymorphism (1) | 2021.06.30 |