인터페이스란?
인터페이스(Interface)는 객체 지향 프로그래밍에서 사용되는 중요한 개념으로, 클래스와 마찬가지로 데이터와 메소드를 정의하지만, 구현된 내용이 없는 추상적인 틀을 제공합니다. 인터페이스는 다른 클래스들이 구현해야 할 메소드들의 목록을 정의하며, 클래스 간의 계약(Contract)을 정의하는 데 사용됩니다.
즉, 인터페이스는 사전적인 의미로 두 장치를 연결하는 접속기를 말합니다.
인터페이스는 무엇이고 인터페이스르 왜 사용하는지 쉽게 이해하기 위해 이것이 자바다 책에서의 예시를 가져왔습니다.
- 객체 A가 인터페이스의 메소드를 호출하면, 인터페이스는 객체 B의 메소드를 호출하고 그 결과를 받아 객체 A로 전달해줍니다.
- 이렇게 중간에 인터페이스를 거치는 이유는 객체가 교체될때를 대비해서 입니다.
- 만약 객체 B가 객체 C로 교체된다고 하면 객체 A는 객체 B가 객체 C로 교체 된 것에는 관심이 없습니다. 그냥 인터페이스의 메소드를 사용하는 것 입니다.
- 이런 특성을 보니 생각나는 것이 하나 있습니다. 바로 다형성입니다!!
- 상속을 이용해서도 다형성을 구현할 수 있지만 인터페이스를 이용해서도 다형성을 구현할 수 있습니다!!!!
인터페이스와 구현 클래스 선언
인터페이스 선언
interface 인터페이스명 { ... } //default 접근 제한
public interface 인터페이스명 { ... } // public 접근 제한
public interface 인터페이스명 {
//public 상수 필드
//public 추상 메소드
//public 디폴트 메소드
//pulbic 정적 메소도
//private 메소드
//private 정적 모스드
}
구현 클래스 선언
public class B implements 인터페이스명 { ... }
객체 B를 인터페이스를 구현한 객체라고 합니다.
implements 키워드는 해당 클래스가 인터페이스를 통해 사용할 수 있다는 표시이며, 인터페이스의 추상 메소드를 재정의한 메소드가 있다는 뜻입니다.
변수 선언과 구현 객체 대입
인터페이스도 하나의 타입이므로 변수의 타입으로 사용할 수 있다. 인터페이스는 참조 타입에 속하므로 인터페이스 변수에는 객체를 참조하고 있지 않다는 뜻으로 null을 대입할 수 있습니다.
public interface PhoneControl {
public void turnOn();
}
PhoneControl pc;
PnoneControl pc = null; // 가능
public class SmartPhone implements PhoneControl {
@Override
public void turnOn(){
}
}
pc = new SmartPhone();
pc.turnOn(); //SmartPhone에 메소드
상수 필드
인터페이스는 public static final 특성을 갖는 불변의 상수 필드를 멤버로 가질 수 있습니다.
[ public static final ] 타입 상수면 = 값;
인터페이스에 선언된 필드는 모두 public static final 특성을 갖기 때문에 public static final을 생략하더라도 자동적으로 컴파일 과정에서 붙습니다.
추상 메소드
인터페이스는 구현 클래스가 재정의해야 하는 public 추상 메소드(abstract method) 멤버로 가질 수 있습니다. 추상 메소드는 리턴 타입, 메소드명, 매개변수만 기술되고 중괄호 {}를 붙이지 않는 메소드를 말합니다.
[ public abstract ] 리턴타입 메소드명(매개변수, ....);
디폴트 메소드
인터페이스에는 완전한 실행 코드를 가진 디폴트 메소드를 선언할 수 있습니다. 선언 방법은 클래스 메소드와 동일한데, 차이점은 default 키워드가 리턴 타입 앞에 붙어야 합니다.
[public] default 리턴타입 메소드명(매개변수, ...) { ... }
정적 메소드
인터페이스에는 정적 메소드도 선언이 가능합니다. 추상 메소드와 디폴트 메소드는 구현 객체가 필요하지만, 정적 메소드는 구현 객체가 없어도 인터페이스만으로 호출할 수 있습니다. 선언 방법은 클래스의 정적 메소드와 완전 동일합니다.
public을 생략하더라도 자동으로 컴파일 과정에서 붙습니다.
[public | private] static 리턴타입 메소드명(매개변수, ...) { ... }
정적 메소드 주의할 점
정적 메소드의 실행부를 작성할 때 상수 필드를 제외한 추상 메소드, 디폴트 메소드, private 메소드 등을 호출할 수 없다는 것입니다. 이 메소드는 구현 객체가 필요한 인스턴스 메소드이기 때문입니다.
private 메소드
인터페이스의 상수 필드, 추상 메소드, 디폴트 메소드, 정적 메소드 모두 public 접근 제한으 갖습니다. 이 멤버들은 선언할 때에는 public을 생략하더라도 컴파일 과정에서 public 접근 제한자가 붙어 항상 외부에서 접근이 가능합니다. 인터페이스 외부에서 접근이 불가능 한 private 메소드 선언도 가능합니다.
- private 메소드는 구현 객체가 필요합니다. 디폴트 메소드 안에서만 호출이 가능합니다.
- private 정적 메소드는 구현 객체가 필요 없습니다. 디폴트 메소드뿐만 아니라 정적 메소드 안에서도 호출이 가능합니다.
private 메소드의 용도는 디폴트와 정적 메소드들의 중복 코드를 줄이기 위함입니다.
인터페이스 예시
interface MyInterface {
// 상수필드
int MY_CONSTANT = 42;
// 추상 메소드
void abstractMethod();
// 디폴트 메소드
default void defaultMethod() {
System.out.println("Default method implementation");
}
// 정적 메소드
static void staticMethod() {
System.out.println("Static method implementation");
}
// private 메소드 (Java 9 이상)
private void privateMethod() {
System.out.println("Private method implementation");
}
// private 메소드를 사용하는 다른 메소드 (Java 9 이상)
default void usingPrivateMethod() {
System.out.println("Using private method:");
privateMethod();
}
}
public class InterfaceExample {
public static void main(String[] args) {
MyInterface myInterfaceImpl = new MyInterface() {
@Override
public void abstractMethod() {
System.out.println("Abstract method implementation");
}
};
myInterfaceImpl.abstractMethod();
myInterfaceImpl.defaultMethod();
MyInterface.staticMethod();
myInterfaceImpl.usingPrivateMethod();
}
}
출처
이것이 자바다
https://product.kyobobook.co.kr/detail/S000061695652
'JAVA 공부' 카테고리의 다른 글
중첩 선언과 익명 객체 (0) | 2023.08.20 |
---|---|
인터페이스에 대해(2) (1) | 2023.08.17 |
추상 클래스와 봉인된 클래스 (0) | 2023.08.14 |
상속에 대해(2) (0) | 2023.08.14 |
상속에 대해(1) (0) | 2023.08.13 |