ITWILL학원 : 20강 JAVA BY 윤미영강사 1. 내부클래스(p363)
클래스가 서로 밀접한 관련이 있을때 객체생성없이 사용하기 용이하다
주로 이미 만들어진 내부클래스라이브러리를 사용.
공통점 : static 변수는 가질 수 없지만, final static 변수는 가질 수 있다.
만약 상수가 아닌 변수형태로 선언이 되어있다면 그건 앞에 final이 생략되어진 것임.
변수를 사용하고싶다면 차라리 외부클래스의 멤버변수로 선언하는 것이 낫다.
내부클래스의 종류 4가지 :
2. 인스턴스 내부클래스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public class InstanceInner { private int outerMember = 1 ; private void outerMethod () { Inner inner = new Inner(); inner.innnerMember = 11 ; inner.innerMethod(); } class Inner { int innnerMember = 10 ; static final int finalStaticMember = 20 ; private void innerMethod () { System.out.printf("out : %d, inner %d%n" , outerMember, innnerMember); } } public static void main (String[] args) { InstanceInner ilt = new InstanceInner(); Inner inner = ilt.new Inner(); inner.innerMethod(); } }
3. 지역클래스(local class)
내부클래스가 외부클래스의 메서드안에서 정의되어지는 것.
지역클래스는 단독으로 사용하지않고 내부에서 객체생성 후 호출해서 사용.
단독사용의 의미 : 직접 메서드를 불러와서사용,
지역클래스인 경우 메서드를 호출하는 순간 객채생성하고 바로 사용할 수 있게해야한다. 즉 단독사용처럼 직접 클래스이름을 불러 사용하는 것이 아니라 지역클래스가 속한 외부클래스메서드를 부르면서 그 속에 있는 클래스가 자동으로 사용되게끔 하는 것이다.
1 2 3 4 5 6 7 8 9 10 class OuterClass () { ... public methodA () { class InnerClass () { ... } } }
4. 익명클래스(p373)
인터페이스를 구현할 목적으로 사용.
실무에서 자주 사용.
익명클래스의 override는 인터페이스 규칙에 의해 public을 붙여줘야한다
익명클래스를 어떨때 사용할까?
독립적인 클래스 사용 : 인터페이스를 구현한 클래스를 여러번 사용할때 용이.Intf a는 언제어디서나 불러서 사용가능
익명클래스 사용 : 인터페이스를 구현한 클래스를 딱 한번 사용할때 용이. 익명클래스는 Intf b에서만 사용가능. 이름이 없기때문에 불러서 사용할 수 없다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 interface Intf { void methodInf () ; } class A implements Intf { @Override public void methodInf () { System.out.println("인터페이스 메서드 오버라이딩" ); } } public class test { public static void main (String[] args) { Intf a = new A(); a.methodInf(); Intf b = new Intf(){ @Override public void methodInf () { System.out.println("익명클래스로 인터페이스 메서드 오버라이딩" ); } }; b.methodInf(); } }
5. 내부클래스 예시 다양한 내부클래스를 생성한 뒤 main메서드로 호출해보자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 interface InfoPrintable { public void printInfo () ; } public class VariousInnerClassTest { public void useInnerClass (InfoPrintable inner) { inner.printInfo(); } public void useSpeakerTest () { class EngSpeaker implements InfoPrintable { @Override public void printInfo () { System.out.println("로컬 내부 클래스" ); } } useInnerClass(new InfoPrintable(){ @Override public void printInfo () { System.out.println("익명의 내부클래스" ); } }); useInnerClass(new EngSpeaker()); useInnerClass(new InstanceInnerClass()); useInnerClass(new SomeClass()); } class InstanceInnerClass implements InfoPrintable { @Override public void printInfo () { System.out.println("인스턴스 내부클래스 사용" ); } } public static void main (String[] args) { VariousInnerClassTest vt = new VariousInnerClassTest(); vt.useSpeakerTest(); } } class SomeClass implements InfoPrintable { @Override public void printInfo () { System.out.println("걍 상관없는 일반 클래스" ); } }