- 인터페이스는 객체 사용 설명서 (공통API의 역할)
인터페이스의 메소드는 전부 abstract 메소드 (키워드 생략) - 자바7까지는 추상메소드만 선언가능했는데
자바8에서부터는 디폴드메소드, 정적메소드도 선언가능 - 코드수정없이 객체를 변경할 수 있다
> 동일기능의 구현객체를 새로만들고 선언부만 변경 가능 - 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출
- 인터페이스의 구현클래스에서 메소드를 작성할때 더 낮은 접근제한을 지정할수없음
(추상메소드는 디폴트로 public)
인터페이스 설계의 핵심은 선언부를 얼마나 추상화하여 작성할 것인가... - 인터페이스는 다중상속 가능
- 디폴트 메소드 필요성
- interfaceA 를 사용하다가 추가할 기능이 생겼을때 추상메소드를 추가하면 interfaceA 구현체에 모두 추가해줘야하는데
디폴트메소드는 추상메소드가 아니기 때문에 구현클래스에서 모두 작성해줄 필요가 없음
- 리턴타입 앞에 default 작성 - 인터페이스 vs 추상클래스
접근제한자 모두 public / 접근제한자 지정 가능
구현객체가 동일기능을 구현 / 핵심로직은 추상클래스에서 정의하고 달라지는 부분만 구현객체에서 작성
> 나중에 디자인패턴에서 쓰임 비교해보기
1번 - 3
2번 - 4
3번 -
public class Cat implements Soundable {
@Override
public String sound() {
return "야옹";
}
}
public class Dog implements Soundable {
@Override
public String sound() {
return "멍멍";
}
}
4번 -
public interface DataAccessObject {
void select();
void insert();
void update();
void delete();
}
public class OracleDao implements DataAccessObject {
public void select() {
sysout("OracleDB에서 검색")
}
public void insert() {
sysout("OracleDB에서 삽입")
}
public void update() {
sysout("OracleDB에서 수정")
}
public void delete() {
sysout("OracleDB에서 삭제")
}
}
public class MySqlDao implements DataAccessObject {
public void select() {
sysout("MySqleDB에서 검색")
}
public void insert() {
sysout("MySqleDB에서 삽입")
}
public void update() {
sysout("MySqleDB에서 수정")
}
public void delete() {
sysout("MySqleDB에서 삭제")
}
}
5번 -
Action action = new Action() {
public void work() {
sysout("복사를 합니다.");
}
};
'Language > Java' 카테고리의 다른 글
자바 커뮤니티2 - 상속 (0) | 2019.05.28 |
---|---|
자바 커뮤니티1 - Class (0) | 2019.05.22 |
Java 문자열 객체 (0) | 2018.08.04 |
Java 배열 선언, 초기화 (0) | 2018.08.04 |
Java 접근지정자 (Access Modifier) (0) | 2018.08.04 |