반응형
- 강제타입 변환
- 상위 타입 객체를 하위타입 객체로 변환하는 것
- 언제나 상위타입을 하위타입으로 강제 변환할 수 있는 것은 아니다.
- 상위타입으로 생성된 객체를 하위타입으로 강제 타입 변환 할 수 없다.
- 이경우 ClassCastException이 발생한다
public class Phone {
String number;
public void makeAphoneCall() {
System.out.println("전화를 겁니다.");
}
}
===========================================
public class SmartPhone extends Phone{
// IsA 관계
// 스마트폰은 폰이다.
// 스마트폰은 폰의 한 종류이다.
String[] apps = {"유튜브", "플레이스토어", "카카오톡"};
public void playApp(String name) {
for(String app : apps) {
if(app.equals(name)) {
System.out.println(app + " 앱 실행");
}
}
}
}
===========================================
public class PhoneMain {
public static void main(String[] args) {
// Phone ph1 = new Phone();
// SmartPhone sm1 = (SmartPhone) ph1;
// 하위타입 객체로 생성되고
// 상위타입 참조변수에 할당 되면서 상위타입으로
// 자동 타입 변화 되었다.
Phone ph2 = new SmartPhone();
// 이 경우 상위타입 필드와 메소드만 사용 가능
ph2.makeAphoneCall();
// 하위타입으로 강제 타입 변환
SmartPhone sm2 = (SmartPhone) ph2;
System.out.println(sm2.apps[0]); // 하위타입 필드 사용가능
sm2.playApp("유튜브"); // 하위타입의 메소드 호출가능
}
}
- 객체 타입 확인 (instanceof)
public class instanceOfExample {
public static void main(String[] args) {
Apple apple = new Apple();
Orange orange = new Orange();
Banana banana = new Banana();
checkFruitType(apple);
checkFruitType(orange);
checkFruitType(banana);
}
private static void checkFruitType(Fruit fruit) {
if(fruit instanceof Apple) {
System.out.println("사과 객체");
} else if(fruit instanceof Orange) {
System.out.println("오렌지 객체");
} else if(fruit instanceof Banana) {
System.out.println("바나나 객체");
} else {
System.out.println("알수 없는 객체");
}
}
}
class Fruit{}
class Apple extends Fruit{}
class Orange extends Fruit{}
class Banana extends Fruit{}
- 추상 클래스(Abstract Class)
- 실체클래스의 공통부분을 뽑아내는 과정이다.
- 메소드의 선언부까지 공통부분이 된다. (추상메소드)
- 추상클래스 특징
- 클래스 선언부에 abstract 키워드가 있다.
- new 연산자를 통한 객체 생성이 불가능하다. 그러나 생성자를 선언할 수 있다.
- 추상 메소드가 존재할 수 있다.(추상 메소드가 필수적인 것은 아니다.)
- 정적 추상 메소드 존재하지 않는다. 따라서 추상 메소드는 모두 비정적 메소드이다.
- final 키워드를 사용할 수 없다. 실체클래스에서 추상클래스를 상속받아 추상 메소드의 오버라이딩을 강제하고 있다. 상속을 허용하지 않는다면 추상클래스의 존재자체가 무의 미해지기 때문이다.
- 여기서 언급한 특징을 제외하면 일반클래스와 작성법이 같다.
- 인스턴스 필드, 스태틱 필드, 상수
- 생성자, 스태틱 블록
- 비정적메소드, 정적메소드
- 인터페이스 구현, 일반클래스 또는 추상클래스 상속
반응형
'학습 > JAVA' 카테고리의 다른 글
9. 중첩 클래스와 중첩 인터페이스 (0) | 2022.10.24 |
---|---|
8. 인터페이스 (0) | 2022.10.17 |
7. 상속(Inheritance) (Override 불가, 다형성, List<E>) (0) | 2022.10.12 |
7. 상속(Inheritance) (Override, Annotation, toString()) (1) | 2022.10.11 |
7. 상속(Inheritance) (상속, 부모 생성자 호출 super()) (0) | 2022.10.11 |
댓글