자바 인터페이스란?
자바에서 인터페이스란 상수와 추상 메서드(abstract)의 집합이며 모든 멤버가 public으로 구현되어 있습니다. 추상 메서드의 집합인만큼 클래스가 상속받아 구현하여 사용할 수 있도록 틀만 제공 하며, 사용을 강제 하거나, 인터페이스의 추상 메서드를 사용하도록하여 각 클래스들의 변경을 용이하게 대처할 수 있습니다.
1. 인터페이스 선언 및 구현
아래와 같은 형태로 인터페이스를 구현할 수 있으며 상수와 추성 메서드로 이루어져 있습니다.
인터페이스의 메서드는 사용을 강제하기 때문에 구현부를 작성하여 사용해야 하며, 만약 인터페이스에게 상속 받았지만 메서드를 구현하지 않는 경우 이클립스에서는 "The type classTest must implement the inherited abstract method interfaceTest.method()" 라고 알려줍니다.
// 인터페이스
public interface interfaceTest {
// 상수
public static final int num = 0;
// 추상 메서드
public abstract void method();
}
// 인터페이스 상속
public class classTest implements interfaceTest {
public static void main(String[] args) {
classTest c = new classTest();
c.method();
}
// 상속받은 메서드 구현
public void method() {
System.out.println("hi");
}
}
2. 클래스 상속 vs 인터페이스 상속
- 클래스 상속 : 모든 클래스는 Object의 후손 입니다.
- 인터페이스 상속 : 인터페이스는 Object의 후손이 아니며, 인터페이스만 부모 관계를 가질 수 있습니다.
- 클래스 상속 : 클래스는 다중 상속을 할 수 없습니다.
- 인터페이스 상속 : 인터페이스는 다중 상속을 가질 수 있습니다.
일반적으로 다중 상속의 문제점은 만약 다중 상속을 받는다면 A 부모와 B 부모의 선언부가 같고, 구현부가 다른 메소드가 있다면 어떤 부모의 메소드를 가져가서 사용해야할지 등의 오버라이딩에서의 문제가 발생 했기 때문에 사용할 수 없도록 되었습니다.
하지만 인터페이스의 경우 A부모와 B부모의 선언부가 같더라도 구현부가 없는 추상 메서드이기 때문에 문제될것이 없어 다중 상속이 허용되어 있습니다.
3. 인터페이스와 다형성
인터페이스에서도 다형성을 사용할 수 있습니다. 단, 인터페이스를 참조 타입으로 할 경우 인터페이스에 선언된 추상 메서드만 구현하여 사용 가능 합니다.
또한 아래 코드와 같이 추상 메서드에 선언된 매개변수 타입을 인터페이스로 넣을 경우, 인터페이스를 구현한 클래스의 인스턴스만 사용할 수 있도록 강제할 수 있습니다.
public interface interfaceTest {
// 상수
public static final int num = 0;
// 추상 메서드
public abstract void method(interfaceTest i);
}
public class classTest implements interfaceTest {
public static void main(String[] args) {
// 다형성 사용 가능
interfaceTest i = new classTest();
// 인터페이스가 구현된 객체 인스턴스를 매개변수로 전달
i.method(new classTest());
}
@Override
public void method(interfaceTest i) {
System.out.println("polymorphism");
}
}
4. 인터페이스의 장점
- 인터페이스는 객체간의 연견을 돕는 중간 역할을 합니다.
- 선언과 구현을 분리시켜 사용할 수 있습니다.
- 다른곳에서 변경을 하더라도 인터페이스의 추상메서드는 변경되지 않습니다. 때문에 유연한 설계가 가능합니다.
- 표준화가 가능해집니다.
- 서로 관계가 없는 클래스들을 인터페이스를 상속함으로써 관계를 맺어줄 수 있습니다.
'Programming > JAVA' 카테고리의 다른 글
[JAVA] 자바 예외 처리 (Java Exception) (0) | 2022.05.24 |
---|---|
[JAVA] 자바 HashMap Null이 아닌 값 꺼내기 (0) | 2022.05.20 |
[JAVA] 자바 참조형 매개변수 이해하기 (java reference type parameter) (0) | 2022.05.08 |
[JAVA] intellij Run 비활성화 시 해결 방법 (2) | 2022.04.12 |
[JAVA] intellij에서 Spring 실행 시 finished with non-zero exit value 1 에러 해결 방법 (0) | 2022.04.05 |