Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Singleton
- Override
- 조건문
- 파라미터
- length
- 상속
- static
- symbol
- for문
- Java
- 생성자
- 변수
- private
- 형변환
- After effects
- Photoshop
- 메서드
- 클래스
- 배열
- switch문
- super
- expand
- do while문
- Overload
- 반복문
- 멤버변수
- if문
- while문
- illustrator
- Interface
Archives
- Today
- Total
Ms'Note
Anonymous Class의 이해와 사용 방법 본문
익명 클래스(=무명 클래스)
- 어떠한 인터페이스가 있고, 그 인터페이스를 이용하는 빈도수가 현저하기 적을 경우,
클래스를 새로 만드는 것은 낭비일 수 있다. - 이 경우에 일회성으로 사용하기 위한 클래스의 정의 방법이 익명 클래스이다.
인터페이스의 정의와 암묵적 형변환에 따른 객체 선언
- 인터페이스를 상속받는 클래스는 암묵적 객체 형변환의 조건에 따라 인터페이스에 대한 객체로 선언될 수 있다.
public interface MyInterface {
public void foo();
}
public class Foo {
public void myFunction() {
MyInterface my;
}
}
익명 클래스의 생성
- 인터페이스를 상속받는 별도의 클래스가 없는 상태이므로, 할당은 인터페이스 형식으로 이루어진다.
public class Foo {
public void myfunction() {
MyInterface my = new MyInterface();
}
}
- 하지만 인터페이스는 반드시 어딘가에 상속이 되어야만 사용이 가능하므로 상속된 '이름 없는 클래스'를
표현하기 위해 할당과 함께 클래스 정의를 위한 블록을 생성한다.
public class Foo {
public void myFunction() {
MyInterface my = new MyInterface() *{}*;
}
}
익명 클래스 안에서의 메서드 오버라이드
- 생성된 블록 안은 물리적으로는 Foo 클래스 안에 소속되어 있지만, 논리적으로는 어떤 이름 없는 클래스이다.
- 인터페이스를 상속받는 형태이기 때문에 블록 안에서는 인터페이스에 대한 메서드 재정의가 이루어져야 한다.
public class Foo {
public void myFunction() {
MyInterface my = new MyInterface() {
@Override
public void foo() {
System.out.println("Hello");
}
};
}
}
익명 클래스는 선언, 할당, 구현이 한 번에 이루어진다.
- 클래스의 정의 과정에서 이미 my 객체에게 모든 기능이 할당되었으므로, 바로 기능을 활용할 수 있다.
public class Foo {
public void myFunction() {
MyInterface my = new MyInterface() {
@Override
public void foo() {
System.out.println("Hello");
}
};
my.foo();
}
}
익명 클래스 사용의 제약
public class Foo {
private int value1 = 100; // 상위 클래스의 멤버변수
public void myFunction() {
int value2 = 200; // 상위 메서드의 지역변수
final int value3 = 300; // 상수 형태의 데이터
MyInterface my = new MyInterface() {
@Override
public void foo() {
// 상위 클래스의 멤버변수는 사용 가능
System.out.println(value1);
// 상위 메서드의 지역변수는 사용 불가 (에러 발생)
Systeom.out.println(value2);
// 상수 형태의 데이터는 사용 가능
System.out.println(value3);
}
};
}
}
'IT > JAVA' 카테고리의 다른 글
ClassPath (0) | 2020.09.01 |
---|---|
Package (0) | 2020.09.01 |
Inner Class의 사용 방법 (0) | 2020.08.27 |
Inner Class의 이해 (0) | 2020.08.27 |
SingleTon 객체 생성 과정 (0) | 2020.08.27 |
Comments