이것이 자바다(개정판) 기반 정리
목차
- 인터페이스 역할
- 인터페이스와 구현 클래스 선언
- 상수 필드
- 추상 메소드
- 디폴트 메소드
- 정적 메소드
- private 메소드
- 다중 인터페이스 구현
- 인터페이스 상속
- 타입 변환
- 다형성
- 객체 타입 확인
- 봉인된 인터페이스
인터페이스 역할
인터페이스
- 사전적인 의미로 두 장치를 연결하는 접속기를 말한다.
- 자바에선, 서로 다른 두 객체를 연결하는 역할을 한다.
인터페이스 | 구현 객체 | |
객체 A | - 메소드 호출 -> <- 리턴값 - |
객체 B |
인터페이스 사용 이유
- 만약 객체B가 객체 C로 변경된다면, 인터페이스가 없이 객체끼리 직접 사용하는 경우 객체를 변경하는 작업이 추가로 필요하다.
- 인터페이스를 사용하면, 인터페이스 뒤편에 어떤 객체인지 신경쓸 필요가 없다.
- 그래서 다형성 구현에 주된 기술로 이용된다.
인터페이스와 구현 클래스 선언
인터페이스 선언
interface 인터페이스명 { ... } // default 접근 제한자
public interface 인터페이스명 { ... }
- class대신 interface 키워드를 사용한다.
- 접근제한자로 접근 제한할 수 있다.
구현 클래스 선언
- 인터페이스에 작성된 추상 메소드에 대한 실행 내용이 구현되어 있어야 한다.
- 다음과 같이 인터페이스를 구현하고 있음을 선언부에 명시해야 한다.
- implements : 해당 클래스가 인터페이스를 토앻 상용할 수 있다는 표시고, 인터페이스의 추상메소드를 재정의한 메소드가 있다는 뜻이다.
public class 클래스명 implements 인터페이스명 { ... }
변수 선언과 구현 객체 대입
- 인터페이스도 하나의 타입이므로, 변수 타입으로 사용할 수 있다.
- 참조 타입에 속하므로, 객체를 참조하고 있지 않다는 의미의 null을 넣을 수 있다.
interfaceName varName = new ClassName();
varName.methodName();
- className이 inmplements interfaceName으로 선언되지 않았다면, 변수에 대입할 수 없다.
- 인터페이스 변수에 구현 객체가 대입이 되었다면, 변수를 통해 인터페이스의 추상 메소드를 호출할 수 있게 된다.
- 인터페이스를 구현한 객체면, 교체해서 대입할 수 있다.
상수 필드
- 인터페이스에 선언된 필드는 모두 public static final 특성을 갖는다.
- 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.
- 상수명은 대문자로 작성하되, 서로 다른 단어로 구성된 경우 언더바로 연결하는 것이 관례다.
- 상수는 구현 객체와 관련 없는 인터페이스 소속이므로, 인터페이스로 바로 접근할 수 있다.
interfaceName.constName;
추상 메소드
- 인터페이스는 public 추상 메소드를 멤버로 가질 수 있다.
- public absctract를 생략해도, 컴파일 과정에서 자동으로 붙는다.
- 구현 객체는 추상 메소드의 실행부를 갖는 재정의된 메소드가 있어야 한다.
- 인터페이스의 추상 메소드는 기본적으로 public을 갖기 때문에, public보다 낮은 접근 제한으로 재정의할 수 없다.
[ public abstract ] returntype methodName(parameter, ...);
디폴트 메소드
[public] default returntype methodName(parameter, ..) {
}
- 인터페이스엔 완전한 실행코드를 가진 디폴트 메소드를 선언할 수 있다.
- 디폴트 메소드의 실행부엔 상수 필드를 읽거나 추상 메소드를 호출하는 코드를 작성할 수 있다.
- 디폴트 메소드는 구현 객체를 대입하고 나서 호출할 수 있다.
- 구현 클래스는 디폴트 메소드를 재정의할 수 있다. 이 경우 public을 반드시 붙여야 하고, default 키워드를 생략한다.
정적 메소드
[public | private] static returntype methodName(parameter, ...) {
}
- 정적메소드는 구현 객체가 없어도 인터페이스만으로 호출할 수 있다.
- public은 생략해도 컴파일 과정에서 자동으로 붙는다.
- 정적 메소드의 실행부에서 추상 메소드, 디폴트 메소드, private 메소드와 같이 구현 객체가 필요한 메소드는 호출할 수 없다.
private 메소드
- 인터페이스는 외부에서 접근 불가능한 private 메소드를 선언할 수 있다.
- private 메소드
- 구현 객체가 필요한 메소드
- 디폴트 메소드 안에서만 호출이 가능하다.
- private 정적 메소드
- 구현 객체가 필요 없는 메소드
- 디폴드 뿐 아니라 정적 메소드 안에서도 호출이 가능하다.
- 디폴트와 정적 메소드들의 중복 코드를 줄이기 위해 사용한다.
다중 인터페이스 구현
- 구현 객체는 여러 개의 인터페이스를 implements 할 수 있다.
public class className implements interface1, interface2 {
}
inferface1 varName1 = new className();
interface2 varName2 = new className();
인터페이스 상속
- 인터페이스도 다른 인터페이스를 상속할 수 있고, 클래스와 달리 다중 상속을 허용한다.
public interface childInterface extends parentInteface1, parentInterface2 {
}
- 자식 인터페이스의 구현 클래스는 자식 뿐 아니라 부모 인터페이스의 모든 추상 메서드를 재정의해야 한다.
- 구현 객체가 자식 인터페이스에 대입되면, 자식과 부모의 추상 메서드를 모두 호출할 수 있다.
- 구현 객체가 부모 인터페이스에 대입되면, 부모의 추상 메서드만 호출할 수 있다.
타입 변환
자동 타입 변환
- 구현 객체는 인터페이스 타입으로 자동 타입 변환된다.
- 부모 클래스가 인터페이스를 구현하고 있다면, 자식 클래스도 인터페이스 타입으로 자동 타입 변환될 수 있다.
강제 타입 변환
- 반대로 인터페이스 타입을 구현 클래스로 타입 변환하기 위해선 강제 타입 변환이 필요하다.
- 구현객체가 인터페이스 타입으로 자동 변환되면, 인터페이스에 선언된 메소드만 사용 가능하다.
- 구현 객체에만 있는 메소드를 사용하고 싶다면, 캐스팅 기호를 사용해 구현 객체 타입으로 강제 타입 변환해야 한다.
interfaceName varName = new className();
className cVarName = (className) varName;
다형성
매개변수의 다형성
- 매개변수 타입을 인터페이스로 선언하면, 메소드 호출 시 다양한 구현 객체를 대입할 수 있다. -> 자동 타입 변환
- 어떤 객체를 대입하느냐에 따라 메소드 실행 결과가 다르게 나오는 것이다.
ex)
public interface Vehicle {
void run();
}
public class Driver {
void drive(Vehicle vehicle) {
vehicle.run();
}
}
Driver driver = new Driver();
Bus bus = new Bus();
Taxi taxi = new Taxi();
driver.drive(bus);
driver.drive(taxi);
객체 타입 확인
if (인스턴스이름 instanceof 구현객체이름) {
}
- instanceof 키워드를 사용할 경우, 객체 타입을 확인할 수 있다.
봉인된 인터페이스
- Java 15부터 무분별한 자식 인터페이스 생성을 방지하기 ㅇ위해 봉인도딘 인터페이스를 사용할 수 있다.
public sealed interface InterfaceA permits InterfaceB { ... }
'프로그래밍 > JAVA' 카테고리의 다른 글
[Java] 중첩 선언과 익명 객체 (1) | 2023.10.04 |
---|---|
[Java] 상속 (0) | 2023.09.12 |
[Java] Static (0) | 2023.06.30 |
[JAVA] 클래스 (0) | 2023.01.14 |
[JAVA] 참조 타입 (2) | 2022.11.08 |