본문 바로가기
내가 공부하려고 올리는/자바

자바 - 클래스 타입변환

by 결딴력 2021. 9. 14.
반응형

#타입 변환

 

자바에서 데이터 타입은 타입 변환이 가능합니다.

타입 변환은 두 가지 종류가 있는데, 다음과 같습니다.

 

 

1. 자동 타입 변환

2. 강제 타입 변환

 

 

자동 타입 변환은 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생하고,

강제 타입 변환은 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장할 때 발생하며,

캐스팅 연산자 괄호()를 사용합니다.

 

 

 

#클래스 타입 변환

 

이러한 타입 변환은 기본 타입뿐만 아니라 클래스에서도 가능합니다.

클래스의 변환은 상속 관계에 있는 클래스에서 발생합니다.

 

클래스 타입 변환도 기본 타입과 마찬가지로, 자동 타입 변환과 강제 타입 변환으로 나뉩니다.

 

 

 

 

#클래스 자동 타입 변환

 

상속 관계에서 자식이 부모 타입으로 타입 변환하는 것을 클래스의 자동 타입 변환이라 합니다.

 

기본 형태는 다음과 같습니다.

 


부모 타입 변수 = 자식 타입;


 

 

자식 타입이 부모 타입으로 자동 변환된 이후에는 부모 클래스에 있는 필드와 메소드만 접근할 수 있습니다.

이때, 메소드가 자식 클래스에서 오버라이딩 됐을 경우 자식 클래스의 메소드가 대신 호출된다는 것을 주의해야 합니다.

 

 

 

다음 예제를 보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
package blog;
 
public class Parent {
    public void method1() {
        System.out.println("오버라이딩 안하는 부모메소드");
    }
    
    public void method2() {
        System.out.println("오버라이딩 하는 부모메소드");
    }
}
 
cs

 

다음과 같은 부모 클래스를 생성하고

 

1
2
3
4
5
6
7
8
9
10
11
12
13
package blog;
 
public class Child extends Parent {
    @Override
    public void method2() {
        System.out.println("자식클래스에서 오버라이딩 함");
    }
    
    public void method3() {
        System.out.println("자식 클래스에만 존재하는 메소드");
    }
}
 
cs

 

 

그런 부모 클래스를 상속받는 자식 클래스를 생성했습니다.

이때, 자식 클래스에서 부모 클래스의 method2를 오버라이딩 했고,

부모 클래스에는 없는 method3을 작성했습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package blog;
 
public class Run {
 
    public static void main(String[] args) {
        Child child = new Child(); //Child 객체 생성
        
        Parent parent = child; //자식을 부모로 자동 타입 변환
        parent.method1();
        parent.method2();
        // parent.method3(); 자식 클래스에만 있는 메소드라 실행되지 않는다.
        
        
    }
 
}
cs

 

 

이후 실행 클래스를 만들어, Child 객체를 생성했습니다.

생성한 객체를 부모 타입으로 자동 타입 변환한 후

메소드를 실행해보겠습니다.

 

 

결과가 어떻게 나올까요?

 

실행 클래스 실행 결과

 

 

결과는 위와 같습니다.

메소드 1은 부모 클래스에 있는 그대로 작동하고

메소드 2는 자식 클래스에서 오버라이딩 되어 자식 클래스의 메소드가 실행됩니다.

이때 메소드 3는 부모 클래스에는 존재하지 않기 때문에 자동 타입 변환 시 실행되지 않습니다.

 

그렇다면, 자식 클래스에 있는 메소드를 실행하려면 어떻게 해야 할까요?

 

 

 

#강제 타입 변환

 

자동 타입 변환과 반대로 부모 타입을 자식으로 변환하는 것을 강제 타입 변환이라고 합니다.

그렇다면 모든 부모 타입은 자식 타입으로 강제 타입 변환할 수 있을까요?

 

답은, NO입니다.

자식 타입이 부모 타입으로 자동 타입 변환되고 난 후 다시 자식 타입으로 타입 변환을 할 때만

강제 타입 변환이 가능합니다.

 

형태는 다음과 같습니다.

 


부모 타입 변수 = 자식 타입;

자식 타입 변수 = (자식 타입) 부모 타입;

 


 

앞선 Parent클래스와 Child 클래스를 예시로 타입 변환을 한다면, 다음과 같은 형태를 예시로 들 수 있습니다.

 


Parent parent = New Child();

Child child = (Child) Parent;


 

이런 강제 타입 변환은 앞선 질문인

 

그렇다면, 자식 클래스에 있는 메소드를 실행하려면 어떻게 해야 할까요?

 

 

에 대한 답변이 됩니다.

 

자식 클래스에서 선언된 필드와 메소드를 사용하기 위해 강제 타입 변환을 하는 것입니다.

 

 

 

앞서 제시한 실행 클래스를 다음과 같이 수정해보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package blog;
 
public class Run {
 
    public static void main(String[] args) {
 
        Parent parent = new Child(); //자식을 부모로 자동 타입 변환
        parent.method1();
        parent.method2();
        // parent.method3(); 자식 클래스에만 있는 메소드라 실행되지 않는다.
        
        Child child = (Child) parent; //강제 타입 변환
        child.method1();
        child.method2();
        child.method3();
        
    }
 
}
cs

 

다음과 같이 코드를 작성할 수 있으며, 결과는 다음과 같습니다.

 

 

실행 클래스 수정 후 결과

 

 

 

이러한 타입 변환은 자바의 특징인 '다형성' 구현을 위한 것입니다.

부모 클래스에 기본적인 필드값과 메소드를 선언하고, 자식 클래스에서 부모 클래스를 오버라이딩 한다면

실행 클래스에서 입맛에 맞게 다양한 결과 값을 출력할 수 있습니다.

 

반응형

댓글