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 타입에 클래스 변수를 받아서 연결할 수도 있습니다.
조금 빠르게 나가다보니 이해하기 어려운 부분이 있긴하네요!
그래도 열심히 해보겠습니다!!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'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 |