다형성 구현 위해서 : 메소드 재정의와 타입 변환이 필요했다. (상속에서 배움)
인터페이스도 '메소드 재정의, 타입 변환' 기능이 제공되므로, 다형성 구현을 공부할 수 있다.
ㅡㅡㅡ
상속: 같은 종류의 하위 클래스를 만드는 기술
인터페이스: 사용 방법이 동일한 클래스를 만드는 기술
ㅡㅡㅡ
인터페이스의 다형성 -> 프로그램 소스 코드는 변함이 없다. 구현 객체만 교체함으로써 프로그램의 실행결과를 다양하게 만들 수 있다.
자동 타입 변환 + : 인터페이스 구현 클래스의 자식 객체도 인터페이스타입으로 자동타입변환 가능하다.
자동타입변환
ㅇ필드, 매개변수의 다형성을 구현할 수 있다.
ㅇ필드, 매개변수 타입을 인터페이스로 선언 --> 다양한 구현 객체를 대입해서 실행결과를 다양하게 할 수 있다.
필드 다형성 익히기
Car클래스에서는 인터페이스 타입 필드 선언 후 초기 구현객체를 대입했고,
Car실행클래스에서는 그 인터페이스 타입 필드에다가 다른 구현객체를 새로 대입했다.
매개변수의 다형성
자동타입 변환은! 인터페이스 타입 필드에 값 대입할 때 뿐만 아니라
주로 메소드를 호출할 때 많이 발생한다고 한다~~! 오~~~그래요??? >_<
인터페이스는 메소드의 매개 변수로 많이 등장한다
"매개변수의 다형성"을 배웁시다~~~~~>_<
예를 들면.. (상속에서 했던 자동타입변환 느낌이랑 쫌 많이 비슷하다!!)
drive() 라는 메소드에 인터페이스 Vehicle 타입을 매개 변수로 선언한 상태에서,
인터페이스 Vehicle을 구현한 Bus객체를 매개값으로 넣기 가능하다.
이 때, 자동 타입 변환이 발생한다.
ㄴ매개변수 타입이 인터페이스일 때, 어떠한 구현 객체도 매개값으로 자유롭게 사용 가능!!
ㄴ당연히 어떠 구현 객체가 제공되느냐에 따라 메소드 실행결과는 다양해진다.
<<매개변수의 다형성 익히기>>
구현객체가 인터페이스 타입으로 자동타입변환하면,
인터페이스에 선언된 멤버만 사용 가능한 제약이 있다.
인터페이스에 3개의 메소드가 있고, 구현클래스에는 5개의 메소드가 있을 때
인터페이스 타입으로 구현객체가 자동타입변환된다면
3개의메소드만 사용 가능하다.
하지만 구현클래스에 있는 클래스멤버를 사용하고 싶을 수도 있다!!
이럴 때 강제타입 변환을 쓴다. (상속에서 공부한 거랑 비슷한 맥락)
강제 타입변환
구현클래스 변수 = (구현클래스) 인터페이스변수;
<<강제타입변환하는 상황 익히기>>
자아~~ 강제타입 변환을 확인했으면
이제 모다???? (미소천사~~~>0<~~!)
객체타입 확인~~
저번에도 상속 배울 때
강제타입변환을 막 할 수 없으니까, 객체의 타입을 확인 먼저 하는게 필요했었다.
강제타입 변환은 구현 객체가 인터페이스 타입으로 변환되어 있는 상태에서 가능하다.
그치만 원래 어떤 객체가 변환되어있느냐에 따라서 캐스팅 후 사용 가능한 클래스 멤버의 종류가 다르기 때문에,
어떤 객체가 들어가 있는 것인지 확인하는 것이 중요하다.
<필드에서>
Vehicle vehicle = new Taxi();
Bus bus = (Bus) vehicle; )
>>ClassCastException 발생<<
<메소드의 매개변수에서>
public void drive(Vehicle vehicle) {
Bus bus = (Bus) vehicle;
bus.checkFare();
vehicle.run();
}
매개변수에 어떤 구현 객체가 지정될 지 모르는데 Bus로 강제타입변환하면
>>ClassCastException 발생 가능성 있음<<
네!!
상속에서 객체 타입을 확인하기 위해 instanceof 연산자를 사용했었다.
인터페이스에서도 이 instanceof 연산자를 통해 마찬가지로 어떤 구현 객체인지 그 타입을 확인할 수 있다.
예) Vehicle 인터페이스타입으로 변환된 객체가 Bus인지...확인해부쟝...
if(vehicle instanceof Bus) {
Bus bus = (Bus) vehicle;
}
맞음 캐스팅하구 아님 말라는 것!! 확인 먼저 하고 캐스팅 가능할 때 캐스팅 할 수 있다.
인터페이스 다중 상속
클래스와 달리
인터페이스는 또 다른 인터페이스를 상속할 수 있다.
상속 키워드 extends 키워드 뒤에 상속할 인터페이스들을 나열한다.
public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2 { ... } |
마찬가지로, 하위 인터페이스를 구현하는 클래스는 상위 인터페이스의 추상 메소드에 대한 실체 메소드를 가지고 있어야 한다.
구현 클래스로부터 객체를 생성한 후 --> 하위 or 상위 인터페이스 타입으로 변환 가능하다
하위인터페이스 변수 = new 구현클래스(...); 상위인터페이스1 변수 = new 구현클래스(...); 상위인터페이스2 변수 = new 구현클래스(...); |
주의!!
하위인터페이스로 타입변환 되었을 때 : 하위, 상위 인터페이스의 모든 메소드 사용 가능
상위인터페이스로 타입변환 되었을 때 : 상위 인터페이스에서 선언된 메소드만 사용가능!!!!
<<다중 인터페이스 상속 익히기>>
확인 문제
03.
생각보다 계획이 밀렸다.
이번주 계획은 완벽히 지키지 못했다.
챕터9는 내일 끝내고
작성한 학습포스팅을 보면서 지난 챕터들은다시 복습하자
'JAVA' 카테고리의 다른 글
[2주차] 기본미션 + 선택미션 [혼공단] [혼공자] (0) | 2020.07.14 |
---|---|
[혼자 공부하는 자바] 7/13 9-1 [중첩 클래스와 중첩 인터페이스] (0) | 2020.07.13 |
[혼자 공부하는 자바] 7/11 8-1 [인터페이스] [추상 메소드] [실체 메소드] (0) | 2020.07.11 |
[혼자 공부하는 자바] 7/11 07-3 [추상 클래스] [실체 클래스] [메소드 재정의] (0) | 2020.07.11 |
[혼자 공부하는 자바] 7/10 07-2 [타입 변환과 다형성] [자동 타입 변환] [강제 타입 변환] (0) | 2020.07.11 |