객체 지향 프로그래밍 - 상속
타입 변환
한모로그
2023. 1. 18. 21:05
자동 타입 변환
- 자동적으로 타입 변환이 일어나는 것
출처, 이것이 자바다
- 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급
출처, 이것이 자바다
package ch07.sec07.exam01;
//상속관계 구성
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(); // B의 부모 A
C c = new C(); // C의 부모 A
D d = new D(); // D의 부모 B
E e = new E(); // E의 부모 C
//자동형변환. 부모클래스 변수 = (부모클래스)자식객체
A a1 = b; // A a1 = (A)b;
A a2 = c;
A a3 = d;
A a4 = e;
B b1 = d;
C c1 = e;
/*
상속및 형변환은 직계에 한해서이다.
B b3 = e;
C c2 = d;
*/
}
}
package ch07.sec07.exam02;
//부모클래스
public class Parent {
//메소드 선언
public void method1() {
System.out.println("Parent-method1()");
}
public void method2() {
System.out.println("Parent-method2()");
}
}
package ch07.sec07.exam02;
//자식클래스
public class Child extends Parent {
//메소드 오버라이딩
@Override
public void method2() {
System.out.println("Child-method2()");
}
//메소드 선언
public void method3() {
System.out.println("Child-method3()");
}
}
package ch07.sec07.exam02;
public class ChildExample {
public static void main(String[] args) {
//자식객체 생성 : 힙영역 Parent, Child클래스 내용을 가지고 각각 메모리 생성
Child child = new Child();
//child 객체로 접근가능 한 것은?
//child.method1() : Parent , child.method2() : Child(재정의), child.method3() : Child(추가)
child.method1(); //부모 Parent
child.method2(); //자식 재정의
child.method3(); //자식 추가
System.out.println("===부모클래스 형변환 전후===");
//자동타입변환. 부모클래스변수 = 자식객체;
Parent parent = child; //호출하는 대상이 부모클래스의 멤버로 한정 재정의는 자식클래스로 한정됨
//메소드 호출
parent.method1(); //Parent클래스
parent.method2(); //Child클래스
//parent.method3(); 호출 불가능, Child클래스 method3()
}
}
강제 타입 변환
- 부모 타입은 자식 타입으로 자동 변환되지 않음. 대신 캐스팅 연산자로 강제 타입 변환 가능
출처, 이것이 자바다
- 자식 객체가 부모 타입으로 자동 변환하면 부모 타입에 선언된 필드와 메소드만 사용 가능
출처, 이것이 자바다
package ch07.sec07.exam03;
//부모클래스
public class Parent {
//필드 선언
public String field1;
//메소드 선언
public void method1() {
System.out.println("Parent-method1()");
}
public void method2() {
System.out.println("Parent-method2()");
}
}
package ch07.sec07.exam03;
//자식클래스
public class Child extends Parent {
//필드 선언
public String field2;
//메소드 선언
public void method3() {
System.out.println("Child-method3()");
}
}
package ch07.sec07.exam03;
public class ChildExample {
public static void main(String[] args) {
//1)객체 생성및 자동타입변환, 부모클래스 변수 = 자식객체;
/*
Child child = new Child();
Parent parent = child;
*/
Parent parent = new Child();
parent.field1 = "data1";
parent.method1();
parent.method2();
/*
부모로 자동 형변환인 경우는 자식클래스의 멤버는 호출불가능(단, 재정의 메소드만 가능)
parent.field2 = "data2"; //호출 불가능
parent.method2(); //호출 불가능
*/
//2)강제타입변환. Parent parent = new Child(); 이 구문이 앞에서 존재하는 전제조건.
Child child = (Child) parent;
//child객체로 Parent, Child 클래스의 모든멤버 호출가능
child.field2 = "data2";
child.method3();
}
}