본문 바로가기
JAVA

16. 익명 클래스

by 김마리님 2020. 4. 13.

JAVA 코드를 적다보면 많은 이유로 오브젝트화 할 수 없는 코드들이 생긴다.

package ch13;

//규약
interface Animal{
	void move(); //추상 매서드 : 추상적이기 때문에 오브젝트가 될 수 없음
}

abstract class Person{
	abstract void eat();
}

public class AnomyEx01 {

	public static void main(String[] args) {
		//Animal a= new Animal(); //추상 메서드가 구현되지 않아서 new 불가
		//Person p=new Person(); //추상 매서드가 구현되지 않아서 new 불가
		//Person p2=new Person(); //추상 클래스는 추상 매서드가 들어올 수 있기 때문에 new 불가
		
	}
}

다음과 같이 인터페이스로 인해 추상화되어 매서드가 구현될 수 없는 경우,

추상클래스거나, 일반 클래스 내부의 추상 매서드의 경우도 추상적이기 때문에 매서드를 구현할 수 없으 new가 불가능해진다.

이런 경우는 다른 클래스를 통해서 간접적으로 매서드로 접근해야만한다.

 

이런 매서드들은 대체로 새 매서드를 만들어 오버라이딩 하는 경우가 많으나, 한번 사용할 매서드를 위해 클래스를 만들지 않기 위해 매서드를 호출하고, 바로 아래에 오버라이딩 할 수 있다.

package ch13;

interface Dog{
	void sound();
}

public class AnomyEx02 {
	
	static void Start(Dog d) {
		d.sound();
	}
	public static void main(String[] args) {
		Dog d=new Dog() {
			
			@Override
			public void sound() {
				// TODO Auto-generated method stub
				System.out.println("멍멍");
			} // 한번 쓰고 버릴거임
		};
		Start(d);
	}
}

 

 

추상 클래스 역시 마찬가지이다.

package ch13;

abstract class Ani{
	abstract void sound();
}

class cat extends Ani{
	@Override
	void sound() {
		// TODO Auto-generated method stub
		System.out.println("야옹");
	}
}

class bird extends Ani{
	@Override
	void sound() {
		// TODO Auto-generated method stub
		System.out.println("짹잭");
	}
}

class Fish extends Ani{
	@Override
	void sound() {
		// TODO Auto-generated method stub
		System.out.println("뻐끔");
	}
}

public class AnomyEx04 {
	static void start(Ani a) {
		a.sound();
	}
	public static void main(String[] args) {
		start(new cat());
		start(new Fish());
		start(new Ani() {
			
			@Override
			void sound() {
				// TODO Auto-generated method stub
				System.out.println("음메");
			} //오브젝트를 만들지 않고, 일회성으로 사용할때.
			//구현체가 동적일 때(음메, 뻐끔, 짹짹으로 계속 바뀜) 사용
		});
	}
}

 

코드를 자세히 보자. 동물의 울음소리를 출력하는 코드이다.

동물 울음소리를 굳이 한번씩만 불러낼거라면 굳이 클래스를 bird, cat .. 등등 새로 만들어낼 이유 없이 아래와 같이, 추상클래스를 매개변수로 두고, 내부에서 오버라이딩하는 형태를 취하면 된다.

 

이렇게 굳이 클래스의 이름을 정하지 않고, 클래스의 형태를 취하여 간접적으로 오버라이딩이 가능하도록 하는 것을 익명 클래스라고 한다.

반응형