본문 바로가기

BackEnd/Java

[java] 이것이 자바다 ch07 상속3

728x90
반응형

1. 타입 변환

◎ 자동 타입 변환

   ▷ 자동적으로 타입 변환이 일어나는 것입니다.

   ▷ 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급합니다.

 

class A{
}

class B extends A{
}

class C extends A{
}

class D extends B{
}

class E extends C{
}

public class PromotionExample {
	public static void main(String[] args) {
		B b = new B();
		C c = new C();
		D d = new D();
		E e = new E();
		
		A a1 = b;
		A a2 = c;
		A a3 = d;
		A a4 = e;
		
		B b1 = d;
		C c1 = e;
		
//		B b3 = e;  // 컴파일 에러(상속 관계에 있지 않음)
//		C c2 = d;  // 컴파일 에러(상속 관계에 있지 않음)
	}
}

 

◎ Parent 부모 클래스
public class Parent {
	public void method1() {
		System.out.println("Parent-method1()");
	}

	public void method2() {
		System.out.println("Parent-method2()");
	}
}​


◎ Child 자식 클래스

public class Child extends Parent {
	@Override
	public void method2() {
		System.out.println("Child-method2()");
	}

	public void method3() {
		System.out.println("Child-method3()");
	}
}​​


◎ ChildExample 메인 클래스

public class ChildExample {
	public static void main(String[] args) {
		// 자식 개체 생성
		Child child = new Child();
		
		// 자동 타입 변화
		// child의 값을 parent에 대입
		// method2만 대입되고 3는 대입되지 않는다.
		// 사용 이유 : 자식에 대한 기능 제한을 걸어줄 때 사용
		Parent parent = child;
		
		parent.method1();    // Parent-method1
		parent.method2();    // Chlid-method2
//		parent.method3();    // 실행 불가
//		실행 불가 이유 : parent에는 method1, method2만 있기 때문
		
		child.method2();
		child.method3();
		
		Parent a = new Parent();
		
		a.method1();
		a.method2();
	}
}

//	출력 : 
//	Parent-method1()
//	Child-method2()
//	Child-method2()
//	Child-method3()
//	Parent-method1()
//	Parent-method2()​

 

 

◎ 강제 타입 변환

   ▷ 부모 타입은 자식 타입으로 자동 변환되지 않습니다. 대신 캐스팅 연산자로 강제 타입 변환 가능합니다.

   ▷ 자식 객체가 부모 타입으로 자동 변환하면 부모 타입에 선언된 필드와 메소드만 사용 가능합니다.

 

◎ Parent 부모 클래스
public class Parent {
	
	public String field1;
	
	public void method1() {
		System.out.println("Parent-method1()");
	}

	public void method2() {
		System.out.println("Parent-method2()");
	}
}​


◎ Child 자식 클래스

public class Child extends Parent {
	
	public String field2;

	public void method3() {
		System.out.println("Child-method3()");
	}
}

 

◎ ChildExample 메인 클래스

public class ChildExample {
	
	public static void main(String[] args) {
		
		// 부모 값만 사용할 수 있는 Child 주소 생성 
		Parent parent = new Child();
		
		parent.field1 = "data1";
		parent.method1();
		parent.method2();
		
//		부모 타입으로 변환 : field2와 method3가 없기 때문에 에러가 나타납니다.
//		parent.field2 = "data2";
//		parent.method3();		
				
		// 강제 타입 변환 
		// 부모 타입에 field2와 method3를 붙여서 타입 변환합니다.
		// Child child = new Child();와 동일합니다.
		Child child = (Child) parent;
		
		child.field2 = "data2";
		child.method3();
		child.field1 = "data1";
		child.method1();
		child.method2();
	}
}

//	출력 : 
//	Parent-method1()
//	Parent-method2()
//	Child-method3()
//	Parent-method1()
//	Parent-method2()​

 

 

2. 다형성

   ▷ 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질

   ▷  다형성을 구현하기 위해서는 자동 타입 변환과 메소드 재정의가 필요

 

◎ 필드 다형성

   ▷ 필드 타입은 동일하지만, 대입되는 객체가 달라져서 실행 결과가 다양하게 나올 수 있는 것

 

◎ Tire 클래스
public class Tire {
	public void roll() {
		System.out.println("회전합니다.");
	}
}​


◎ HankookTire 클래스

public class HankookTire extends Tire {
	@Override
	public void roll() {
		System.out.println("한국 타이어가 회전합니다.");
	}
}

 

 KumhoTire 클래스

public class KumhoTire extends Tire {
	@Override
	public void roll() {
		System.out.println("금호 타이어가 회전합니다.");
	}
}

 

◎ Car 클래스

public class Car {
	// Car 클래스에서  Tire Class 타입의 tire 참조 변수를 생성
	public Tire tire;
	
	public void run() {
		tire.roll();
	}
}


◎ CarExample  메인 클래스

public class CarExample {
	public static void main(String[] args) {
		// Car 객체 생성
		Car myCar = new Car();
		
		// Tire 객체 장착
		myCar.tire = new Tire();
		myCar.run();
		
		// HankookTire 객체 장착
		myCar.tire = new HankookTire();
		myCar.run();
			
		// KumhoTire 객체 장착
		myCar.tire = new KumhoTire();
		myCar.run();
	}
}

//	출력 :
//	회전합니다.
//	한국 타이어가 회전합니다.
//	금호 타이어가 회전합니다.​


참조 변수를 이용해서 해당 클래스의 인스턴스를 생성할 수도 있습니다.

 

◎ 매개변수 다형성

   ▷ 메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할 때 동일한 타입의 자식 객체를 제공할 수 있습니다.

   ▷ 어떤 자식 객체가 제공되는냐에 따라서 메소드의 실행 결과가 달라집니다.

 

◎ Vehicle 부모 클래스
public class Vehicle {
	public void run() {
		System.out.println("차량이 달립니다.");
	}
}​

 

◎ Bus 자식 클래스
public class Bus extends Vehicle {
	@Override
	public void run() {
		System.out.println("버스가 달립니다.");
	}
}​

 

◎ Taxi 자식 클래스
public class Taxi extends Vehicle {
	@Override
	public void run() {
		System.out.println("택시가 달립니다.");
	}
}​

 

◎ Driver 클래스
public class Driver {
	public void drive(Vehicle vehicle) {
		vehicle.run();
	}
}​

 

◎ DriverExample 클래스

public class DriverExample {
	
	public static void main(String[] args) {
		Driver driver = new Driver();
		
		// 매개 값으로 Bus 객체를 제공하고 driver() 메소드 호출
		Bus bus = new Bus();
		// driver.drive(new Bus());와 동일합니다.
		driver.drive(bus);

		Taxi taxi = new Taxi();
		driver.drive(taxi);
	}
}

//	출력 : 
//	버스가 달립니다.
//	택시가 달립니다.​​

 

타입 변환을 하면서 Class 타입에 클래스 변수를 받아서 연결할 수도 있습니다.

 

조금 빠르게 나가다보니 이해하기 어려운 부분이 있긴하네요!

 

그래도 열심히 해보겠습니다!!

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

728x90
반응형

'BackEnd > Java' 카테고리의 다른 글

[java] 인터페이스  (2) 2023.01.16
[java] 추상 클래스  (0) 2023.01.16
[java] 이것이 자바다 ch07 상속2  (0) 2023.01.13
[java] 이것이 자바다 ch07 상속  (2) 2023.01.12
[java] class  (1) 2023.01.12