![[JAVA] 인터페이스 - 다중 인터페이스, 상속, 타입 변환, 다형성](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMHvvv%2FbtrVuBcYEQ1%2FsbwXLaAK4AuKNaaTKope90%2Fimg.jpg)
본 게시글은 이것이 자바다(저자 : 신용권)의 책과 유튜브 영상을 참고하였고, 개인적으로 정리하는 글임을 알립니다.
다중 인터페이스 구현
구현 객체는 여러 개의 인터페이스를 implements 할 수 있다.
구현 객체가 인터페이스 A와 인터페이스 B를 구현하고 있다면, 각각의 인터페이스를 통해 구현 객체를 사용할 수 있다.
구현 클래스는 다음과 같이 인터페이스 A와 인터페이스 B를 implements 뒤에 쉼표로 구분해서 작성해, 모든 인터페이스가 가진 추상 메서드를 재정의해야 한다.
인터페이스 A와 인터페이스 B를 구현한 객체는 다음과 같이 두 인터페이스 타입의 변수에 각각 대입될 수 있다.
A 인터페이스에 3개의 추상 메서드가 있고, B 인터페이스에 2개의 추상 메서드가 있다면 인터페이스 A 변수에 대입된 객체는 3개의 메서드밖에 사용 못하고, 인터페이스 B 변수에 대입된 객체는 2개의 메서드밖에 사용할 수 없다.
인터페이스 상속
인터페이스도 다른 인터페이스를 상속할 수 있으며, 클래스와 달리 다중 상속을 허용한다.
다음과 같이 extends 키위드 뒤에 상속할 인터페이스들을 나열하면 된다.
자식 인터페이스의 구현 클래스는 자식 인터페이스의 메서드뿐만 아니라 부모 인터페이스의 모든 추상 메서드를 재정의해야 한다.
그리고 구현 객체는 아래와 같이 자식 및 부모 인터페이스 변수에 대입될 수 있다.
구현 객체가 자식 인터페이스 변수에 대입되면 자식 및 부모 인터페이스의 추상 메서드를 모두 호출할 수 있으나, 부모 인터페이스 변수에 대입되면 부모 인터페이스에 선언된 추상 메서드만 호출이 가능하다.
타입 변환
자동 타입 변환
자동 타입 변환은 의미 그대로 자동으로 타입 변환이 일어나는 것을 말한다.
자동 타입 변환은 다음과 같은 조건에서 일어난다.
부모 클래스가 인터페이스를 구현하고 있다면 자식 클래스도 인터페이스 타입으로 자동 타입 변환될 수 있다.
아래의 그림을 보면 인터페이스 A를 구현한 B, C 클래스가 있고, B를 상속한 D 클래스, C를 상속한 E 클래스가 있다.
B, C, D, E로 부터 생성된 객체는 모두 인터페이스 A로 자동 타입 변환될 수 있다. 모두 인터페이스 A를 직접 또는 간접적으로 구현하고 있기 때문이다.
강제 타입 변환
강제 타입 변환은 캐스팅 기호를 사용해서 인터페이스 타입을 구현 클래스 타입으로 변환시키는 것을 말한다.
구현 객체가 인터페이스 타입으로 자동 변환되면, 인터페이스에 선언된 메서드만 사용 가능하다.
RemoteControl 인터페이스에는 3개의 메서드, Television 클래스에는 5개의 메서드가 선언되어 있다면 RemoteControl 인터페이스로 호출 가능한 메서드는 3개뿐이다.
자동 타입 변환 후에 Television의 setTime()과, record() 메서드를 호출하고 싶다면 아래와 같이 캐스팅 기호를 사용해서 원래 Television으로 강제타입 변환해야 한다.
또 다른 예로, Vehicle 인터페이스를 구현한 Bus를 Vehicle로 자동 타입변환하면 checkFare() 메서드를 호출할 수 없지만, 강제 타입 변환해서 Bus로 변환하면 호출이 가능해진다.
다형성
필드의 다형성
자동차를 설계할 때 다음과 같이 필드 타입으로 타이어 인터페이스를 선언하면 필드값으로 한국 타이어 또는 금호 타이어 객체를 대입할 수 있다. 자동 타입 변환 때문이다.
Car 객체를 생성한 후 다른 구현 객체를 대입할 수도 있다. 이것이 타이어 교체에 해당된다.
tire1과 tire2 필드에 어떠한 타이어 구현 객체가 대입되어도 Car 객체는 타이어 인터페이스에 선언된 메서드만 사용하므로 전혀 문제가 되지 않는다.
매개변수의 다형성
메서드 호출 시 매개값을 다양화하기 위해 상속에서는 매개변수 타입을 부모 타입으로 선언하고 호출할 때에는 다양한 자식 객체를 대입할 수 있는데.
비슷한 원리로 매개변수 타입을 인터페이스로 선언하면 메서드 호출 시 다양한 구현 객체를 대입할 수 있다.
Vehicle 인터페이스가 아래와 같이 선언되었다고 가정해보자.
운전자 클래스인 Driver는 다양한 Vehicle 구현 객체를 운전하기 위해 Vehicle 인터페이스를 매개변수로 가지는 drive() 메서드를 아래와 같이 선언했다.
Bus가 Vehicle의 구현 클래스라면 아래와 같이 Driver의 drive() 메서드를 호출할 때 Bus 객체를 생성해서 매개값으로 줄 수 있다.
drive() 메소드를 호출할 때 인터페이스 Vehicle을 구현하는 어떠한 객체라도 매개값으로 줄 수 있는데, 어떤 객체를 주느냐에 따라 run() 메소드의 실행 결과는 다르게 나온다.
이유는 구현 객체에서 재정의된 run() 메소드의 실행 내용이 다르기 때문이다. 이것이 매개변수의 다형성이다.
'Language > Java' 카테고리의 다른 글
[JAVA] 익명 객체(Anonymous Object) (0) | 2023.01.13 |
---|---|
[JAVA] 중첩 클래스(Nested Class) (0) | 2023.01.12 |
[JAVA] 인터페이스(Interface) (0) | 2023.01.10 |
[JAVA] 추상 클래스(Abstract Class), 추상 메소드(Abstract Method) (0) | 2023.01.09 |
[JAVA] 상속 - 타입 변환과 다형성(매우 중요) (0) | 2023.01.08 |