내부 클래스(Inner classes)

✒️ 2025-05-23 17:20 내용 수정


클래스 안에 만들어진 또 다른 클래스

public class Outer {
	private String name;
	//...
	public class Inner { 
		private Stirng name;
		/// ..
	}
}

1. 인스턴스 클래스

외부 클래스의 인스턴스 멤버처럼 다루어지는 내부 클래스

public class Outer {
	private String name;
	//...
	// 인스턴스 클래스
	public class Inner { 
		private Stirng name;
		/// ..
	}
}
OuterClass outerInstance = new OuterClass();
Outer.Inner innerInstance = s.new Inner();
public class Outer {  
    private int outerValue = 10;  
  
    class Inner {  
        public void printOuter() {  
            System.out.println("outerValue = " + outerValue);  
        }  
    }  
  
    public void createInner() {  
        Inner inner = new Inner();  
        outerValue = 20;  
        inner.printOuter();  
    }   
}
public class Main {  
    public static void main(String[] args) {  
        Outer outer = new Outer();  
        Outer.Inner inner = outer. new Inner();  
        inner.printOuter();  
        outer.createInner();  
  
        outer.test();  
    }  
}
outerValue = 10
outerValue = 20

2. 정적 내부 클래스(Nested Class)

외부 클래스에서 객체화 없이 바로 사용할 수 있는 내부 클래스

public class Outer {
	private static String name;
	private int level;
	
	public static class Inner {
		public void test() {
			System.out.println("name: " + name);
			// 접근 불가 - 컴파일 에러
			// System.out.println("level: " + level);
		}
		
	}
}

Outer.Inner inner = new Outer.Inner();
inner.test();

3. 지역 클래스

외부 클래스의 메서드나 블록 내에서 선언되는 클래스

public Outer {
	public void test() {
		final String a = "test";
		class Inner {
			public void innerTest() {
				System.out.println("a = " + a);
			}
		}

		Inner inner = new Inner();
		inner.innerTest();
	}
}
public class Main {  
    public static void main(String[] args) {  
        Outer outer = new Outer();  
        outer.test();  
    }  
}
a = test

4. 익명 클래스

다른 내부 클래스와 달리 이름이 없는 내부 지역 클래스

❓) 상속, 다른 추상화 클래스랑 사용처가 어떻게 다를까, 얘들이 무슨 차이인걸까?
- 형식만 봐서는 그냥 클래스 객체를 선언한 것처럼 보이고 내부 지역 클래스같진 않은데..

✅) 기본적으로 상속, 인터페이스 구현을 쓴다!
- 특정 클래스나 인터페이스를 여러 번 기능별로 다 추가해서 쓰려고 했을 때, 
한 번 쓰고 버려지면 메모리가 너무 많이 든다
- 기능을 구현화한 개체를 생성하고, 사용했던 클래스는 버리는 방법
ClassName instanceName = new ClassName() {
// 메서드 선언
// @Override
}; //;이 붙었다!

InterfaceName instanceName = new InterfaceName() {
// 메서드 선언
// @Override
};

// className instanceName = new className(); 이랑은 다르다!