본문 바로가기
학습/JAVA

7. 상속(Inheritance) (강제타입 변환, instanceof, 추상(abstract)클래스

by Elfen Lied 2022. 10. 17.
반응형

- 강제타입 변환

  • 상위 타입 객체를 하위타입 객체로 변환하는 것
  • 언제나 상위타입을 하위타입으로 강제 변환할 수 있는 것은 아니다.
  • 상위타입으로 생성된 객체를 하위타입으로 강제 타입 변환 할 수 없다.
    • 이경우 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 키워드를 사용할 수 없다. 실체클래스에서 추상클래스를 상속받아 추상 메소드의 오버라이딩을 강제하고 있다. 상속을 허용하지 않는다면 추상클래스의 존재자체가 무의 미해지기 때문이다.
  • 여기서 언급한 특징을 제외하면 일반클래스와 작성법이 같다.
    • 인스턴스 필드, 스태틱 필드, 상수
    • 생성자, 스태틱 블록
    • 비정적메소드, 정적메소드
    • 인터페이스 구현, 일반클래스 또는 추상클래스 상속
반응형

댓글