public class FileSequence implements IntSequence, Closeable {
// something...
}
위와 같이구현하면 FileSequence 클래스는 IntSequence 와 Closeable 을 슈퍼타입으로 둔다. (객체를 두 인터페이스 타입 중 어느 것으로도 변경할 수 있다는 말이다. 아주 활용도가 높다.)
Tips. 변수를 인터페이스 타입으로 선언할 수 있지만, 타입이 인터페이스 자체인 객체는 만들 수 없다. 모든 객체는 클래스의 인스턴스여야 한다.
-> FileSequence 클래스의 인스턴스를 만들어 IntSequence, Closeable 처럼 사용할 수 있지만, IntSequence 클래스의 인스턴스를 만들 수는 없다.
또한 객체는 실제 자신의 클래스나 해당 클래스의 슈퍼타입으로만 타입을 변환할 수 있다. 만약 잘못된 타입으로 캐스팅 하면, 컴파일 타임에서 오류나 런타임에서 클래스 캐스트 예외(ClassCastException)를 던진다
e.g
public interface IntSequence{
boolean hasNext();
int next();
}
public class DigitSequence implements InsSequence {
@override
public boolean hasNext() {
// ...
}
@override
public int next() {
// ...
}
}
public static void main(String[] args) {
IntSequence sequence = new DigitSequence(); // 업 캐스팅 ok
DigitSequence digits = (DigitSequence) sequence; // 다운 캐스팅 ok
String digitString = (String) sequence; // 컴파일 오류
// RandomSequence 가 InputSequence 를 구현했다면 정상 작동 아니라면 Throw ClassCastException
RandomSequence randomSequence = (RandomSequence) sequence;
}
instanceof 연산자는 레퍼런스 타입에만 사용할 수 있다
또한 같은 클래스일 때만 true 을 반환하는 것이 아니라, 슈퍼타입을 두고 있는 클래스의 인스턴스라면 모두 true 를 리턴한다. 반공변인셈이다.
'Kotlin & Java' 카테고리의 다른 글
람다식, 익명 함수, 일급 함수, 클로저 간단하게 알아보자 (0) | 2020.03.03 |
---|---|
인터페이스의 정적(static) 메서드와 기본(default) 메서드 (0) | 2020.03.02 |
중첩 클래스 와 내부 클래스 (부제 : ViewHolder 를 이너 클래스로 만들때는 왜 static class 로 만들까?) (0) | 2020.03.01 |
자주 사용하는 String 클래스 함수 (0) | 2020.02.29 |
자바 문자열 고찰 및 생각의 힘 (0) | 2020.02.28 |