본문 바로가기

Wanna be a Programmer/Java Programming

Nested class


Nested Class 란?


class 내부 또는 메소드에 class를 정의할 수 있는데, 이를 nested(중첩) class라고 한다.



왜 Nested Class를 사용하는가?


- Logical group of classes

class A가 Class B에서만 사용될 경우, A를 B에 내장하여 유지하는 것이 바람직하다.

- Increased encapsulation

두개의 class A와 B에 대하여, A가 B의 private 멤버(field, method)에 접근할 필요가 있을경우, A를 B의 안에 만들면 B의 멤버들을 private으로 만들면서 A에서 접근할 수있게 된다. 또한, A 자신은 캡슐화상태로 외부로부터 보호된다.

- More readable, Maintainable code

class A가 Class B에서만 사용될 경우, A를 B안에 정의하면 정의된 곳과 사용하는 곳이 가까이에 있기때문에 가독성과 유지보수성이 좋아진다.



Nested Class의 종류

* static inner class → Outer Class의 static 멤버만 접근가능

ex) class Outer {

public static class Inner {

}

}


Inner는 Outer의 인스턴스가 아닌 클래스와 연결된다. 즉  Inner는 Outer의 클래스 명을 사용하여 접근한다. 그리고 static 메소드/변수 처럼 Inner는 Outer의 인스턴스 필드와 메소드를 사용할 수 없다


* non-static inner class → Outer Class의 static/instance 멤버 모두 접근 가능

ex) class Outer {

private int a;

class Inner {

public void go() {

System.out.println(a);

}

}

}


Inner는 Outer의 인스턴스와 연결된다. 즉, Inner의 인스턴스는 Outer의 인스턴스 안에만 존재할 수 있으며 이로 인해 Inner는 Outer의 인스턴스 필드와 메소드를 직접 사용할 수 있다. 또한, Inner는 인스턴스와 연관되어 있기 때문에 static member를 가질 수 없다. Inner의 인스턴스는 Outer의 인스턴스를 통해서만 생성이 가능하다.

만약 class inner가 static 클래스일 경우 접근 go메소드에서 변수 a 접근 불가능


* method block 내에 정의 → 같은 메소드에 선언된 final local변수만 접근 가능

ex) class Outer {

int k = 30;

public void go() {

final int j = 20;

class Inner {

public void come() {

System.out.println(j);

}

}

}

}


익명 클래스(Anonymous Class)

- 객체 생성가 정의를 동시에 하는 class

- 구문 :  Super s = new Super() → 부모 class(Interface)(type) 

void go() { 

----- 

}

}