2 minute read

내부클래스(Inner Class)

  • 핵심 1: 내부클래스도 외부클래스의 멤버 다! [1] 내부클래스 외에서 접근하는 경우 1.외부 클래스 인스턴스 생성
    outer o=new outer();
    

    2.접근하려는 내부클래스 유형에 따른 접근

  • 인스턴스 내부클래스인경우
outer.InstanceInner inst=o.new InstanceInner();

혹은

InstanceInner ii2=o.new InstanceInner();

로 간접접근!

  • static(클래스) 내부 클래스인 경우
StaticInner si=new StaticInner();

로 직접 접근! [내부클래스]

    package com.inner04;
    
	public class outer {
	class InstanceInner
	{
		int iv=100;
	}
	static class StaticInner
	{
		int iv=200;
		static int cv=300;
	}
	void myMethod()
	{
		class LocalInner
		{
			int iv=400;
		}
		LocalInner li=new LocalInner();
		System.out.println("li iv: "+li.iv);
		}
	}

[실행코드 1]

package com.inner04;

import com.inner04.outer.*;

public class InnerEx4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		outer o=new outer();
		/**
		 * 인스턴스클래스의 인스턴스 생성시,
		 * 외부 클래스의 인스턴스를 먼저 생성해야 함
		 * 
		 * 내부클래스도 외부클래스의 멤버이기 때문에
		 * 인스턴스 멤버변수처럼
		 * "외부 클래스 인스턴스.내부 클래스 참조변수 	내부클래스 인스턴스=~"로 접근!
		 */
		outer.InstanceInner ii=o.new InstanceInner();
		InstanceInner ii2=o.new InstanceInner();
		StaticInner si=new StaticInner();
	}

}

[2] 내부클래스 간 접근하는 경우 [소스코드]

package com.inner03;

public class InnerEx3 {

	private int outerIv=1;
	static int outerCv=2;
	int outerDv=3;
	class InstanceInner
	{
		/**
		 * 인스턴스 클래스는 외부클래스의 private 멤버도 접근 가능
		 */
		int iiv=outerIv;
		int iiv2=outerCv;
		int iiv3=outerDv;
		
		InstanceInner inst=new InstanceInner();
		StaticInner si=new StaticInner();
	}
	static class StaticInner
	{
		//int siv=outerIv; ->static 클래스 내부에서는 외부클래스의 인스턴스 멤버가 접근할 수 없음
		InnerEx3 ii=new InnerEx3();
		int siv=ii.outerIv;
		
		static int scv=outerCv;
		InstanceInner inst=ii.new InstanceInner();
		StaticInner sii=new StaticInner();
	}
	
	void myMethod()
	{
		int iv=10;
		final int LV=20;//JDK 1.8~: final 생략 가능
		
		class LocalInner
		{
			int liv=outerIv;
			int liv2=outerCv;
			//int liv3=lv;//->지역클래스를 감싸고 있는 근처 외부클래스의 경우, final이 붙은 변수만 접근 가능
			//JDK 1.8~: 에러 아님
			int liv3=LV;
			int liv4=outerDv;
		}
		LocalInner l=new LocalInner();
		System.out.println("LocalInner liv: "+l.liv+", liv2: "+l.liv2+", liv3: "+l.liv3+", liv4: "+l.liv4);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		InnerEx3 i=new InnerEx3();
		i.myMethod();
		StaticInner si=new StaticInner();
		System.out.println("StaticInner siv: "+si.siv);
		System.out.println("StaticInner InstanceInner inst var: "+si.inst.iiv);
	
	}

}

위의 코드처럼

1.내부 클래스 인스턴스를 생성하려는 영역이

  • 인스턴스 클래스인 경우 : 모두 직접 접근 가능!!

(1) 생성하려는 클래스가 인스턴스 클래스인 경우

InstanceInner inst=new InstanceInner();

(2) 생성하려는 클래스가 static 클래스인 경우

StaticInner sii=new StaticInner();

static 클래스인 경우 : static만 직접 접근 가능!! (1) 생성하려는 클래스가 인스턴스 클래스인 경우

InstanceInner inst=o.new InstanceInner();

(2) 생성하려는 클래스가 static 클래스인 경우

StaticInner sii=new StaticInner();

«정리»

class Outer
{
	InstanceInner
	{
		//Both can access directly!
		InstanceInner ii=new InstanceInner();
		StaticInner si=new StaticInner();
	}
	static StaticInner
	{
		//only static can access directly!
		StaticInner sii=new StaticInner();

		Outer o=new Outer();
		InstanceInner ii=o.new InstanceInner();
	}
}
public class Tester
{
	public static void main(String[] args)
	{
		Outer o=new Outer();//generate outer class instance
		//indirect access to instance inner class
		InstanceInner ii=o.new Outer();
		outer.InstanceInner ii2=o.new Outer();
		//direct access to static inner class
		StaticInner si=new StaticInner();
	}
}

Updated: