익명 클래스

박주현·2022년 10월 20일
0

국비 공부

목록 보기
19/44

익명클래스란?

익명 클래스는 특이하게도 다른 내부 클래스들과 달리 이름이 없다. 클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한번만 사용될 수 있고 오직 하나이 객체만을 생성할 수 있는 일회용 클래스이다.

new 조상클래스이름() {
	// 멤버 선언
}

	또는
new 구현인터페이스이름() {
	// 멤버 선언
}

이름이 없기 때문에 생성자도 가질 수 없으며, 조상클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정희하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다. 오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다.

익명 클래스의 방법 예제

public class Java_bible {
	// 익명 클래스
	Object iv = new Object() {
		void method() {
			
		}
	};
	
	// 익명 클래스
	static Object cv = new Object() {
		void method() {
			
		}
	};
	
	// 익명 클래스
	void myMethod() {
		Object lv = new Object() {
			void method() {
				
			}
		};
	}
}

Bird 클래스의 자식 클래스를 Eagle이라는 이름의 중첩 클래스로 정의해서 사용하는 예제이다.

  • 기명 멤버 클래스 예제
package sec06;

public class Bird {			// Class의 예
	void move() {
		System.out.println("새가 움직인다~~~~");
	}

}

//public interface Bird {	// Interface 의 예
//	void move();	
//}

package sec06;

public class MemberDemo {
	// Member class 지점
	class Eagle extends Bird {
		@Override
		public void move() {	// Bird 클래스의 move()를 오버라이딩 한 메서드.
			System.out.println("독수리가 난다~~~");
		}

		public void sound() {	// Eagle class에 추가한 메서드.
			System.out.println("휘익~~~~");
		}

	} // Member class 끝나는 지점
	// MemberDemo 클래스의 멤버 필드.
	Eagle e = new Eagle();

	public static void main(String[] args) {
		MemberDemo m = new MemberDemo();
        // MemberDemo 클래스의 객체인 m의 멤버필드 e 객체의 move()와 
        // sound() 메서드를 호출한다
		m.e.move();
		m.e.sound();
	}

}
  • 익명 멤버 클래스 예제

package sec06;

public class Bird {
	void move() {
		System.out.println("새가 움직인다~~~~");
	}

}

package sec06;

public class Anonymous1Demo {
	// Anonymous1Demo 클래스의 멤버 필드이다.
	Bird eagle = new Bird() {
		// Bird 클래스의 move() 메서드를 오버라이딩한다.
		public void move() {
			System.out.println("독수리가 난다~~~");
		}

		// Bird 타입에 없는 메서드이므로 Bird 타입의 객체로는 접근할 수 없다.
		void sound() {
			System.out.println("휘익~~~");
		}
	};

	public static void main(String[] args) {
		Anonymous1Demo anonymous1Demo = new Anonymous1Demo();
		anonymous1Demo.eagle.move();		// 다형성으로 오버라이딩한 메서드를 호출한다.
		// anonymous1Demo.eagle.sound();		// a.e 객체가 Bird타입이므로 sound() 메서드를 호출할 수 없다.

	}

}
  • 기명 지역 클래스와 익명 지역 클래스를 비교한 코드
package sec06;

public class LocalDemo {

	public static void main(String[] args) {
		// **기명 지역 클래스**
		class Eagle extends Bird {
			public void move() {
				System.out.println("독수리가 난다~~~");
			}
		}

		Bird eBird = new Eagle();
		eBird.move();

		// **익명 지역 클래스**
		Bird bEagle = new Bird() {
			public void move() {
				System.out.println("독수리는 난다!!!");
			}

		};

		bEagle.move();

		// **일회용 익명 지역 클래스**
        // 참조변수를 부여하지 않고 일회용으로 사용 하는 응용법.
		new Bird() {
			public void move() {
				System.out.println("독수리는 난다날아!!!");
			}

		}.move();

	}

}
  • 또 다른 예제
package sec06;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class AnonymousComparator {
	public static void main(String[] args) {

		List<String> list = new ArrayList<>();
		list.add("Nope Hi");
		list.add("Hi");
		list.add("Nope");

		Comparator<String> cmp = new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				return o1.length() - o2.length();
			}

		};

		Collections.sort(list, cmp);
		System.out.println(list);

	}

}

다른 예제
// 더 간단하게 이용 가능.
public class Java_bible {
	public static void main(String[] args) {
		Button b = new Button("Start");
		b.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("ActionEvent occured!!!");

			}

		});

	}
}

0개의 댓글