Programing Language/Java

[Java] 익명 클래스(Anonymous Class)

vinedpillar 2022. 7. 10. 14:00

익명 클래스(Anonymous Class)

  • 익명 클래스는 내부 클래스의 일종으로 이름이 없는 클래스를 뜻하며 무명 클래스라고도 합니다.

  • 익명 클래스는 클래스의 재사용을 고려하지 않고 일시적으로 사용하기 위해 만들어지는 클래스입니다.

  • 명시적으로 클래스를 선언하지 않기 때문에 클래스의 인스턴스를 쉽게 생성할 수 있는 장점을 가지고 있습니다.

  • 익명 클래스는 필드, 로컬 변수, 매개 변수로 주로 사용됩니다.

  • 익명 클래스는 특정 클래스를 상속하거나 인터페이스를 구현해야만 생성할 수 있습니다.
    • 익명 자식 클래스: 클래스를 상속하여 익명 클래스를 생성하는 경우입니다.
    • 익명 구현 클래스: 인터페이스를 구현하여 익명 클래스를 생성하는 경우입니다.

 

 

 

익명 자식 클래스

  • 익명 자식 클래스는 부모 클래스를 상속받아 생성됩니다.

  • 익명 클래스로부터 생성된 인스턴스는 부모 타입의 필드, 메서드를 갖게 됩니다.

  • 익명 클래스 인스턴스는 부모 타입에 선언된 멤버만 접근 가능하기 때문에 생성되는 필드와 메서드는 생성된 블럭 안에서만 사용할 수 있습니다.
익명 자식 클래스 생성 방법

new 부모생성자(매개변수, ... ) {
    // 필드
    // 메서드
}
익명 자식 클래스 활용 예시

// 부모 클래스 생성
public class RandomNumber {
    public void grantNumber() {
    	System.out.println("임시 번호를 부여합니다.")
    }
}

public class Student {
    // 필드값에 익명 자식 클래스 대입
    private RandomNumber rn1 = new RandomNumber() {
    	@Override
        public void grantNumber() {
        	System.out.println("여기서 번호 부여 로직을 만들거나 수정할 수 있습니다.")
        }
    };
        
    // 익명 자식 클래스를 사용하는 메서드 선언
    public void raffleNumber1() {
    	rn1.grantNumber();
    }
    
    // 메서드의 로컬 변수에서 사용
    public void raffleNumber2() {
    	RandomNumber rn2 = new RandomNumber() {
        	@Override
            public void grantNumber() {
            	System.out.println("추첨에 알맞는 번호를 부여");
            }
        };
        rn2.grantNumber();
    }
    
    // 메서드의 매개변수에서 사용
    // 실행 클래스에서 익명 자식 클래스 선언
    public void raffleNumber3(RandomNumber randomNumber) {
    	randomNumber.grantNumber();
    }
}

public class StudentExample {
    public static void main(String[] args) {
    	// 인스턴스 생성
        RandomNumber rn = new RandomNumber();
        
        // 익명 자식 클래스가 생성된 메서드 호출
        rn.raffleNumber1();
        
        // 익명 자식 클래스 인스턴스가 대입된 메서드 사용
        rn.raffleNumber2();
        
        // 매개변수로 사용된 클래스의 익명 자식 클래스 생성 후 대입
        rn.raffleNumber3(new RandomNumber() {
        	@Override
            public void grantNumber() {
            	System.out.println("매개 변수에 인스턴스를 생성하면서 클래스 내용 변경");
            }
        });
    }
}

 

 

 

 

익명 구현 클래스

  • 익명 구현 클래스는 인터페이스를 구현하여 생성됩니다.

  • 익명 클래스로부터 생성된 인스턴스는 인터페이스의 필드, 추상 메서드를 구현하게 됩니다.

  • 익명 클래스 인스턴스가 인터페이스로부터 구현한 필드와 메서드는 생성된 블럭 안에서만 사용할 수 있습니다.

  • 익명 구현 클래스는 안드로이드와 같은 UI 프로그램에서 이벤트를 처리하는 객체로 활용됩니다.
익명 구현 클래스 생성 방법

new 인터페이스() {
    // 필드
    // 메서드
}
익명 자식 클래스 활용 예시

// 인터페이스 생성
public interface RandomNumber {
    // 추상 메서드
    void grantNumber();
}

// 구현 클래스 생성
public class Student {
    // 필드값에 인터페이스형의 변수 생성 및 익명 구현 클래스 대입
    private RandomNumber rn1 = new RandomNumber() {
    	@Override
        public void grantNumber() {
        	System.out.println("여기서 번호 부여 로직을 만들거나 수정할 수 있습니다.")
        }
    };
        
    // 익명 구현 클래스를 사용하는 메서드 선언
    public void raffleNumber1() {
    	rn1.grantNumber();
    }
    
    // 메서드의 로컬 변수에서 사용
    public void raffleNumber2() {
    	RandomNumber rn2 = new RandomNumber() {
        	@Override
            public void grantNumber() {
            	System.out.println("추첨에 알맞는 번호를 부여");
            }
        };
        rn2.grantNumber();
    }
    
    // 메서드의 매개변수에서 사용
    // 실행 클래스에서 익명 구현 클래스 선언
    public void raffleNumber3(RandomNumber randomNumber) {
    	randomNumber.grantNumber();
    }
}

public class StudentExample {
    public static void main(String[] args) {
    	// 인스턴스 생성
        RandomNumber rn = new RandomNumber();
        
        // 익명 구현 클래스가 생성된 메서드 호출
        rn.raffleNumber1();
        
        // 익명 구현 클래스 인스턴스가 대입된 메서드 사용
        rn.raffleNumber2();
        
        // 매개변수로 사용된 클래스의 익명 구현 클래스 생성 후 대입
        rn.raffleNumber3(new RandomNumber() {
        	@Override
            public void grantNumber() {
            	System.out.println("매개 변수에 인스턴스를 생성하면서 클래스 내용 변경");
            }
        });
    }
}