다형성
- 조상타입 참조변수로 자손타입 객체를 다루는 것
Tv t = new SmartTv();
//조상타입 //자손타입
참조변수의 형변환
- 리모컨 바꾸기 : 사용할 수 있는 멤버의 갯수 조절
- 조상 자손 관계의 참조 변수는 서로 형변환 가능
- 조상타입의 참조변수로 자손타입의 인스턴스를 참조 할 수 있지만,
반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.(리모컨의 버튼 갯수가 부족해진다.)
instanceof
- 참조변수가 참조하는 인스턴스의 타입을 검사하는 연산자
참조변수 instanceof 클래스명
인터페이스
- 추상 메서드의 집합
- 구현된 것이 전혀 없는 설계도, 껍데기
- 여러 프로그램에서 사용할 멤버(필드, 메서드)를 일관되게 하기 위한 기술 명세
인터페이스 작성
- 'class' 대신 'interface'를 사용한다는 것 외에 클래스 작성과 동일하다.
interface 인터페이스이름{
public static final 타입 상수이름 = 값;
public abstract 메서드이름 (매개변수 목록);
}
- 하지만 구성요소(멤버)는 추상 메서드와 상수만 가능하다.
- 모든 멤버변수는 public static final 이여야한며, 이를 생략할 수 있다.
- 모든 메서드는 public abstract 이여야하고, 이를 생략 할 수 있다.
인터페이스 구현
- 인터페이스에 정의된 추상 메서드를 완성하는 것
class 클래스이름 implements 인터페이스이름{
//인터페이스에 정의된 추상메서드를 구현,오버라이딩 한다.
}
- 일부만 구현하는 경우, 클래스 앞에 abstract 붙여야함
abstract class Fighter implements Fightable{
public void move(int x, int y){/*구현*/}
}
- 상속과 구현이 동시에 가능하다
class Fighter extends Unit implement Fightable{ public void move(int x, int y){ //구현 }; public void attack(Unit u){ //구현 }; }
인터페이스의 상속
- 인터페이스의 조상은 인터페이스만 가능(Object 최고 조상 아님)
- 다중 상속 가능(추상메서드는 충돌해도 문제없음) <--> 클래스는 단일상속
- 기존 인터페이스에 추상메서드를 추가하고 싶을때 기존인터페이스를 상속받는 새 인터페이스를 작성
인터페이스와 추상메서드
- 공통점 : 추상메서드를 가지고 있다(미완성 설계도)
- 차이점 : 인터페이스는 iv를 가질 수 없다.
인터페이스를 이용한 다형성
- 다형성 : 조상타입 참조변수로 자손타입 객체를 다루는 것
Tv t = new SmartTv(); //조상타입 //자손타입
- 인터페이스 다형성 : 인터페이스타입 참조 변수로 자손타입 객체를 다루는 것
- 인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능
interface Fightable{ void move(int x, inty); void attack(Fightable f); }
- 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.자바 버전에 따른 인스턴스에 대한 변화
Fightable method(){ Fighter f = new Fighter(); return f; }
- Java7 까지
- Java8 부터
- 상수와 추상메서드 포함
- default 메서드 포함(Java 8)
- private 메서드 포함(Java 9)
- static 메서드 포함(Java 8)
- 여전히 인터페이스에는 인스턴스변수 선언 불가