Java
[Java] Inner && Outer Class
꽃달린감나무
2022. 2. 6. 16:30
728x90
class OuterClass{
private String myName;
private int num;
OuterClass(String name){
myName = name;
num = 0;
}
public void whoAreYou() {
num++;
System.out.println(myName + "OUterclass" + num );
}
static class NestedClass{
NestedClass(){
System.out.println("Hi");
}
}
class InnerClass{
InnerClass(){
whoAreYou();
}
}
}
public class InnerClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
OuterClass out1 = new OuterClass("First");
OuterClass out2 = new OuterClass("Second");
out1.whoAreYou();
out2.whoAreYou();
OuterClass.InnerClass Inn1 = out1.new InnerClass();
OuterClass.InnerClass Inn2 = out2.new InnerClass();
OuterClass.InnerClass Inn3 = out1.new InnerClass();
OuterClass.InnerClass Inn4 = out1.new InnerClass();
OuterClass.InnerClass Inn5 = out2.new InnerClass();
OuterClass.NestedClass Nes = new OuterClass.NestedClass();
}
}
- Nested 클래스 : static으로 선언된 Inner클래스를 Nested 클래스라고 말합니다.
- Outer클래스 입장에서는 Nested클래스가 static으로 선언되었기 때문에 외부에 선언된 클래스와 똑같이 생각합니다
- Outer 클래스 : Inner 클래스를 보유하고 있는 클래스를 OuterClass라고 말합니다.
- Inner 클래스 : OuterClass안에 선언된 InnerClass 처럼 클래스 안에 선언된 클래스를 말합니다!
- Outer 클래스의 인스턴스 생성 후에야 Inner 클래스 인스턴스 생성이 가능합니다.
- Inner 클래스내에서 Outer 클래스의 멤버에 직접 접근이 가능합니다.
- Inner 클래스의 인스턴스는 자신이 속한 Outer 클래스의 인스턴스를 기반으로 생성됩니다.
OuterClass out1 = new OuterClass("First");
OuterClass out2 = new OuterClass("Second");
위 코드를 통해 OuterClass의 인스턴스인 out1, out2가 생성됩니다.
OuterClass.InnerClass Inn1 = out1.new InnerClass();
OuterClass.InnerClass Inn2 = out2.new InnerClass();
OuterClass.InnerClass Inn3 = out1.new InnerClass();
OuterClass.InnerClass Inn4 = out1.new InnerClass();
OuterClass.InnerClass Inn5 = out2.new InnerClass();
아래 코드를 통해 Inner클래스의 인스턴스들은 다음과 같이 존재하게 됩니다.
out1 인스턴스 안 : Inn1, Inn3, Inn4
out2 인스턴스 안 : Inn2, Inn5
이런 형식으로 존재하다 보니 위 코드의 결과값도 아래와 같이 out1.num의 마지막 값은 4가 out2.num의 마지막 값은 3이 됩니다.
FirstOUterclass1
SecondOUterclass1
FirstOUterclass2
SecondOUterclass2
FirstOUterclass3
FirstOUterclass4
SecondOUterclass3
- Inner 클래스로 인한 효과
- 클래스들을 논리적으로 묶는 수단
- 캡슐화가 증가
- 코드의 가독성이 향상, 유지보수성 증가
밀접한 관계에 있는 두 클래스를 Outer 클래스와 Inner클래스로 묶게되면, 코드를 분석할 때 두 클래스의 관계 파악이 쉬워집니다. 또한 관계로 묶이다 보니 캡슐화도 증가하게되는 거죠. 그리고 해당 클래스에서 오류가 발생했으면 캡슐화된 부분만을 통해서 유지보수를 하면 되니 유지보수성도 증가하게됩니다.
728x90