728x90

내부 클래스

내부 클래스란 클래스 내부에 중첩해서 만든 클래스이다.

클래스 내부에서 사용하기 위해 구현한 클래스이다.

주로 외부 클래스의 멤버 변수로 내부 클래스의 인스턴스를 생성하고, 외부 클래스의 생성자에서 내부 클래스를 생성한다.

내부 클래스 유형

이 중에서 중요한 내부 클래스는 익명 내부 클래스이다. 주로 어노니머스(Anonymous) 내부 클래스라고 하는데 안드로이드에서 많이 쓰인다고 한다.

 

코드를 보며 4가지 경우를 살펴보자.

package innerclass;

class OutClass{
	
	private int num = 10;
	private static int sNum = 20;
	private InClass inclass;
	
	//외부 클래스 생성자에서 내부 클래스 생성 가능
	public OutClass() {
		inclass = new InClass();
	}
	
	//인스턴스 내부 클래스
	class InClass{
		int iNum = 30;
		
		void inTest() {
			System.out.println(num);
			System.out.println(sNum);
			System.out.println(iNum);
		}
	}
	
	public void usingInner() {
		inclass.inTest();
	}
	
	//정적 내부 클래스
	static class InStaticClass{
		int inNum = 100;
		static int sInNum = 200;
		
		void inTest() {
			System.out.println(inNum);
			System.out.println(sInNum);
		}
		
		static void sTest() {
			// System.out.println(inNum); static이 아니면 불가능
			System.out.println(sNum); //외부 클래스의 static 변수
			System.out.println(sInNum);
		}
		
	}
	

}


public class InnerClassTest {

	public static void main(String[] args) {
		OutClass outclass = new OutClass();
		outclass.usingInner();
		
		OutClass.InClass outinclass = outclass.new InClass();
		outinclass.inTest();
		
		OutClass.InStaticClass sInClass = new OutClass.InStaticClass();
		sInClass.sTest();
		sInClass.inTest(); //static 메소드가 아니기 때문에 인스턴스 생성 후 호출
		
		OutClass.InStaticClass.sTest(); //static 메소드는 인스턴스 없이 호출 가능.
		
		
	}

}

인스턴스 내부 클래스와, 정적 내부 클래스이다.

정적 내부 클래스는 외부 클래스 생성과 동시에 생성되니

스태틱 메소드에선 스태틱 변수가 아닌 일반 변수는 사용할 수 없음을 주의하자.

 

 

package innerclass;

class Outer{
	
	int outNum = 100;
	static int sNum = 200;
	
	Runnable getRunnable(int i) {
		
		int num = 10;
		class MyRunnable implements Runnable{

			@Override
			public void run() {
				//num += 10; 지역 변수가 final로 상수화돼서 변경 불가
				System.out.println(outNum);
				System.out.println(Outer.sNum);
				System.out.println(sNum);
			}
			
		}
		return new MyRunnable();
	}
}

public class LocalInnerClassTest {

	public static void main(String[] args) {
		Outer out = new Outer();
		Runnable run = out.getRunnable(50);
		run.run();
	}

}

지역 내부 클래스

 

 

package innerclass;
class Outer2{
	
	int outNum = 100;
	static int sNum = 200;
	
	Runnable getRunnable(int i) {
		
		int num = 10;
		//익명 내부 클래스
		return new Runnable(){

			@Override
			public void run() {
				//num += 10; 지역 변수가 final로 상수화돼서 변경 불가
				System.out.println(outNum);
				System.out.println(Outer2.sNum);
				System.out.println(sNum);
			}
			
		};
	}
	
	Runnable runner = new Runnable() {
		
		@Override
		public void run() {
			System.out.println("Anonymous");
		}
	};
}
public class AnonymousInnerClassTest {

	public static void main(String[] args) {
		Outer2 out = new Outer2();
		out.runner.run();
		Runnable run = out.getRunnable(10);
		run.run();
		
		
	}

}

익명 내부 클래스 Runnable은 나중에 쓰레드 할 때 배운다고 한다. 아직은 무슨 개념인지 모르겠다.

728x90

'프로그래밍 > Java' 카테고리의 다른 글

[Java] 스트림(stream)  (0) 2020.02.06
[Java] 람다식  (0) 2020.02.06
[Java] 컬렉션(Collection) 프레임워크  (0) 2020.02.04
[Java] 제너릭(Generic)  (0) 2020.02.04
[Java] String, Wrapper 클래스  (0) 2020.02.04

+ Recent posts