내부 클래스 (inner Class) - 인스턴스 내부, 정적 내부 클래스

이진석·2022년 8월 18일
1
post-thumbnail

20220818

한 번에 끝내는 Java/Spring 웹 개발 마스터

inner Class


1) 인스턴스 내부 클래스

class OutClass {
	
	private int num = 10;
	private static int sNum = 20;
	private InClass inClass;
	
	public OutClass() {
		inClass = new InClass();
	}
	
	/*private*/ class InClass { // Private선언시 내부에서만 사용 가능!
		int iNum = 100;
		
		//static int sInNum = 500;는 사용할 수 없다. 정적 변수는 InClass내부에서 사용 불가능
		
		void inTest() {
			
			System.out.println("OutClass Num = " + num + " (외부 클래스의 인스턴스 변수)");
			System.out.println("OutClass sNum = " + sNum + " (외부 클래스의 Static 변수)");
			System.out.println("InClass uNum = " + iNum + " (내부 클래스의 인스턴스 변수)");
		}
	}
	
	public void usingClass() {
		inClass.inTest();
	}
}

public class InnerTest {
	
	public static void main(String[] args) {
		
		OutClass outClass = new OutClass();
		outClass.usingClass();
		
		//문법적으로는 가능하지만 잘 사용하지 않는 방식
		OutClass.InClass inner = outClass.new InClass();
		inner.inTest();
	}
}

  • 내부적으로 사용할 클래스를 선언하는 것이고, Private으로 사용하기를 권장한다고 한다.

  • Private으로 사용할 경우에는,
    OutClass.InClass inner = outClass.new InClass();
    inner.inTest();
    부분에서 오류가 나기 때문에 주의해야 한다.

  • Static 변수는 내부 클래스에서는 사용할 수 없다.


2) 정적내부 클래스

static class InStaticClass {
		
		int iNum = 100;
		static int sInNum = 200;
		
		void inTest() {
		//정적 클래스에서는 외부 클래스의 인스턴스 변수 사용 불가능 (외부와 상관없이 사용될수도 있기 때문)	
		//	System.out.println("OutClass Num = " + num + " (외부 클래스의 인스턴스 변수)");
			System.out.println("InClass uNum = " + iNum + " (내부 클래스의 인스턴스 변수)");
			System.out.println("OutClass sNum = " + sNum + " (외부 클래스의 Static 변수)");
			System.out.println("InClass sInNum = " + sInNum + " (내부 클래스의 Static 변수)");
		}
		
		static void sTest() {
		// 생성되지 않았을 수도 있기 때문에 내부 클래스의 인스턴스 변수 사용 불가능	
		//	System.out.println("InClass uNum = " + iNum + " (내부 클래스의 인스턴스 변수)");
			System.out.println("OutClass sNum = " + sNum + " (외부 클래스의 Static 변수)");
			System.out.println("InClass sInNum = " + sInNum + " (내부 클래스의 Static 변수)");
		}
	}

public class InnerTest {
	
	public static void main(String[] args) {
		
		OutClass.InStaticClass sInClass = new OutClass.InStaticClass();
		sInClass.inTest();
	}
}

  • 인스턴스 내부 클래스와는 다르게 정적 내부 클래스는 외부와 상관없이 생성되기 때문에, 외부의 인스턴스 변수를 사용 불가능하다.

  • 내부 클래스의 인스턴스 변수 또한, 정적 메소드에서는 생성이 되기 전에 실행이 될수도 있기 때문에 사용이 불가능하다는 것을 알게 되었다.

profile
혼자서 코딩 공부하는 전공생 초보 백엔드 개발자 / https://github.com/leejinseok0614

0개의 댓글