일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- database
- hash table
- 자바
- dynamic programming
- 파이썬
- sorting
- Class
- Counting
- Binary Search
- Matrix
- 코딩테스트
- Stack
- 코테
- java
- two pointers
- Math
- Tree
- 구현
- Binary Tree
- Number Theory
- string
- bit manipulation
- greedy
- simulation
- SQL
- array
- Data Structure
- Method
- geometry
- implement
- Today
- Total
코린이의 소소한 공부노트
디폴트 메서드 본문
인터페이스는
1. 추상 메서드의 집합으로,
2. 부수적으로 상수, 디폴트 메서드, 스태틱 메서드를 선언할 수 있다.(jdk 1.8부터 적용)
interface A {
void method1();
void method2();
}
class B implements A{
public void method1() { }
public void method2() { }
}
abstract class C implements A{
public void method2() { }
}
- 어떤 클래스(B)가 인터페이스(A)를 구현할 경우, A에 선언된 모든 추상 메서드를 구현해야 한다. 만약 모든 메서드를 구현하지 않는다고 하면 추상 클래스(C)로 만들어야 한다.
- 이 상태에서 인터페이스(A)에 새로운 추상 메서드를 추가하게 되면
a. 일반 클래스(B)는 무조건 새 추상 메서드를 구현해야 한다.
-> 이러한 불편함을 없애기 위해 나온 해결책이 디폴트 메서드이다.
b. 추상 클래스(C)는 구현하지 않아도 된다.
// 인터페이스 A에 새 메서드를 추가할 때
1)
interface A {
void method1();
void method2();
void newMethod(); // 추상 메서드
}
2)
interface A {
void method1();
void method2();
default void newMethod() { } // 디폴트 메서드
}
[디폴트 메서드]
1. 인스턴스 메서드이다.
- 인스턴스 메서드는 객체 생성 후 사용이 가능한 메서드이다.
- iv 사용이 가능한 메서드이지만, 인터페이스에는 iv를 선언할 수 없다.
- 접근 제어자가 default인 메서드는 해당 인터페이스가 속한 패키지 내에서만 접근이 가능하다.
2. 모든 멤버가 public인 인터페이스 원칙에 위반된다.
- 하지만 인터페이스에 새 메서드가 추가될 때마다 해당 인터페이스를 구현한 모든 클래스에서 새 메서드를 구현하는 불편함을 없애기 위해 예외를 허용한 것이다.
3. 기존의 메서드와 충돌할 때 직접 오버 라이딩을 하거나, 아래 내용을 읽고 충돌 문제를 해결한다.
1) 여러 인터페이스의 디폴트 메서드 간의 충돌
- 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버 라이딩(덮어쓰기, 재정의)해야 한다.
2) 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
- 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
'Java' 카테고리의 다른 글
익명 클래스 (0) | 2022.05.19 |
---|---|
내부 클래스 (0) | 2022.05.19 |
인터페이스의 장점 (0) | 2022.05.13 |
인터페이스 선언, 상속, 구현 (0) | 2022.05.13 |
추상 클래스 작성하기 (0) | 2022.05.11 |