인터페이스(Interface)
interface Printable {
void print(String doc);
}
일반적으로 인터페이스는 위와 같이 생겼다. 위의 void print 같이 몸체가 비어있는 메서드를 추상 메서드(Abstract Method)라고 한다. 인터페이스를 대상으로 인스턴스 생성이 불가능하기 때문에 구현(Implementation)을 통해 사용할 수 있다.
class Printer implements Printable {
public void print(String doc) {
@doSomething
}
}
아래는 인터페이스의 몇 가지 특징들이다.
class Robot extends Machine implements Movable, Runnable { ... }
한 클래스에 둘 이상의 인터페이스를 동시에 구현할 수 있고, 상속과 구현이 동시에 가능하다.
Printable print = new Printer();
인터페이스 타입을 대상으로 참조 변수의 선언이 가능하다.
class Printer implements Printable {
@Override
public void print(String doc) {
@doSomething
}
}
인터페이스의 추상 메서드와 이를 구현하는 메서드 사이에는 오버라이딩 관계가 성립한다.
따라서 인터페이스를 직,간접적으로 구현하는 클래스의 인스턴스를 참조할 수 있고, 참조 변수를 통해 정의된 추상 메서드를 호출할 수 있다. 추가로, 인터페이스를 구현한 클래스는 인터페이스에 존재하는 모든 추상 메서드를 구현해야 한다.
인터페이스에는 변수, 추상 메서드, 디폴트 메서드 static 메서드가 존재할 수 있다.
변수
인터페이스 내에 선언되는 변수는 반드시 선언과 동시에 초기화 해야 하고, 모든 변수는 public, static, final이 선언된 것으로 간주한다.
디폴트 메서드
interface Printable {
void print(String doc);
default void printCMYK(String doc) { ... }
}
java8부터 디폴트 메서드가 추가되었다. 디폴트 메서드는 자체로 완전한 메서드로, 구현 클래스가 오버라이딩 하지 않아도 된다.(오버라이딩이 가능하긴 하다)
디폴트 메서드는 보통 인터페이스에 추상 메서드를 추가해야하는 상황에서 기존 코드에 영향을 미치지 않기 위해 등장한 문법으로, 인터페이스 설계 시 디폴트 메서드를 정의하는 것은 잘못된 용법이다.
static 메서드
interface Printable {
void print(String doc);
static void printLine(String str) { ... }
}
Printable.printLine(...);
java8부터 인터페이스에도 static 메서드 정의가 가능하며, 호출 방법도 클래스의 static 메서드 호출 방법과 같다.
추상 클래스(Abstract Class)
public abstract class House {
public void methodOne() {
@doSomething
}
public abstract void methodTwo();
}
하나 이상의 추상 메서드를 갖는 클래스를 추상 클래스라고 한다. 추상 클래스는 클래스 선언부에 abstract 선언을 추가해야 한다. 인터페이스와 유사하게 추상 클래스 대상으로 인스턴스 생성이 불가능하며 다른 클래스에 의혀 메서드가 구현되어야 한다.
인터페이스 VS 추상 클래스
인터페이스와 추상 클래스는 추상 메서드를 사용한다는 공통점이 있어 유사해 보인다. 그럼 둘 사이의 차이는 무엇일까?
공통된 기능을 가지는 클래스들을 정의할 때, 인터페이스를 사용하여 구현한다면 공통된 기능을 계속 재정의 해야한다는 단점이 생긴다. 하지만 추상 클래스를 사용하여 공통된 기능을 정의 후, 상속한다면 추상 클래스에 정의된 메서드를 사용할 수 있게 된다.
따라서, 추상 클래스는 공통된 조상 클래스를 상속하고 조상 클래스의 메서드와 같은 기능이 필요한 경우, 인터페이스는 다른 조상 클래스를 상속하는데 같은 기능이 필요한 경우 사용하게 된다.
참조
윤성우의 열혈 JAVA 프로그래밍
https://myjamong.tistory.com/150
'JAVA > Java' 카테고리의 다른 글
[Java] Object 클래스 (0) | 2022.09.05 |
---|---|
[Java] JVM의 구조와 자바 컴파일 과정 (0) | 2022.09.03 |
[Java] 자바의 예외와 예외처리 (0) | 2022.08.31 |
[Java] 클래스의 상속 (0) | 2022.08.30 |
[Java] String vs StringBuilder vs StringBuffer (0) | 2022.03.17 |
댓글