✋인터페이스
인터페이스
: 자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 인터페이스를 사용한다.
다형성
: public class MyClass extends SuperClass implements MyInterface
처럼 한 개 이상의 자료형 타입을 갖게되는 특성
- 클래스와 다르게 다중상속이 가능하다
- 쉽게 말하면 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 가이드라인이다.
👉 공통적인 규격(가이드라인)에 맞는 모듈을 개발하면
클래스 간의 의존관계와 유지보수성의 불편함 줄일수 있고 다형성을 갖추게 된다
인터페이스의 문법
public interface MyInterface {
String myConstant = "value";
public static final myStaticConstant = "value2";
(abstarct) void myMethod(String param1, ..);
default String myDefaultMethod(String param1, ..) {
...
}
static void myStaticMethod(String param1,..) {
...
}
}
interface
키워드로 선언하고, implements
키워드로 일반 클래스에서 구현한다
- JAVA8 이전에는
상수
, 추상메소드
만 선언 가능했지만 JAVA8 부터 디폴트메소드
, 정적메소드
선언도 가능해졌다.
- ✍
상수
: 인터페이스에서 값을 지정한다 (클래스에서 변경 불가능)
- ✍
abstract 메소드
: 인터페이스에서 함수명, 파라미터 타입과 개수, 반환 타입만 지정한다. body는 클래스에서 구현한다
- implements한 모든 클래스에서 abstract 메소드를 구현하지 않으면 에러가 발생한다.
- ✍
default 메소드
: 인터페이스에서 기본적으로 body까지 지정한다. 클래스에서 오버라이딩하여 다시 재구현 가능하다
- 구현체에 공통적으로 들어갈 코드를 default 메소드 body에 작성하여 반복되는 코드를 줄인다.
- 이미 운영되는 시스템에서 추가요건으로 반영해야할 경우 default 메소드를 선택적으로 사용가능하다.
- ✍
static 메소드
: 인터페이스에서 제공한다. (클래스에서 변경 불가능)
✋추상클래스
추상클래스
: 추상 메소드를 선언하여 상속을 통해 자손 클래스에서 완성하도록 유도하는 클래스이다
추상클래스의 문법
public abstract class AbstractClass {
private String name;
private String id;
public AbstractClass(String name, String id){
this.name = name;
this.id = id;
}
abstract void MyMethod1();
abstract void MyMethod2(int param);
}
✅ 추상 클래스 상속받기
public class RealClass extends AbstractClass {
private String number;
public RealClass(String name, String id, String number) {
super(name, id);
this.number = number;
}
@Override
void MyMethod1() {
...
}
@Override
void MyMethod2(int param) {
...
}
}
- 상속을 위한 클래스로
new
키워드로 객체를 생성할 수 없다.
- 추상클래스의 추상메소드는 body 부분이 없는 미완성 메소드이다. 상속받은 클래스에서 구현해야한다.
- 추상클래스를 상속받은 경우 추상메소드를 반드시 모두 구현해야한다. 하나라도 구현하지 않는다면 상속받은 클래스를 추상클래스로 지정해야한다.
abstract
키워드로 선언하고, extends
키워드로 일반 클래스에 상속한다.
✋추상클래스 VS 인터페이스
추상클래스
: IS - A
인터페이스
: HAS - A
- A,B 클래스에서 공통적으로 필요한 기능있다면 👉 추상클래스 C에서 일반 메소드를 작성하여 자식 클래스에서 사용한다
- 자바는 하나의 클래스만 상속 가능하므로 👉 A,B 클래스가 서로다른 추상클래스 C,D를 상속할 때, 공통된 기능이 필요할 경우 인터페이스 E를 implements 한다
A extends C implements E
B extends D implements E