시작하며
여러분 안녕하세요!
DreamHanks의 254cm입니다.
이번에는 익명의 내부 클래스에 대해 설명해 보겠습니다.
Java의 전체 기사는 여기를 클릭해 주세요.
이전 기사는 [Java 개발] 제28회 Stream API에 대해서 배워 봤습니다.
익명의 내부 클래스란?
이전 기사에서 다룬 인터페이스와 추상 클래스는 인스턴스 생성이 불가능합니다.
인스턴스를 생성하기 위해서는 각 추상 메서드를 실장하는 클래스를 만들고,
그 클래스를 통해서 인스턴스를 생성할 뿐이었습니다.
하지만 익명의 내부 클래스를 이용하면 인스턴스를 생성하는 것과 비슷한 효과를 낼 수 있습니다.
익명의 내부 클래스는 클래스의 인스턴스를 생성할 때 생성할 수 있으며,
일회용 아이 클래스라고 이해하면 됩니다.
익명의 내부 클래스 작성법
1 2 3 |
데이터형 변수명 = new 데이터형() { 처리 } |
위와 같이 상속받고자 하는 부모 클래스 인스턴스를 생성한 후 익명 내부 클래스를 정의합니다.
샘플
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class AnonymousClassSample { public static void main(String[] args) { SuperClass superClass1 = new SuperClass() { @Override public void print() { System.out.println("overrided"); }; }; SuperClass superClass2 = new SuperClass(); superClass1.print(); superClass2.print(); } } class SuperClass { public void print() { System.out.println("text"); } } |
위의 샘플과 같이 익명내부 클래스를 생성하여 부모클래스의 메서드를 오버라이드합니다.
실행 결과
1 2 |
overrided text |
익명의 내부 클래스 활용 샘플
샘플 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class AnonymousClassSample { public static void main(String[] args) { AbstractSample abstractSample = new AbstractSample() { String b = "a is "; @Override public void print() { System.out.println(b+a); } }; abstractSample.a = 10; abstractSample.print(); } } abstract class AbstractSample { public abstract void print(); int a; } |
위와 같이 익명 내부 클래스에서 추상 메서드를 정의하여 사용합니다.
클래스의 인스턴스를 생성하여 사용하는 것과 동일한 효과를 낼 수 있습니다.
실행 결과
1 |
a is 10 |
샘플 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 AnonymousClassSample { public static void main(String[] args) { AbstractSample abstractSample = new AbstractSample() { String b = "Item : "; @Override public void print(String item) { System.out.println(b + item); } @Override public int operate(int a, int b) { return a+b; } }; abstractSample.print("apple"); System.out.println(abstractSample.operate(3, 9)); } } interface AbstractSample { public void print(String item); public int operate(int a, int b); } |
인터페이스의 경우에도 추상 메서드를 익명 내부 클래스로 오버라이드하면 인스턴스 생성이 가능합니다.
실행 결과
1 2 |
Item : apple 12 |
샘플 3
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 |
public class AnonymousClassSample { public static void main(String[] args) { AbstractSample abstractSample = new AbstractSample() { String b = "Item : "; @Override public void print(String item) { System.out.println(b + item); support(); } @Override public int operate(int a, int b) { return a+b; } public void support() { System.out.println("test"); } }; abstractSample.print("apple"); System.out.println(abstractSample.operate(3, 9)); abstractSample.support(); System.out.println(abstractSample.b); } } interface AbstractSample { public void print(String item); public int operate(int a, int b); } |
익명 내부 클래스에서 새로 만든 필드나 메서드는 외부에서 접속할 수 없으며,
익명 내부 클래스에서만 사용할 수 있습니다.
샘플 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class AnonymousClassSample { public static void main(String[] args) { anonymous(new AbstractSample() { @Override public int operate(int a, int b) { return a*b; } }); } static void anonymous(AbstractSample a) { System.out.println(a.operate(3, 4)); } } interface AbstractSample { public int operate(int a, int b); } |
위와 같이 인터페이스나 추상 클래스를 인수로 하는 메서드에 익명 내부 클래스를 전달할 수 있습니다.
끝으로
이번 기사는 이상입니다.
다음 시간에는 Thread를 배워 보겠습니다.
방문해 주셔서 감사합니다.
コメント