JAVA 30강_익명 클래스

YEONG EUN LEE (Chloe)·2024년 1월 5일
0

JAVA 기초

목록 보기
35/42

익명 클래스 (Anoymous) :

  • Inner class로, 이름이 없는 클래스를 말하다.

  • 클래스 정의와 동시에 객체를 생성할 수 있다.

  • Interface, AbstractClass 모두 익명 클래스로 객체를 만들 수 있다.
    : 부모 클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다.
    오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만들 구현할 수 있다.

  • 이름이 없기 때문에 생성자도 가질 수 없다.

  • 인터페이스와 추상 클래스 내부의 모든 추상 메소드를 반드시 오버라딩 해야 함.

  • 마지막}(종료중괄호) 뒤에 종료; (세미콜론)을 꼭 넣어준다.

  • 외부에서 익명클래스의 멤버필드에는 접근 불가.

  • 익명클래스 내부에 기술가능한 static의 경우:

  1. static final로 선언한 상수(일반 변수 static은 불가)
  2. 외부 변수는 Effectively final나 final만 가능한다.
    Effecively final: 외부에 일반변수라도 값 변경이 전혀 안된 변수

익명 클래스를 사용하는 이유:
프로그램 내에서 한 번만 객체로 만드는 데 사용되는 클래스를 굳이 정의할 필요가 없기 때문
AWT, SWING, GUI, 이벤트 처리에 쓰임
외부에서 익명클래스의 멤버필드에 접근이 안되므로, 클래스 안에서 모두 처리되어야하는 경우만 익명 클래스를 사용한다.

형식:
new 부모클래스 이름(){
// 멤버선언 --> 익명클래스 기술
}

// 다른 방법
new 구현 인터페이스 이름() {
// 멤버선언 --> 익명클래스 기술
}

``
abstract class AnonyEx01Abstract{ // 추상클래스
public String s; // 멤버필드
public abstract void doSomething(); // 추상메소드 ---> 재정의를 하기 위해서
}

class ASub extends AnonyEx01Abstract{ // 상속받음
@Override
public void doSomething() {
System.out.println("ASub 클래스 doSomething()메소드 호출");
}
}

public class AnonyEx01Test { // 메인클래스

public static void main(String[] args) { // 메인메소드
	int aa = 5; // 지역변수 --> 같은 이름으로 멤버변수에서 이미 선언되었던 변수를 선언할 수 있음.
	final int AA = 7; // 지역상수
	
	AnonyEx01Abstract myClass = new ASub() { // 익명클래스는 외부에서 접근 불가
		private int a = 15; // 외부에서 접근 불가
		String s = "AnonymousClass";
		final int AA = 0; // 상수라는

// static fianl int AA = 0;
// static int st = 0;

		@Override
		public void doSomething() {

// aa = a+ aa; // 변수지만 상수처럼 한번도 변경되지 않아야 함.
super.doSomething();
System.out.println("내부 익명 클래스의 doSomething메소드");
System.out.println("s : " + s);
System.out.println("a : " + a);
System.out.println("aa : " + aa); // 외부변수도 끌어다 쓸 수 있음
System.out.println("AA : " + AA);
etcMethod(); // 형제관계 이거나 상속받은 부모의 메소드 이거나
}

		public void etcMethod() {
			System.out.println("기본 메소드입니다.");
		}
		
		
	};
	
	myClass.doSomething();

// myClass.etcMethod(); // 접근 불가 자식 메소드이므로
// aa = aa+15;
System.out.println("aa: "+aa);
System.out.println(myClass.s); // 추상클래스에 있는 s가 출력

}

}


0개의 댓글