다형성
객체지향 프로그래밍의 3대 특징 중 하나로
'여러 개의 형태를 갖는다'는 의미
하나의 행동으로 여러가지 일을 수행하는 개념
상속을 이용한 기술로 부모 타입으로 부터 파생된 여러가지 타입의 자식 객체를
부모 클래스 타입하나로 다룰 수 있는 기술
클래스 형변환
업 캐스팅(up Casting)
상속 관계의 있는 부모, 자식 클래스 간에 부모 타입의 참조형 변수가
모든 자식 타입의 객체 주소를 받을 수 있다.
//Sonata 클래스는Car 클래스의후손
Car c= newSonata();
//Sonata클래스형에서Car클래스형으로바뀜
다운 캐스팅(Down Casting)
자식 객체의 주소를 받은 부노 참조형 변수를 가지고 자식의 멤버를 참조해야 할 경우,
부모 클래스 타입의 참조형 변수를 자식 클래스 타입으로 형 변환하는 것
자동으로 처리 되지 않기 때문에 반드스 후손 타입 명시하여 형 변환.
//Sonata 클래스는Car 클래스의후손
Car c= newSonata();
((Sonata)c).moveSonata();
instanceof 연산자
현재 참조형 변수가 어떤 클래스 형의 객체 주소를 참조하고 있는지 확인 할 때 사용
클래스타입 이 맞으면 true, 아니면 false 반환
표현식
if(레퍼런스 instanceof 클래스 타입) {
//true일때 처리할 내용, 해당클래스타입으로down casting
}
if(c instanceof Sonata) {
((Sonata)c).moveSonata();
} else if(c instanceof Avante){
((Avante)c).moveAvante();
} else if(c instanceof Grandure){
((Grandure)c).moveGrandure();
}
객체배열과 다형성
다형성을 이용하여 상속 관계가 있는 하나의 부모 클래스 타입의 배열 공간에
여러 종류의 자식 클래스 객체 저장 가능
Car[] carArr= newCar[5];
carArr[0] = newSonata();
carArr[1] = newAvante();
carArr[2] = newGrandure();
carArr[3] = newSpark();
carArr[4] = newMorning();
매개변수와 다형성
다형성을 이용하여 메소드 호출시 부모타입의 변수 하나만 사용해 자식타입을 객체를 받을 수 있음
public void execute() {
driveCar(new Sonata());
driveCar(new Avante());
driveCar(new Grandure());
}
public void driveCar(Car c) {}
바인딩 : 실제 실행할 메소드 코드와 호출하는 코드를 연결 시키는 는것
프로그램이 실행되기 전 컴파일이 되면서 모든 메소드 정적 바인딩 됨
동적 바인딩 : 컴파일시 정적 바인딩된 메소드를 실행할 당시의 객체 타입을 기준으로 바인딩 되는 것
성립 요건 : 상속 관계로 이루어져 다형성이 적용된 경우, 메소드 오버라이딩이 되어 있으면
정적으로 바인딩 된 메소드 코드보다 오버라이딩 된 메소드코드를 우선적으로 수행
추상 클래스 abstract class
몸체 없는 메소드를 포함한 클래스
추상 클래스일 경우 클래스 선언부에 abstract 키워드 사용
추상 메소드 abstract method
몸체 없는 메소드
추상 메소드 선언부에 abstract 키워드 사용
상속시 반드시 구현해야 하는 오버라이딩이 강제화 되는 메소드
특징
1. 미완성클래스(abstract 키워드사용)
자체적으로 객체 생성 불가→ 반드시 상속하여 객체생성
2. abstract 메소드가 포함된 클래스는 반드시 abstract 클래스
abstract 메소드가 없어도 abstract 클래스 선언 가능
3. 클래스내에 일반변수, 메소드 포함가능
4. 객체생성은 안되지만 참조형 변수 타입으로는 사용가능
장점
일관된 인터페이스 제공
꼭 필요한 기능 강제화(공통적이나 자식 클래스에서 특수화 되는 기능)
인터페이스
상수형 필드와 추상 메소드만 작성할 수 있는 추상 클래스의 변형체
메소드의 통일성을 부여하기 위해 추상 메소드만 따로 모아놓은 것으로
상속시 인터페이스 내의 정의된 모든 추상 메소드를 구현해야 함.
[접근제한자] interface 인터페이스명{
//상수도 멤버로 포함 할 수 있음
public static final 자료형 변수명= 초기값;
//추상 메소드만 선언 가능
[public abstract] 반환자료형 메소드명([자료형 매개변수]);
//public abstract가 생략 되기 때문에
//오버라이딩시 반드시 public 표기 해야함
}
장점
상위 타입 역할로 다형성 지원하여 연결
해당 객체가 다양한 기능 제공시에도 인터페이스에 해당하는 기능만 사용하게 제한 기능
공통 기능상의 일관성 제공
공동 작업을 위한 인터페이스 제공
추상 vs 인터페이스
구분 | 추상 클래스 | 인터페이스 |
상속 | 단일 상속 | 다중상속 |
구현 | extends 상용 | implements 사용 |
추상 메소드 | abstract 메소드 0 개 이상 | 모든 메소드는 abstract |
abstract | 명시적 사용 | 묵시적 abstract |
객체 | 객체 생성 불가 | 객체 생성 불가 |
용도 | 참조 타입 | 참조 타입 |
'자바 한계단' 카테고리의 다른 글
자바 Iterator, Enumeration 인터페이스 (0) | 2021.12.26 |
---|---|
Map 컬렉션 - HasMap, Hashtable (0) | 2021.12.08 |
상속 Inherit (0) | 2021.10.17 |
자바 객체배열 복습 (0) | 2021.10.01 |
자바 MVC 패턴 (0) | 2021.10.01 |