강의 수강 중 작성한 노트에서 내용을 발췌, 이응수 강사님 강의 의 노트와 이미지를 참조하고 있습니다.
스스로 이해를 위해 직접 쓴 문장들의 경우 정확성이 떨어질 수 있다는 점 참고 부탁드립니다.
public static final
키워드를 생략할 수 있다.public abstract
키워드를 생략할 수 있다.implements
인터페이스명
implements
인터페이스명1, 인터페이스명2...
public interface SampleInterface1 {
public static final int MAX_UPLOAD_FILE_SIZE = 1024*1024*10; // 상수를 표함할 수 있다.
int MAX_ONCE_UPLOAD_FILES = 5; // public static final을 생략할 수 있다.
public abstract void saveFile(String directory, String filename); // 추상메소드 포함 가능
void downloadFile(String directory, String filename); // public abstract 생략 가능
}
public interface SampleInterface2 {
void copy(File src, File dest);
void copy(InputStream src, OutputStream dest);
}
// 구현 클래스에서 인터페이스 구현하기
💡 자식객체의 접근제한자 또한 재정의가 가능한데, 부모객체의 접근제한자와 같거나, 더 느슨해야 한다.
💡 자주 보는 인터페이스
Serializable : 직렬화 할 수 있는 인터페이스
Comparable : 비교 가능한 인터페이스
이런 인터페이스들을 보면 그 객체가 어떤 기능을 가지고 있는지 알 수 있다.
- 인터페이스: 추상메소드를 보유
- 추상클래스: 인터페이스의 추상메소드 중, 하위 구현클래스들에서 구현내용이 전부
공통된 일부 기능만 구현메소드로 재정의
한다. 나머지 추상메소드들은 구현클래스가 재정의하게 된다.- 구현클래스: 상위 추상클래스의 추상메소드들을 각 객체마다 다른 구현내용으로 재정의
⇒ 많은 클래스들이 이런 구성을 활용한다.
인터페이스를 구현하는 클래스의 형변환
그중 하나의 부모 인터페이스 타입
의 참조변수
와 구현 클래스
를 연결한다면참조변수
+ 인자값을 받는 생성자메소드
또는참조변수
+ Setter메소드
💡 객체지향 설계 5원칙 SOLID는 인터페이스와 아주 밀접한 연관을 가진다.
- SRP(Single Responsibility Principle): 단일 책임 원칙
- OCP(Open Closed Priciple): 개방 폐쇄 원칙
- LSP(Listov Substitution Priciple): 리스코프 치환 원칙
- ISP(Interface Segregation Principle): 인터페이스 분리 원칙
- DIP(Dependency Inversion Principle): 의존 역전 원칙
클래스가 인터페이스에 의존하게 만들면, 클래스와 인터페이스를 구현한 클래스들 간에는 느슨한 결합이 형성된다.
꼭 모든 것을 느슨한 결합으로 프로그래밍을 해야하는 것은 아니다. 업무 케이스에 따라 다를 것이다. 하지만 언제, 왜 이런 방식의 구현이 필요한지 알아야 한다.
- 자바라이브러리는 어떤 경우에도 사용할 수 있도록, 객체를 직접 수정할 필요 없도록 느슨한 결합으로 만들어져 있다.