인터페이스 정의하는 방법
인터페이스(interface)는 일종의 추상클래스입니다.
우선, 추상클래스(abstract class)에 대해 간략하게 살펴보겠습니다.
추상클래스(abstract class)란? → 미완성 설계도 → 인스턴스 생성불가 → 미완성 메서드(추상메서드)를 포함하고 있는 클래스 → 생성자가 있으며, 멤버변수와 메서드도 가질수 있음. |
abstract class 클래스이름{
....
}
추상클래스는 앞에 'abstract'를 붙이기만 하면, 이 클래스를 사용 할 때 abstract를 보고 이 클래스에는 추상메서드가 있으니 상속을 통해서 구현해주어야 한다는 것을 알 수 있습니다.
인터페이스는 클래스를 작성하는 것과 같지만,class 대신 interface를 사용하고, 접근제어자로 public 또는 default만 사용할 수 있습니다.
interface 인터페이스이름{
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수목록); // abstract 생략가능
}
또한 인스페이스 멤버들은 몇가지 제약 사항이 있습니다.
→ 모든 멤버변수는 public static final이어야 하며, 이를 생략 할 수 있습니다. → 모든 메서드는 public abstract 이어야 하며, 이를 생략 할 수 있습니다. (단, static메서드와 디폴트 메서드는 예외(JDK1.8부터) |
인터페이스의 장점
→ 개발시간을 단축시킬 수 있습니다. → 표준화가 가능합니다. → 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있습니다. → 독립적인 프로그래밍이 가능합니다. |
인터페이스의 상속
인터페이스는 클래스와 달리 Object클래스와 같은 최고 조상이 없고, 인터페이스로부터만 상속 받을 수 있습니다.
또한 클래스와 달리 다중상속, 여러개의 인터페이스로부터 상속을 받는 것이 가능합니다.
자손 인터페이스는 조상 인터페이스에 정의된 멤버를 모두 상속받습니다.
인터페이스 구현하는 방법
인터페이스도 추상클래스처럼 그 자체로는 인스턴스를 생성할 수 없습니다.
추상클래스가 상속을 통해 추상메서드를 완성하는 것 처럼 인터페이스도 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야하는데, 그 방법은 추상클래스가 자신을 상속받는 클래스를 정의하는 것과 다르지 않습니다.
다만, 인터페이스는 extends 키워드가 아닌 implements 키워드를 사용합니다.
class 클래스이름 implements 인터페이스이름{
// 인터페이스에 정의된 추상메서드를 모두 구현해야 합니다.
// extends는 하나의 클래스만 상속받을 수 있지만,
// implements는 여러개의 interface를 상속받을 수 있습니다.
}
인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
1. 인터페이스를 만들어줍니다.
public interface InterfaceTest {
public void print();
}
2. 일회성 구현체
public class ImplementMain{
public static void main(String[] args) {
InterfaceTest it1 = new InterfaceTest() {
@Override
public void print() {
System.out.println("Hello World_InnerType");
}
};
it1.print();
}
}
3. 재사용이 가능한 구현체
public class ImplementMain{
public static void main(String[] args) {
ImplementsClass2 it3 = new ImplementsClass2();
it3.print();
}
}
class ImplementsClass2 implements InterfaceTest {
@Override
public void print() {
System.out.println("Hello World_ImplementsClass2");
}
}
4. 인터페이스는 다중구현이 가능합니다. (다만, 인터페이스들 내부의 메서드들은 서로 공유하지 않습니다.)
public class ImplementMain{
public static void main(String[] args) {
InterfaceTest it2 = new ImplementsClass1();
it2.print();
Runnable r1 = new ImplementsClass1();
r1.run();
}
}
class ImplementsClass1 implements InterfaceTest, Runnable {
@Override
public void print() {
System.out.println("Hello World_ImplementsClass1");
}
@Override
public void run() {
System.out.println("Hello World_run");
}
}
인터페이스의 기본 메소드 (Default Method), 자바 8
추상클래스는 정상기능이 있는 메서드에 추상메서드를 포함하는 것 처럼,
자바 8부터는 추상메서드만 있어야하는 interface에 정상기능을 수행하는 메서드를 추가할 수 있습니다.
(반환타입 앞에 default를 기재해주어야 합니다.)
인터페이스 구현시에 추상메서드는 오버라이딩이 필요하지만,
Default Method는 오버라이딩을 하지 않아도 되고, 호출시 인터페이스에 정의된 기능을 수행합니다.
필요시, 오버라이딩해서 기능을 바꿀 수 도 있습니다.
사용법
public interface InterfaceTest {
public void print();
public default void defaultPrint() {
System.out.println("default!");
}
}
public class ImplementMain{
public static void main(String[] args) {
InterfaceTest it1 = new InterfaceTest() {
@Override
public void defaultPrint() {
System.out.println("Inner_default!");
}
};
it1.defaultPrint();
}
}
인터페이스의 static 메소드, 자바 8
dafault와 비슷하지만, static 메서드는 오버라이딩을 할 수 없습니다.
사용은 무조건 interface를 참조하여서 사용됩니다 (인터페이스이름.static메서드이름)
public interface InterfaceTest {
public static void staticPrint() {
System.out.println("static!");
}
}
public class ImplementMain{
public static void main(String[] args) {
InterfaceTest.staticPrint();
}
}
인터페이스의 private 메소드, 자바 9
private 메서드는 자바 9에서부터 사용이 가능합니다.
메서드 body가 있고, abstract가 아니며, static이거나 non-static 일 수 있습니다.
구현클래스와 인터페이스가 상속되지않고, 인터페이스에서 다른 메소드를 호출 할 수 있습니다.
private는 private, abstract, default 또는 static 메서드를 호출 할 수 있습니다.
private static은 static 및 static private 메소드만 호출 할 수 있습니다.
public interface InterfaceTest {
public void print();
public default void defaultPrint() {
System.out.println("default!");
privatenonstaticPrint();
}
public static void staticPrint() {
System.out.println("static!");
privatestaticPrint();
}
private static void privatestaticPrint() {
System.out.println("private_static_print");
}
private void privatenonstaticPrint() {
System.out.println("private_non_static_print");
}
}
<reference>
자바의 정석 저자 남궁 성
'Challenge' 카테고리의 다른 글
10주차 과제: 멀티쓰레드 프로그래밍 (0) | 2021.01.23 |
---|---|
9주차 과제: 예외 처리 (0) | 2021.01.15 |
7주차 과제: 패키지 (0) | 2021.01.02 |
6주차 과제: 상속 (0) | 2020.12.26 |
5주차 과제: 클래스 (0) | 2020.12.19 |
댓글