Home 참조자료형 형변환
Post
Cancel

참조자료형 형변환

✔️ 참조자료형 형변환 특징

  • 자식 객체를 부모 객체로 형변환은 가능
  • 부모 객체를 자식 객체로 형변환하는 것은 불가능

예제 코드

아래 예제에 example() 메소드에는 세가지 경우로 생성한 객체가 존재한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class Sample{
	public static void main(String[] args){
		Sample sample = new Sample();
        sample.example();
    }
    // 예제 실행 메소드
    public void example(){
        // 1. 부모타입 객체 - 부모 생성자
        Parent parent1 = new Parent();
        parent1.printByParent(); // 결과 : This str is from Parent

        // 2. 부모타입 객체 - 자식 생성자
        Parent parent2 = new Child();
        parent2.printByParent(); // 결과 : This str is from Parent with Overriding method

        // 3. 자식타입 객체 - 부모생성자(처럼 보이는 자식 생성자)
        Child child1 = (Child)parent2;
        child1.printByChild(); // 결과 : This str is from Child with Only child method
	}
}
// 부모 클래스
class Parent{
    // 변수
    String str = "Parent";

    // 메소드
    public void printByParent(){
        System.out.println("This str is from " + str);
    }
}
// 자식 클래스
class Child extends Parent{
    // 자식 클래스에 새로 선언한 메소드
    String str2 = "Child";

    // 오버라이딩 메소드
    public void printByParent(){
        System.out.println("This str is from " + str + " with Overrinding method");
    }
    // 자식 클래스에 새로 선언한 메소드
    public void printByChild(){
        System.out.println("This str is from " + str2 + " with Only child method");
    }
}

✔️ 부모 클래스 생성자로 부모타입의 객체를 생성한 경우

이런 경우는 자식 클래스에 어떠한 영향을 받지 않는다.


✔️ 자식 클래스 생성자로 부모타입 객체를 생선한 경우

이런 경우에 자식 클래스에서 부모 클래스로부터 상속받은 변수나 메소드만 호출할 수 있다.

즉, 자식 클래스에만 선언된 str2 변수나 printByChild() 메소드는 호출이 불가능하다.

1
2
Parent parent2 = new Child();
parent2.printByChild(); // 에러 발생(결국 부모타입이라)

또한 오버라이딩되어 자식 클래스에 재선언된 메소드나 변수는 오버라이딩된 상태로 호출된다.

이런 현상을 책에서는 폴리몰피즘(다형성)이라고 한다.


✔️ 자식타입 객체 - 부모생성자(처럼 보이는 자식 생성자)

자식 클래스 타입의 객체를 생성하는데 그 생성자를 자식생성자로 만든 부모타입의 객체로 만든 경우이다.

말이 많이 어렵지만 사실상 자식클래스 객체이지만 부모클래스 타입으로 보이는 객체로 이해하면 되겠다.

이 경우에 결국 실생성자의 출신이 어디냐를 본다면 자식클래스이지만 겉모습은 부모클래스를 타입으로 가지고 있기때문에 형변환을 통해 객체를 생성해줘야 한다.

1
Child child2 = parent2; // 에러발생(겉보기는 부모타입)

하지만 형변환을 통해 객체를 생성했다면 자식클래스의 변수와 메소드를 호출한다.

정리하자면

  • 결국 생성자에 따라 호출되는 변수나 메소드가 결정된다.
  • 그렇기에 오버라이딩된 변수나 메소드는 그 상태로 호출된다.
  • 자식 생성자로 만든 부모 객체는 겉으로는 부모의 형상을 띄기 때문에 이 객체를 이용해 자식 객체를 만들려면 형변환이 필요하다.
  • : 부모클래스 타입의 객체 / : 오버라이딩되었거나 부모객체로부터 상속된 변수와 메소드만 호출 가능


instanceof 예약어 추가 설명


참조자료형의 형변환을 하기 전에 형변환 가능 여부를 미리 파악하기 위해 사용되는 예약어로 boolean 값을 리턴한다.

  • 자식객체 instanceof 부모클래스 : 이 객체가 부모클래스를 대신할 수 있는가? -> return true
  • 부모객체 instanceof 자식클래스 : 이 객체가 자식클래스를 대신할 수 있는가? -> return false
This post is licensed under CC BY 4.0 by the author.