인터페이스에 디폴트 메서드, static메서드 추가 가능(JDK1.8부터)
인터페이스에 새로운 메서드(추상 메서드)를 추가하기 어려움.
Ex) Object -> ..... -> 인터페이스 일 때,
interface ~~~ {boolean isfinished(추상메서드)}를 추가하려고 할 때, 인터페이스는 추상메서드를 추가하면 기존의 인터페이스를 구현하던 클래스에 새로운 추상메서드를 작성해야 한다.
해결책 -> 디폴트 메서드(default method)
디폴트 메서드는 인스턴스 메서드(인터페이스 원칙 위반)
- 인터페이스에 메서드를 추가하면, 무조건 추상메서드가 된다.
- 그런데, 추상메서드를 추가하면, 인터페이스를 구현한 클래스에도 다 적어줘야 하기 때문에
몸통이 있는 default method가 생겼다.
디폴트 메서드가 기존의 메서드와 충돌할 때의 해결책
- 여러 인터페이스의 디폴트 메서드 간의 충돌
- 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 해야 한다.
- 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
- 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
클래스 안의 클래스
class A { class A { // (B의) 외부 클래스 ... ... } -> class B { // (A의) 내부 클래스 class B { ... ... } } ... }
- 내부 클래스의 장점
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
- 코드의 복접성을 줄일 수 있다.(캡슐화)
- 내부 클래스가 없다면, B가 A의 객체를 생성해야 사용 가능
- 내부 클래스가 있다면, B가 A의 객체를 생성하지 않아도 A의 멤버에 접근 가능하다.
- class B가 class A 안에서만 사용된다면, 굳이 밖에 둘 이유가 없기 때문에 내부클래스로 만든다.
내부 클래스의 종류와 유효범위(scope)는 변수와 동일
class Outer { class Outer { int iv = 0; class InstanceInner {} static int cv = 0; <-> static class StaticInner {} void myMethod() { void myMethod() { int lv = 0; class LocalInner {} } } } }
- 왼쪽 코드 변수의 종류 : 1.iv 2.cv 3.lv
- 오른쪽 코드 변수의 종류 : 1.클래스 영역에 선언된 내부 클래스(=iv) 2.static내부클래스(=cv) 3.메서드 안에 지역변수처럼 선언된 내부클래스(=lv)
- 세 가지의 내부 클래스는 세 가지의 변수의 특징과 같다.
- iv = 클래스 내부에서 사용 가능 / Instance class = Outer 클래스 영역 내부에서 사용 가능
- cv = 클래스 내부에서 사용 가능 / staticInner = Outer 클래스 영역 내부에서 사용 가능 (staticInner는 Outer 객체를 생성하지 않고 사용 가능)
- lv = 메서드 내부에서 사용 가능 / LocalInner = 메서드 영역 내에서만 사용 가능
- 익명 클래스 = 딱 한번만 사용하고 안 쓰는 클래스가 있는데, 그런 경우에 클래스 선언을 해서 사용 후 안 쓴다. (=이벤트 처리에 사용)