728x90
1. 자동 타입 변환이 일어나는 경우
부모타입 변수 = 자식타입 객체
1-1. IS-A관계
자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다. 예를 들어 고양이가 동물의 특징과 기능을 상속받았다면 고양이는 동물이다 가 성립된다
Cat cat = new Cat();
Animal animal = cat; // 부모타입으로 캐스팅
Animal animal = new Cat(); // 줄여쓰기
Animal과 Cat 객체는 변수명만 다를 뿐 같은 Cat 객체를 가리킨다
cat == animal // true
1-2. 자식 멤버 호출 불가능
부모타입으로 자동 형변환이 이루어진 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다. 변수는 자식객체를 참조하지만 변수로 접근 가능한 멤버는 부모 클래스 멤버로 한정된다. 그러나 자식 클래스에서 오버라이딩된 메소드가 있다면 부모 메소드 대신 오버라이딩 된 메소드가 호출된다
public class Parent {
public void method1(){
System.out.println("부모메소드 1");
}
public void method2(){
System.out.println("부모메소드 2");
}
}
public class Child extends Parent{
@Override
public void method2() {
System.out.println("자식 메소드 2");
}
public void method3(){
System.out.println("자식 메소드 3");
}
}
public class Main {
public static void main(String[] args) {
Parent parent = new Parent();
parent.method1();
parent.method2();
parent.method3(); // 호출불가
}
}
2. 강제 형변환
자식타입은 부모타입으로 자동 변환되지만 반대로 부모타입은 자식타입으로 자동 변환되지 않는다. 대신 다음과 같이 캐스팅 연산자로 강제 타입 변환을 할 수 있다.
Parent parent = new Child(); // 자동 타입 변환(업캐스팅)
Child child = (Child) parent; // 강제 타입 변환(다운캐스팅)
자식 객체가 부모타입으로 자동 변환하면 부모 타입에 선완된 필드와 메소드만 사용 가능하다는 제약사항이 따른다. 만약 자식 타입에 선언된 필드와 메소들를 꼭 사용해야 한다면 강제 타입 변환을해서 다시 자식 타입으로 변환해야 한다
public class Main {
public static void main(String[] args) {
Parent parent = new Child();
// 부모 타입으로 필드와 메소드 사용
parent.field1 = "data1";
parent.method1();
parent.method2();
parent.field2(); // 불가능
parent.method3(); // 불가능
Child child = (Child) parent; // 강제 타입 변환
child.field2 = "data2";
child.method3();
}
}
반응형
'IT 연구소' 카테고리의 다른 글
참조형과 기본형 메모리 저장에 대하여 (0) | 2023.08.26 |
---|---|
다형성 (0) | 2023.08.15 |
중첩 인터페이스 (0) | 2023.08.06 |
인터페이스의 장점 (0) | 2023.08.06 |
숫자를 문자로 형변환 하는 세가지 방법 (0) | 2023.07.04 |