✍ 인터페이스
- 인터페이스는 클래스가 아니므로 선언 시 class 키워드 대신 interface 키워드를 사용한다
- 인터페이스는 추상메서드와 상수만 가질 수 있다.
--> 모든 메서드는 public abstract가 붙은 추상메서드로 취급된다(생략가능)
--> 모든 멤버변수는 public static final이 붙은 상수로 취급된다(생략가능)
- 추상클래스와 마찬가지로 객체 생성이 불가능하다. (추상메서드가 존재하기 때문)
--> 단, 참조변수 타입으로는 사용 가능하다. 즉, 다형성 활용(업캐스팅)이 가능하다.
- 추상메서드 구현을 강제하고, 변수를 상수로 강제하여 코드의 통일성이 향상된다.
--> 추상클래스와 유사하지만 추상클래스보다 더 강력한 강제성을 부여하는 것이 목적이다
(모든 메서드는 추상메서드이고, 모든 멤버변수는 상수이기 때문)
- 서브클래스에서 인터페이스를 상속받아 구현해야할 경우 extends가 아닌 implements 키워드를 사용한다
--> 클래스는 상속받아 확장(extends)의 개념이 강하지만
인터페이스는 상속받아 추상메서드를 구현(implements)하는 개념이 더 강하다.
- 클래스는 다중 상속이 불가능하지만, 인터페이스는 다중 구현이 가능하다.
--> 2개 이상의 부모 인터페이스로 부터 상속(구현)이 가능하다.
--> class 서브클래스명 implements 부모인터페이스1, 부모인터페이스2 ...................
- 단, 인터페이스끼리 상속받을 경우 extends 키워드를 사용한다.
✍
interface MyInterFace { // 인터페이스
public static final int NUM1 = 10; // 상수
int NUM2 = 20; // public static final 생략가능
public abstract void method1(); // 추상메서드
void method2(); // public abstract 생략가능
}
class MySubClass implements MyInterFace { // 인터페이스를 상속받아 구현하는 서브클래스
@Override
public void method1() { // 오버라이딩
System.out.println("서브클래스에서 구현한 추상메서드 method1()");
}
@Override
public void method2() { // 오버라이딩
System.out.println("서브클래스에서 구현한 추상메서드 method2()");
}
}
🔍 인터페이스 내부에는 추상메서드, 상수만 존재 가능하다.
🔍 멤버변수 앞 public statlc final, 추상메서드 앞 public abstract 는 생략 가능하다.
🔍 인터페이스를 상속받아 구현하는 서브클래스의 경우 extends가 아닌 implements 키워드를 사용한다.
🔍 인터페이스를 상속받는 경우 서브클래스에서 반드시 추상메서드의 오버라이딩이 필요하다
✍ 인터페이스 끼리의 상속
interface IHello { // 인터페이스
public void sayHello(String name);
}
interface IGoodBye { // 인터페이스
public void sayGoodBye(String name);
}
interface ITotal extends IHello, IGoodBye { // 인터페이스는 다중 상속 가능
public void greeting(String name);
}
🔍 만약 여기서 인터페이스 Itotal을 상속받는 서브클래스를 정의하면 어떻게 될 까? 현재, Itotal은 다중상속을 받은 상태.
✍ 인터페이스를 상속받는 서브클래스
class ISay implements ITotal {
@Override
public void sayGoodBye(String name) {}
@Override
public void sayHello(String name) {}
@Override
public void greeting(String name) {}
}
🔍 인터페이스끼리 상속을 받는 경우 implements가 아닌 extends 키워드를 사용해야 한다.
왜 그럴까?
인터페이스는 추상메서드만을 가질 수 있다. 즉, 부모 인터페이스를 상속받아 구현할 수 없다는 말이다.
그래서 클래스끼리의 상속에서 처럼 extends의 개념이 필요하다. 여기서 클래스와의 차이점은 인터페이스 끼리의 상속은
다중상속이 가능하다는 점이다. (클래스는 다중상속 불가)
그럼 왜 다중상속이 가능할까?
부모 인터페이스의 모든 메서드가 추상메서드이다. 그렇기 때문에 물려받은 메서드가 누구의 메서드인지 구분할 필요 없이, 서브 인터페이스도 추상메서드 형태로 보관하기 때문이다.
🔍 서브클래스에서 인터페이스를 상속받아 구현하기 위해서는 추상메서드를 오버라이딩 해야한다. 만약, 오버라이딩을
하지 않을 경우 서브클래스를 추상클래스화 해야한다.
🔍 그렇다면 왜 인터페이스를 사용하는 걸까? 인터페이스의 장점은 무엇일까?
✍ 구현의 강제성을 부여하여 코드의 통일성을 증가시킨다.
--> 인터페이스를 상속받은 서브클래스는 반드시 추상메서드를 구현해야한다.
✍ 모듈 교체의 용이
--> 부모 타입 인터페이스를 변수로 사용하여 각 서브클래스를 다룰 경우
특정 서브클래스가 또 추가되더라도 공통 코드의 변경이 필요없다. 새로운 클래스만 정의하게 되면
언제든지 인스턴스 교체를 통해 서브클래스를 다룰 수 있기 때문이다.
ex) JDBC 인터페이스 (Connection 등)를 통해 MySQL과 ORACLE 드라이버 교체만으로 각 DB를 동일한 방법으로 다룰 수 있다.
✍ 상속 관계가 없는 객체끼리의 관계를 부여하여 다형성 활용이 가능하다.
✍ 모듈간 독립적 프로그래밍으로 개발 기간을 단축시킬 수 있다.
'개발 > Java' 카테고리의 다른 글
[Java] 인터페이스의 장점 (0) | 2023.02.20 |
---|---|
[Java] Enum (0) | 2023.02.20 |
[Java] 추상 메서드 (0) | 2023.02.14 |
[Java] final 키워드 (0) | 2023.02.14 |
[Java] 다형성 (0) | 2023.02.11 |