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 클래스라고 말합니다.
    1. Outer클래스 입장에서는 Nested클래스가 static으로 선언되었기 때문에 외부에 선언된 클래스와 똑같이 생각합니다
  • Outer 클래스 : Inner 클래스를 보유하고 있는 클래스를 OuterClass라고 말합니다.

 

  • Inner 클래스 : OuterClass안에 선언된 InnerClass 처럼 클래스 안에 선언된 클래스를 말합니다!
    1. Outer 클래스의 인스턴스 생성 후에야 Inner 클래스 인스턴스 생성이 가능합니다.
    2. Inner 클래스내에서 Outer 클래스의 멤버에 직접 접근이 가능합니다.
    3. 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