1) Nested Classes
클래스 안의 (멤버)클래스를 의미함.
1-0 Terminology
- OuterClass : 바깥의 클래스
- public, private만 선언가능함.
- InnerClass : NestedCalss but, non-static
- OuterClass의 모든 멤버변수를 가져올 수 있음 (private여도 상관없음)
- StaticNestedClass
1-1. Why Use Nested Classes?
- 클래스를 구조적으로 잘 묶을 수 있다.
- It increases encapsulation
- 클래스 A,B를 Top-level에 놔둔다면, B를 통해서 A의 멤버변수에 접근하고 싶을 때는 A의 멤버변수를 private으로 설정하면 안된다.
- 이것을 극복하기 위해서는, 클래스 B를 A 안에 놔둠으로써, A의 멤버변수를 private로 설정해도 접근할 수 있게 되고, 이것은 보안적으로 더 안전하다는 의미입니다.
- 그리고, B클래스 자체도 숨겨질 수 있다는 장점이 있음.
- It can lead to more readable and maintainable code
1-2. StaticNestedClass
-
OuterClass의 멤버변수나 메소드에 접근할 수 없음.
오직, object의 레퍼런스를 통해서 사용할 수 있기 때문이다.
-
그러니까 StaticNestedClass는 그냥 Top-level-class와 작동하는 형식이 똑같다고 생각하면됨.
사용예시
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
1-3. Inner Class
-
OuterClass와 직접적으로 연결될 수 있다.
-
because an inner class is associated with an instance, it cannot define any static members itself.
=> OuterClass의 인스턴스 단위로 innerclass를 조작할 수 있는데, 만약 innerclass의 스태틱멤버를 만들게 되면 인스턴스랑 연관되어야 한다는 뜻이기 때문에 성립하지 않는 것입니다.
-
local class와 anonymous class로 나눠질 수 있습니다.
사용예시
=> OuterClass의 인스턴스 단위로 조작해야만 합니다.
OuterClass.InnerClass innerObject = outerClassInstance.new InnerClass();
2-4. 사용예시
public class InnerClassTest {
private int id;
public InnerClassTest(int id){
this.id = id;
}
public static class StaticNestedClass {
int id;
public StaticNestedClass(int id){
this.id = id;
}
}
public class InnerClass {
int id;
public InnerClass(int id){
this.id = id;
}
public void print(){
System.out.println(id);
System.out.println(InnerClassTest.this.id); // Outer 클래스의 id를 들고올수있음.
System.out.println(this.id);
}
}
public static void main(String[] args){
InnerClassTest ict = new InnerClassTest(50);
InnerClass ic = ict.new InnerClass(40);
InnerClassTest.InnerClass ic2 = ict.new InnerClass(41);
// 두가지방법으로 선언이 가능한데 그냥 InnerClass로 하는게 더 직관적일듯?
StaticNestedClass snc = new InnerClassTest.StaticNestedClass(30);
ic.print();
System.out.println();
ic2.print();
}
}
40
50
40
41
50
41
1-5. Local Classes
-
block 안에 클래스가 정의된 형태
-
block : a group of zero of more statements between balanced braces
(can be used anywhere a single statement is allowed.)
- statements : unit of execution
- expression statements
- Assignment
- ++, –
- Method invocations
- Object creation
- declaration statements
- control flow statements
- expression statements
- statements : unit of execution
-
-
예를 들면 메소드 안에도 클래스를 정의할 수 있는데,
이렇게 정의하면 메소드의 파라미터들을 클래스 내에서 참조할 수 있다고 합니다.
-
어찌됬건 static member를 선언할 수 없기 때문에 inner class와 비슷합니다.