추상화
- 공통되는 특성을 추출하여 단순화 시키는 작업이다
- 이 과정을 통해 꼭 필요한 메서드를 만들어 규격화 시킬 수 있다.
- 추상 클래스를 만들고 싶을 때는 클래스를 만들때 abstract를 선택 해주면 된다

- 공통되는 기능을 배포시켜야 하는 경우에 추상클래스를 사용한다.
- 자식클래스에서 다 오버라이드를 사용하는 경우에 메서드의 내용은 필요 없으므로 코드블록을 지운다.
- 이 때 그냥 지우기만 하면 오류가 나므로 추상메서드라는 의미로 abstract를 넣어준다.
- 추상메서드는 추상클래스에서만 만들 수 있다.
- 추상메서드를 통해 꼭 구현할 메서드를 override 할 수 있다.
추상 클래스

- Mammal 이라는 추상클래스를 만들었다.

- Mammal 이라는 추상클래스를 상속 받는 Person을 만들었다
- 부모클래스에 매개변수가 있는 생성자가 존재하므로 생성자를 똑같이 만들어주어야 한다.
- 6 : 부모 생성자를 호출해서 받은 값을 부모에게 그대로 전달하는 역할을 한다
- name이라는 필드네임 선언을 안해줬지만 부모한테 있는 필드므로 내 것처럼 사용한다.
- 그래서 자식에게 없는 필드네임이지만 오류가 안생긴다.

- 추상클래스는 자식클래스만 객체화가 가능하다.
- 10 : 추상클래스 자체를 객체화 할 수는 없다.
추상메서드

- 추상클래스이다
- 5 , 6 : 추상메서드로 강제로 오버라이드 되는 메서드
- 8 : 일반메서드로 그냥 써도 되고 오버라이드 해서 써도 된다.

- Abs를 상속받은 Concrete라는 자식클래스이다
- 7 ~ 12 : 추상클래스를 상속하면 추상메서드를 반드시 오버라이드 해야한다
○ 그래서 꼭 만들어야 하는 메서드들은 추상메서드로 만들어준다
Interface 정의
- Interface는 서로 다른 요소들의 접점을 의미한다
- Java에서도 Interface는 객체 사용방법을 정의한다
- Interface도 추상화 메서드를 통해 공동작업 시 규격을 잡아주는 역할을 한다
- 추상클래스랑 비슷한 이유로 쓰이지만 다중 구현이나 다중 상속을 하고 싶을 때 interface를 사용한다.

- MouseEvent라는 interface를 만들어주었다.
- 5, 6, 7 : interface에서는 abstract을 안써도 기본적으로 추상메서드로 만들어 준다.
- 10 : interface에서 일반메서드를 사용하는 방법이다
- 17 : interface에서 static 메서드를 사용하는 방법이다

- Interface MouseEvent를 구현받은 Window 클래스
- 5 : interface는 상속받는게 아니라 구현받는 다고 해서 키워드가 implements로 쓰인다.

- interface와 추상클래스 차이점이다
- interface는 여러개의 interface 구현이 가능하지만 추상클래스는 1개만 상속받아 사용할 수 있다.
interface 다중구현

- interface는 다중 구현이 가능하다
- 여기서 점선은 구현 받는것을 의미한다


- KeyEvent라는 interface와 MouseEvent(다른 패키지에 있음)라는 interface

- 다중구현(MouseEvent , KeyEvent)을 받아 Window라는 클래스를 만들었다
- 3 : MouseEvent는 다른 패키지에 있는 interface이기 때문에 import문 사용됐다
- 두개의 interface를 구현 받아 반드시 오버라이드 해야하는 메서드가 다섯개이다.
interface 다형성

- 메서드 두개를 가지고 있는 Common interface.

- Common interface를 구현받는 CommonImpl라는 클래스 만들어줌
- 추상메서드를 오버라이드 해주었다.

- interface의 객체화는 불가능하지만 interface를 구현받은 클래스 객체화는 가능하다
- 16 : interface 다형성을 이용해 인터페이스를 구현한 클래스는 해당 인터페이스 형태에 들어갈 수 있다.
interface 익명객체

- 3 : 외부에서 Common interface를 가져와서 import문을 사용했다.
- 11 : 원래는 Common을 구현받는 클래스가 객체화 되어 들어간다.
- 하지만 Common은 interface이므로 객체화가 안되지만 객체화를 시켜줘야 하는 경우가 있다
○ 해당 인터페이스를 구현받는 클래스를 만드는 경우 : 여러군데에서 불러야 할 경우
○ 익명객체를 사용하는 경우 : 그냥 해당 클래스에 한번 부르는 경우
- 14대로 작성한다면 에러가 난다. 그러므로 아래와 같이 해줘야 한다.
○ 
○ 자동완성기능( ctrl + space )을 이용하면 그림처럼 뜨는데 여기서 Anonymous 타입을 선택하면
○ 
○ 이렇게 interface의 추상메서드들을 바로 오버라이드 할 수 있게 나온다
○ 이 것을 익명객체라고 하며 익명객체를 사용하면 인터페이스를 구현받는 클래스를 만들지 않아도 된다
○ 사실상 객체가 될 클래스(이름)가 없으므로 익명객체라고 한다
○ 한번만 사용하고싶을때 클래스가 아닌 익명객체를 이용한다
interface의 상속
- interface는 class와 달리 다중 상속 및 구현이 가능하다
- 인터페이스는 객체화가 안되기 때문에 클래스와의 상속이 불가능하다


- interface인 MouseEvent와 KeyEvent를 상속받는 Child interface


- MouseEvent와 KeyEvent를 상속받는 Child interface를 구현받았기 때문에 MouseEvent, KeyEvent, Child에 있는 메서드들 사용가능