<aside> 💡

추상클래스 → 추상클래스를 상속받는 자식클래스 → 자식클래스의 객체를 만들어서 사용

인터페이스 → 인터페이스를 구현하는 클래스 → 구현클래스의 객체를 만들어서 사용

</aside>

추상화

→ 자식 클래스들이 반드시 구현해야 하는 메서드가 있다면, 우리는 추상 메서드로 해당 메서드를 부모 클래스(추상클래스)에 선언해 둘 수 있다.

추상 클래스를 상속받은 모든 자식 클래스는 반드시 추상 메서드를 오버라이딩 및 재정의하여 구현해야 한다.

그렇지 않으면 컴파일 에러가 발생한다.

⇒ 추상클래스, 인터페이스 모두 직접 객체를 생성하는 것은 불가능 하다.


익명 클래스

→ 이름이 없는 클래스

→ 일회성으로 사용되는 클래스를 간단하게 정의할 수 있다

→ 인터페이스나 추상클래스의 구현을 간단하게 처리할 수 있다.

interface buttonClickListner {
	public void Click();
}

public class AnnonymousExample {
	//내부클래스 Button
	public class Button {
		//interface타입의 변수를 가짐
		//인터페이스의 구현체는 다 들어올 수 있다.
		private buttonClickListner listener;
		
		//멤버변수는 private로 지정하는 일이 많기 때문에 직접 접근하는 것이 불가능하다
		//public으로 된 메서드를 통해 접근을 하는 일이 많다
		//setter & getter로 접근
		
		public void setListener(buttonClickListner listener) {
			this.listener = listener;
		}

		public void Click() {
			if (listener != null) {
				this.listener.Click();
			}
		}
	}

	public static void main(String[] args) {
		//외부클래스의 객체
		AnnonymousExample exam = new AnnonymousExample();
		//내부클래스의 객체(외부클래스의 객체로부터 생성)
		AnnonymousExample.Button button = exam.new Button();
		
		//private라 직접접근이 안됨 (private buttonClickListner listener)
		//setter을 사용해서 받아가지고 private 변수에 넘겨주는 거
		//이 받은 값을 class를 만들어서 호출.
		//하지만 한번만 쓸 거 이기 때문에 이름없는 하나의 class를 생성. (익명클래스)
		button.setListener(new buttonClickListner() {		
			@Override
			public void Click() {
				System.out.println("버튼이 눌렸습니다");
			}
		}); // => 이름이 없는 ButtonClickListenr class의 역할을 한다

		button.Click();
		
	}
}