List 컬렉션 공부를 하다가 생소한 문법을 발견하였습니다. main 메서드 안에 Thread 객체를 생성하고 run() 메서드를 오버라이딩 하고 있습니다. 하지만 'VectorExample' 클래스가 Thread를 상속한다던가, 구현체도 아닌데 어떻게 메소드 오버라이딩이 가능한지 의문이 들었습니다.
public class VectorExample {
public static void main(String[] args) {
// Vector 컬렉션 생성
List<Board> list = new Vector();
// 작업 스레드 객체 생성
Thread threadA = new Thread() {
@Override
public void run() {
// 객체 1000개 추가
for (int i = 0; i <= 1000; i++) {
list.add(new Board("제목" + i, "내용" + i, "글쓴이" + i));
}
}
};
}
}
자세히 살펴보니 new Thread() 객체를 생성한 다음 중괄호{} 가 붙고 그 안에 Thread run() 메소드가 오버라이딩 된 것을 알 수 있었습니다. 바로 이것이 '익명 클래스' 입니다.
익명 클래스
익명 클래스는 이름이 없는 클래스 즉, 무명 클래스 입니다.
이름이 없다는 것은 나중에 다시 불려지지 않는다는 것으로, 프로그램에서 일시적으로 한 번만 사용되고 버려지는 객체라고 보면 됩니다.(일회용 클래스)
보통 오버라이딩을 위해서는 자식이 될 클래스를 만들고 부모 클래스로부터 상속(extends) 받거나 인터페이스를 구현할 클래스가 필요합니다. 하지만 익명 클래스는 클래스 정의와 동시에 객체를 생성할 수 있습니다.
따로 클래스 정의 없이 메소드 냉에서 바로 클래스를 생성해 인스턴스화 할 수 있으며, 클래스의 선언과 생성을 동시에 하기 때문에 단 한 번만 사용될 수 있고, 익명으로 정의된 클래스는 일회용으로써 사용되고 버려집니다.
// 부모 클래스
class Animal {
public String bark() {
return "동물이 웁니다";
}
}
public class Main {
public static void main(String[] args) {
// 익명 클래스 : 클래스 정의와 객체화를 동시에. 일회성으로 사용
Animal dog = new Animal() {
@Override
public String bark() {
return "개가 짖습니다";
}
}; // 단 익명 클래스는 끝에 세미콜론을 반드시 붙여 주어야 한다.
// 익명 클래스 객체 사용
dog.bark();
}
}
익명 클래스 사용 이유
왜 익명 클래스를 사용하는 걸까요?
- 프로그램 내에서 일시적으로(단발성으로) 한 번만 사용되어야 하는 객체일 경우
-> UI 이벤트 처리, 스레드 객체 등 (단발성 이벤트 처리) - 재사용성이 없고, 확장성을 활용하는 것이 유지보수에서 더 불리할 때
-> 비즈니스 로직이 정말 재각각이며, 재사용성이 전혀 없어 매번 클래스를 생성하는 비용이 더 많을 때
자바에서 확장성을 고려해서 코딩을 하고 설계를 하는 것도 중요합니다. 하지만, 최소한의 확장성이 성립되려면 어느 정도 유지보수에 대한 이점이 있어야 하는데, 오히려 확장성을 고려해서 설계 했다간 유지보수에서 더 불리한 경우가 있습니다.
그래서 만일 어느 메소드에서 부모 클래스의 자원을 상속받아 재정의하여 사용할 자식 클래스가 한 번만 사용되고 버려질 자료형이면, 굳이 상단에 클래스를 정의하기 보다는, 지역 변수처럼 익명 클래스로 정의하고 스택이 끝나면 삭제되도록 하는 것이 유지보수면에서나 프로그램 메모리 관리 면에서 이점을 얻을 수 있습니다.
익명 클래스 유의점
기존의 부모 클래스를 상속한 자식 클래스에서는 부모 클래스의 메서드를 재정의 할 뿐만 아니라 새로운 메서드를 만들어 사용할 수도 있다.
하지만 익명 클래스 방식으로 선언한다면 오버라이딩 한 메서드 사용만 가능하고, 새로 정의한 메서드는 외부에서 사용이 불가능 합니다.
// 부모 클래스
class Animal {
public String bark() {
return "동물이 웁니다";
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Animal() {
// @Override 메소드
public String bark() {
return "개가 짖습니다";
}
// 새로 정의한 메소드
public String run() {
return "달리기 ㄱㄱ싱";
}
};
dog.bark();
dog.run(); // ! Error - 외부에서 호출 불가능
}
}
출처
☕ 익명 클래스(Anonymous Class) 사용법 총정리
익명 클래스 (Anonymous Class) 익명 클래스는 내부 클래스(Inner class) 일종으로 단어 그대로 이름이 없는 클래스를 말한다. 익명, 이름이 없다는 것은 별로 기억되지 않아도 된다는 것이며, 나중에 다
inpa.tistory.com
https://limkydev.tistory.com/226
[Java] 익명객체(익명클래스)란? (이 글 하나로 한방에 정리!)
익명객체(익명클래스) 란? 이번시간에는 자바 익명객체(익명클래스)에 대해서 알아보도록 하겠습니다. 익명객체(익명클래스) 말그대로.. 이름이 없는 객체? 클래스?,,,그래서 무명클래스라고도
limkydev.tistory.com
'Java > 기초문법' 카테고리의 다른 글
[Java] 컬렉션 자료구조 - Set 컬렉션 (0) | 2024.09.16 |
---|---|
[Java] 컬렉션 자료구조 - List 컬렉션 (0) | 2024.09.16 |
[Java] Java를 통해 계산기 만들기(2) (0) | 2024.09.09 |
[Java] Scanner 클래스와 메서드 (0) | 2024.09.05 |
[Java] Java 통해 계산기 만들기(1) (0) | 2024.09.04 |