이 글은 PC 버전 TISTORY에 최적화 되어있습니다.
서론
객체 형 변환의 기초
Parent parent = new Child( ); 이 연산에서 왼쪽 항과 오른쪽의 객체의 유형이 서로 다른 경우, 두 유형이 상속 관계에 있고 Parent가 Child의 상위 클래스 인 경우에만 형 변환이 일어나게 됩니다. 즉, 하위 클래스에서 상위 클래스로 할당하는 것은 가능하나, 그 반대의 경우는 강제 형 변환을 해주어야 가능합니다. 이 경우에는 오류가 발생할 수 있다. 그 이유는 위의 그림과 같이 Child는 Parent에서 확장하는 개념이기 때문에 상위 클래스에 하위 클래스를 할당하는 것은 문제가 없으나, 상위 클래스는 하위 클래스보다 좁은 범위의 개념이기 때문에 강제 형변환을 해주어야 하는 것입니다.
오버라이딩 된 메소드의 호출
Parent.java
public class Parent { public int age = 55; public String name = "황인수"; public void print(){ System.out.println("Parent method :" + age); System.out.println("Parent method : " + name); } }
Child.javapublic class Child extends Parent{ public int age = 20; public String name = "황혁진"; public void print(){ System.out.println("Child method :" + age); System.out.println("Child method :" + name); } }
public class Main { public static void main(String[] args) { Parent p = new Parent(); p.print(); System.out.println("부모의 나이 : "+ p.age); System.out.println("부모의 이름 : "+ p.name); } }
상위 클래스 객체에 상위 클래스의 인스턴스를 대입했으니, 당연히 상위 클래스의 변수와 메소드를 호출합니다.
public class Main { public static void main(String[] args) { Parent p = new Child(); p.print(); System.out.println("자식의 나이 : "+ p.age); System.out.println("자식의 이름 : "+ p.name); } }
public class Main { public static void main(String[] args) { Child c = (Child)new Parent(); c.print(); System.out.println("자식의 나이 : "+ c.age); System.out.println("자식의 이름 : "+ c.name); } }
하위 클래스의 객체에 상위 클래스의 인스턴스를 대입하려면 강제 형변환을 해줘야한다고 했습니다. 하지만 바로 하면 오류가 뜨게 됩니다.
public class Main { public static void main(String[] args) { Parent p = new Child(); Child c = (Child)p; c.print(); System.out.println("자식의 나이 : "+ c.age); System.out.println("자식의 이름 : "+ c.name); } }
public class Main { public static void main(String[] args) { Child c = new Child(); c.print(); System.out.println("자식의 나이 : "+ c.age); System.out.println("자식의 이름 : "+ c.name); } }
'Basic > Java' 카테고리의 다른 글
Java Enum 기본 (0) | 2019.11.27 |
---|---|
[JAVA] Garbage Collection의 기초 (4) | 2016.07.20 |
[JAVA] Static에 대하여 (0) | 2016.07.19 |
[JAVA] JVM의 메모리구조 (0) | 2016.07.19 |
[JAVA] 자바의 변수 (클래스 변수, 인스턴스 변수, 지역 변수) (6) | 2016.07.19 |
[JAVA] 절차지향언어와 객체지향언어 (0) | 2016.07.19 |