[JAVA][패스트캠퍼스]내부 클래스

김주현·2021년 5월 1일
0

내부 클래스

  • 클래스 내부에 구현한 클래스 (중첩된 클래스)
  • 클래스 내부에서 사용하기 위해 선언하고 구현하는 클래스
  • 주로 외부 클래스 생성자에서 내부 클래스를 생성

내부 클래스 유형

인스턴스내부클래스, 정적내부클래스 예제

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=100;
		void inTest() {
			System.out.println(num);
			System.out.println(sNum);
		}
	}
	public void usingInner() {
		inClass.inTest();
	}
	
	//정적내부클래스
	//static은 OutClass의 생성여부와 상관없이 쓸수있다.
	//static 이너클래스안에는 static변수, static메서드 생성할 수 있음
	static class InStaticClass{
		int inNum=100;
		static int sInNum=200;
		
		void inTest() {
			System.out.println(inNum);
			System.out.println(sInNum);
			System.out.println(sNum);
		}
		
		static void sTest() {
			//inNum변수는 쓸수 없음(InStaticClass가 생성된 이후에 만들어진 변수라서)
			//static메서드에서는 static변수만 쓸수있음
			System.out.println(sInNum);
			System.out.println(sNum);
		}
	}
}
public class InnerTest {

	public static void main(String[] args) {
		OutClass outClass=new OutClass();
		outClass.usingInner();
		
		OutClass.InClass myInClass=outClass.new InClass();
		myInClass.inTest();
		
		System.out.println();
		
		OutClass.InStaticClass sInClass=new OutClass.InStaticClass();
		sInClass.inTest();
		
		OutClass.InStaticClass.sTest();
	}
}

지역 내부클래스 예제

package innerclass;

//지역내부클래스
class Outer{
	
	int outNum=100;
	static int sNum=200;
	
	//매개변수 i와 변수num은 모두 지역변수임
	//지역변수는 getRunnable메서드가 호출하고 끝날때까지만 유효함
	//이너클래스안에서는 변수가 아닌 상수
	Runnable getRunnable(int i) {
		
		int num=100;
		class MyRunnable implements Runnable{

			//Runnable을 이용하여 지역내부클래스선언
			@Override
			public void run() {
				//메서드 안에서 innerclass가 사용될 때는 지역변수를 변경할 수 없음
				//num += 10;
				//i=200;
				System.out.println(num);
				System.out.println(i);
				System.out.println(outNum);
				System.out.println(Outer.sNum);
			}
			
		}
		
		return new MyRunnable();
		
	}
}
public class LocalInnerClassTest {

	public static void main(String[] args) {
		//참조를 할수는 있으나 값을 변경할 수는 없음
		Outer outer=new Outer();
		Runnable runnable=outer.getRunnable(50);
		
		runnable.run();
	}
}

익명내부클래스 예제

package innerclass;
//익명 내부클래스
//이름이 없는 익명클래스
//인터페이스나 추상클래스는 new키워드를 이용하여 바로 생성을 할수 있음
class Outer2{
	
	int outNum=100;
	static int sNum=200;
	

	Runnable getRunnable(int i) {
		
		int num=100;
		return new Runnable(){

			//Runnable을 이용하여 지역내부클래스선언
			@Override
			public void run() {
				//메서드 안에서 innerclass가 사용될 때는 지역변수를 변경할 수 없음
				//num += 10;
				//i=200;
				System.out.println(num);
				System.out.println(i);
				System.out.println(outNum);
				System.out.println(Outer.sNum);
			}
			
		};
	}
	
	Runnable runner=new Runnable() {

		@Override
		public void run() {
			System.out.println("test");
		}
		
	};
}
public class AnonymousInnerClassTest {

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

0개의 댓글