Basic/Java

[JAVA] 객체(Object)의 형 변환

에반황 2016. 7. 19. 07:48


이 글은 PC 버전 TISTORY에 최적화 되어있습니다.


서론

쉽게 이해할 수 있는 기본형(Primitive type) 데이터들의 형 변환처럼 객체 참조형(Object reference type)의 경우에도 형 변환이 이루어집니다. 서로 다른 클래스로부터 나온 인스턴스들의 형 변환의 규칙에 대해 공부해 보겠습니다.



객체 형 변환의 기초

 




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.java

public 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); } }


이또한 당연한 결과로 설명을 생략하도록 하겠습니다.







반응형